質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

1回答

1149閲覧

GAS チェックボックスにチェックを入れた際に特定条件でフィルターの絞り込みをしたい

yudai1111

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2022/12/09 07:01

編集2022/12/09 07:14

前提

GASでスクリプトを作成しています。
操作をしたいシートには、複数の数値が入った表があり、照合して数値が合致したら別の列で「1」を表示させる関数を入力してあります。
尚、合致しない場合は「0」を出力するようになっています。

いろいろなサイトのサンプルコードを混ぜてしまっているので、ぐちゃぐちゃかと思います。申し訳ないです。
尚、SheetsAPIというものを使用しています。(これもよくわかっていません)

実現したいこと

概要としては、「印刷用チェック」のような形でチェックボックスを配置しておき、チェックボックスにチェックを入れると不要な「0」の行をフィルターで絞り込んで非表示にしたいです。
尚、チェックを外した際には絞り込む前に戻したいです。

①同じシート上のチェックボックスにチェックを入れる
②「0」行が非表示になり、「1」行のみが表示される
③チェックを外すと、もとに戻る

発生している問題・エラーメッセージ

特になし

該当のソースコード

GAS

1function myFunction() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const rng = ss.getActiveCell(); 4 const flag = rng.getValue(); 5 const filterSet = {};//FilterSet 6 const columnIndex =9; 7 const request = { 8 "setBasicFilter": { 9 "filter": filterSet 10 } 11 }; 12 filterSet.range = { 13 sheetId:ss.getSheetId() 14 }; 15 16 filterSet.criteria = {}; 17 18 filterSet['criteria'][columnIndex]={ 19 'hiddenValues':["0"] 20 }; 21 22 if(rng.getColumn() ==11 && flag == true){ //チェックボックスにチェックを入れた(true)の場合、SheetsAPIでフィルターをかける                  23 Sheets.Spreadsheets.batchUpdate({'requests':[request]},ss.getId()); 24 25 } else if (rng.getColumn() ==11 && flag == false) {//チェックボックスからチェックを外した(false)の場合、フィルターを削除して再作成する 26 ss.getFilter().remove(); 27 ss.getRange(1,1,ss.getLastRow(),ss.getLastColumn()).createFilter(); 28 }; 29}

試したこと

①チェックボックスを入れるとメッセージボックスが表示される
②スクリプトを実行するとフィルターで絞り込まれる

という点はバラバラのスクリプトで再現しています。
このつなぎ合わせが難しく、教えていただきたいです。

尚、シート上にボタンを2つ配置して「絞り込み」と「絞り込み解除」の対応をすることは考えましたが、
スマートじゃないなと思い実装していません。
難しい場合はボタンで対応したいと思っています。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

個人的にはボタンが2つになっても、その方がスマートだと思います。
理由は後述します。
まずは完成コード例をどうぞ。

コード例

イメージ説明
イメージ説明

javascript

1function filterOne(e) { 2 // 現在のシートを取得 3 const sheet = e.source.getActiveSheet(); 4 // 編集されたセル範囲を取得 5 const range = e.range 6 // セルの名称を取得 7 const cell = range.getA1Notation(); 8 9 // チェックボックスのセルじゃなかったら、ここで処理を終了(以降の行は実行されない) 10 if (cell !== 'A1') return; 11 12 // フィルターを取得 13 const filter = sheet.getFilter(); 14 15 // チェックボックスにチェックが入っている場合 16 if (range.getValue()) { 17 // 指定の列の値が「0」の行を隠すフィルター 18 const criteria = SpreadsheetApp.newFilterCriteria() 19 .setHiddenValues([0]) 20 .build(); 21 filter.setColumnFilterCriteria(2, criteria); 22 23 // チェックボックスのチェックが外された場合 24 } else { 25 // 指定の列のフィルターを解除する 26 filter.removeColumnFilterCriteria(2); 27 } 28}

↑の関数をトリガーのonEditに設定してください。

↑のコードの問題点

1つのスプレッドシートに複数のシートが存在し、この絞り込み機能を用いたいシートとそうでないシートの両方が存在する場合、
絞り込みをしないシートでもこのコードが動いてしまうため、無駄に処理が走ってしまいますし、裏側でエラーが発生します。

エラーを回避するには編集したシートが対象のシートか照合し、合致しない場合は絞り込みをしないという処理をかけばいいのですが、いずれにせよ全ての編集作業に対して無駄に処理が走っていることには変わりません。

ボタンにすれば、ボタンを押した時にしか処理が走りませんし、ボタンを押したシートでしか絞り込みは行いませんから、無駄がなくスマートです。

onEdit(e)を使用するためチェックボックスと全く関係のないセル、全く関係のないシートだとしても、編集するたびに毎回処理が実行される無駄の多い処理方法だと思います。


①チェックボックスを入れるとメッセージボックスが表示される
②スクリプトを実行するとフィルターで絞り込まれる
という点はバラバラのスクリプトで再現しています。
このつなぎ合わせが難しく、教えていただきたいです。

①のコードを提示してください。
また①によってどういう処理をされたいのか具体的に提示してください。

「実現したいこと」には「チェックボックスのつけはずしによるフィルターのON/OFF」についてしか触れられていませんが、「試したこと」に書かれている上記の①の内容も実現したいことでしょうか?

投稿2022/12/09 09:00

編集2022/12/09 09:20
Cocode

総合スコア2314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yudai1111

2022/12/13 06:12

ご丁寧に回答いただきありがとうございます。 ご提示いただいた懸念点の通り、複数のシートが存在していて、処理をかけないシートも混在しています。 本件についてはボタンでの絞り込み、絞込込み解除で対応していきたいと思います。 ①のコードに関しましては下記です。 とあるサイトのコードをそのまま転用したものになります。 ▼参考にしたサイト https://zumilog.org/checkbox_gas/#%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B ```GAS function myfunction() { // スプレッドシートを取得 const ss = SpreadsheetApp.getActiveSpreadsheet(); // シートを取得 const sheet = ss.getActiveSheet(); // セル(A2:B4)を取得 const range = sheet.getRange('A2:B4'); // 値を取得 const values = range.getValues(); let checkvalue = ''; for( let i = 0; i < values.length; i++ ) { if( values[i][0] === true ) { checkvalue = checkvalue + values[i][1]; } } Browser.msgBox(checkvalue + 'が選択されました', ); } ``` なお、「試したこと」の①におけるメッセージボックスの表示は不要です。 単に絞り込みと絞り込み解除が目的です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問