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

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

新規登録して質問してみよう
ただいま回答率
85.36%
Google Apps Script

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

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

Q&A

解決済

2回答

4414閲覧

gas チェックボックスで列 (複数列)を表示非表示

raaarta

総合スコア43

Google Apps Script

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

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

0グッド

0クリップ

投稿2021/08/19 12:19

gasのcheckboxでカラムの表示非表示を制御したいと思っています。
web検索したところ、行・レコードを制御する方法がありました。行とはいえ、かなりドンピシャです。流して、実際にOKでした。
リンク内容

で、これを参考に列版を作成したいと思いましたが、この関数には初期化処理があります。
元のプログラムは行の表示非表示制御なので、対象Rowを全て非表示にする関数があります。
この処理を列化させることができませんでした。

hideRowsから、hideColumnsにしようと思っても、hideCまで書いてhideColumnsがサジェスチョンされてきません。
実際に実行するとやはりエラーになります。
↓↓↓↓エラーになる、の図
イメージ説明

すいませんがcheckboxでの列制御、ご協力をお願いします。

なおググるとこちらにてonEdit(e)を利用してのやり方がありますが、そうではなく関数作成+それをトリガーに設定、という方法でお願いします。
onEdit(e)内で表示非表示の情報URL
リンク内容

こちらのシートを公開します。(しばらく経ったらクローズします。)
コピペの元になれば幸いです。
グループAのチェックボックス(セル番地B1)がオンのときのみ、COL C,Dが表示される、というイメージです。
!イメージ説明明](308e31851e3ba82c4e580e16be999b4a.png)
公開URL
リンク内容

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

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

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

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

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

guest

回答2

0

qnoirさま
できました!!バッチリです。ほんとコピペでできました、すいませんです、ありがとうございます。

またこの記事を読まれた方、トリガー設定にご注意ください。
関数は"chageEvent"です。checkBoxEventではありません。
またイベントの種類も”変更時”です。”編集”ではないです。

A,Bだけをチェックオンの画像をつけておきます。
イメージ説明

投稿2021/08/19 14:18

raaarta

総合スコア43

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

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

0

ベストアンサー

全体は以下になります。
一部変数名を適切な名前に変えてあります(row -> column)。

js

1var CHECKBOX_COLUMN = 2; // チェックボックスの列 2var CHECKBOX_COUNT = 3; // チェックボックスの数 3 4// 何列目から消すのか 5var HIDDEN_FIELD_START = 3; 6 7// 何列目まで消すのか 8var HIDDEN_FIELD_END = 8; 9 10// 非表示・表示の基準となるラベルが入力されている行 11var LABEL_ROW = 5; 12 13// スプレッドシートの値が変更された時に発火 14function changeEvent() { 15 var sheet = SpreadsheetApp.getActiveSheet(); 16 var activeCell = sheet.getActiveCell(); 17 if (activeCell.getColumn() == CHECKBOX_COLUMN && activeCell.getRow() <= CHECKBOX_COUNT){ // チェックボックス範囲の値が変更された場合 18 checkBoxEvent(sheet); 19 } 20} 21 22// チェックボックスのチェック状態に合わせて表示・非表示を切り替える 23function checkBoxEvent(sheet) { 24 25 var cols_checkbox = sheet.getRange(1, CHECKBOX_COLUMN, CHECKBOX_COUNT, 1).getValues(); 26 //一旦全部非表示にする 27 hiddenFields(sheet); 28 var dataColumns = sheet.getRange(LABEL_ROW, HIDDEN_FIELD_START, 1, HIDDEN_FIELD_END - HIDDEN_FIELD_START + 1).getValues()[0]; 29 for (var i = 0; i < cols_checkbox.length; i++) { 30 if (cols_checkbox[i][0] === true) { // チェックが付いている場合、 31 //チェックボックスのラベル(グループ~~)を取得 32 var showColumn = sheet.getRange(i + 1, CHECKBOX_COLUMN - 1).getValue(); 33 for (var j = 0; j < dataColumns.length; j++) { 34 var targetColumn = j + HIDDEN_FIELD_START; 35 if (dataColumns[j] == showColumn) { 36 sheet.showColumns(targetColumn); // チェックボックスの1個左のセルの値と一致する行数を表示する 37 } 38 } 39 } 40 } 41} 42 43// 表示列エリアを全列非表示にする 44function hiddenFields(sheet) { 45 sheet.hideColumns(HIDDEN_FIELD_START, HIDDEN_FIELD_END - HIDDEN_FIELD_START + 1); 46}

解説

まず、元記事の行バージョンのコードでは1列目(「肉・野菜・魚」)をグループ表示・非表示の基準ラベルにしていました。
今回の修正バージョンは5行目で判断するので、その行番号をあらかじめ設定しておきます。

js

1// 非表示・表示の基準となるラベルが入力されている行 2var LABEL_ROW = 5;

そして、下のコードの部分で、5行目のラベルデータを取得しています。
ラベルデータは1行だけでよいため、最後に[0]としています。
(もし[0]がないと、dataColumnsが [[グループA、グループB...]] のような2次元配列になってしまい
以降のコードを手直しする必要が出てしまいます)
取得する行と列、getRange関数の引数の関係に注意しましょう。

js

1 var dataColumns = sheet.getRange(LABEL_ROW, HIDDEN_FIELD_START, 1, HIDDEN_FIELD_END - HIDDEN_FIELD_START + 1).getValues()[0];

 

初期化部分は、hideRows()の代わりにhideColumns()を使用します。
hideColumnsの引数は、元記事のコードから変える必要はありません。

// 表示列エリアを全列非表示にする function hiddenFields(sheet) { sheet.hideColumns(HIDDEN_FIELD_START, HIDDEN_FIELD_END - HIDDEN_FIELD_START + 1); }

初期化不要のバージョンも書いてみました。表示がワンテンポ速くなると思います。

js

1function checkBoxEvent(sheet) { 2 const checked = sheet.getRange(1, CHECKBOX_COLUMN - 1, CHECKBOX_COUNT, 2).getValues().filter(e => e[1]).map(e => e[0]); 3 const dataColumns = sheet.getRange(LABEL_ROW, HIDDEN_FIELD_START, 1, HIDDEN_FIELD_END - HIDDEN_FIELD_START + 1).getValues()[0]; 4 dataColumns.forEach((e, idx) => { 5 if (checked.indexOf(e) > -1){ 6 sheet.showColumns(HIDDEN_FIELD_START + idx, 1); 7 } else { 8 sheet.hideColumns(HIDDEN_FIELD_START + idx, 1); 9 } 10 }); 11}

投稿2021/08/19 13:03

編集2021/08/19 15:18
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

raaarta

2021/08/19 13:15

解説まで感謝です。明日以降で流してみます。取り急ぎ。本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2021/08/19 15:19

後半に初期化不要のバージョンも追記しました。
raaarta

2021/08/21 14:15 編集

短縮版、ありがとうございます。 旧版への質問です。後出し気味ですいません。他のに適用させようとしたら疑念が(^_^; Q:"cols_checkbox[i][0]"→ここがなんで2次元配列系の表記になるのでしょうか。 cols_checkboxは”getRange(1, CHECKBOX_COLUMN, CHECKBOX_COUNT, 1)”で取得しました。 →1行目のCHECKBOX_COLUMN列からCHECKBOX_COUNT行を1列分取得、です。 →最後の第4引数=取得対象列が1です。 ここが2になるなら、⒉次元配列的になるならわかるのですが。 なぜ1列だけの値取得で、その実体は[x][Y]表記になるのでしょうか。 以上すいませんが。
退会済みユーザー

退会済みユーザー

2021/08/21 20:54

2次元配列という言葉がわかりにくかったかもしれません。 ここでは、二重に入れ子になった配列を指します。 getValues()は、常に2次元配列を返します。 1列分/1行分取得する場合であってもそれは変わりません。 たとえば cols_checkbox = sheet.getRange(1, CHECKBOX_COLUMN, CHECKBOX_COUNT, 1).getValues(); の直後に Logger.log(cols_checkbox); という文を入れて保存し、スプレッドシートのチェックボックスを切り替えた後、 エディタのログ表示画面を確認してみてください。 ログは [[true], [true], [false]] のようになっていると思います。 配列の中に配列が入っているので、これは2次元配列です。 var aaa = col_checkbox[2][0]; のようにアクセスすることで、aaaには false が入ります。 (仮に var aaa=col_checkbox[2]としてしまうと、aaaは [false] という、要素を1つ持った配列が入ることになります) もしスプレッドシートから2列取得して col_checkbox = getRange(1, 1, CHECKBOX_COUNT, 2).getValues()としたら、 col_checkbox の値は [['グループA', true], ['グループB',true], ['グループC', false]] という形になります。これも2次元配列です。 グループCのfalseを取得したい場合は、 var aaa = col_checkbox[2][1]; のようにします。 1行3列取得して col_checkbox = getRange(1, 1, CHECKBOX_COUNT, 3).getValues()とした場合、 col_checkboxは [['グループA', true, ''], ['グループB',true, ''], ['グループC', false, '']] という2次元配列になります。 1つのセルだけをgetvalues()で取る場合(getRange(1, 1, 1, 1).getValues()とした場合) [[値]] という2次元配列になります。 (値をとる(配列を外す)には aaa[0][0]とアクセスします)
raaarta

2021/08/22 14:17

めちゃくちゃ丁寧にありがとうございます!!! ここまで詳解なgetRangeのご説明はみたことがありません。かなりgasの本は買いましたが。。 getRangeの理解がgasの実力向上のキモだと思っているので本当にありがたいです。 何度も読み返します。 冒頭の”二重に入れ子”と、”常に2次元”というのと、”ロガーログしてみる”を足掛かりに完全理解を目指します。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問