gasのcheckboxでカラムの表示非表示を制御したいと思っています。
web検索したところ、行・レコードを制御する方法がありました。行とはいえ、かなりドンピシャです。流して、実際にOKでした。
リンク内容
で、これを参考に列版を作成したいと思いましたが、この関数には初期化処理があります。
元のプログラムは行の表示非表示制御なので、対象Rowを全て非表示にする関数があります。
この処理を列化させることができませんでした。
hideRowsから、hideColumnsにしようと思っても、hideCまで書いてhideColumnsがサジェスチョンされてきません。
実際に実行するとやはりエラーになります。
↓↓↓↓エラーになる、の図
すいませんがcheckboxでの列制御、ご協力をお願いします。
なおググるとこちらにてonEdit(e)を利用してのやり方がありますが、そうではなく関数作成+それをトリガーに設定、という方法でお願いします。
onEdit(e)内で表示非表示の情報URL
リンク内容
こちらのシートを公開します。(しばらく経ったらクローズします。)
コピペの元になれば幸いです。
グループAのチェックボックス(セル番地B1)がオンのときのみ、COL C,Dが表示される、というイメージです。
!明](308e31851e3ba82c4e580e16be999b4a.png)
公開URL
リンク内容
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
投稿2021/08/19 14:18
総合スコア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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/08/19 15:19
2021/08/21 14:15 編集
退会済みユーザー
2021/08/21 20:54
2021/08/22 14:17
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。