実現したいこと
チェックボックスでTrueにした行から100行下のデータを行ごと削除する
例)A3のチェックボックスを押すと、103行目の値を削除する。
現在の状態
今は3行目のみ実行できるよう無理やり実装したのですが、
最終的にはチェックボックスの実装を複数行したいので、この内容をもっと効率良く書ける方法があれば知りたいです。
スプレッドシートの状態としては、
A | B | |
---|---|---|
3 | ☑️ | りんご(=’F103’) |
4 | みかん(=’F104’) |
...
E | F | G | H | |
---|---|---|---|---|
103 | りんご | 100 | ||
104 | みかん | 200 |
A3にチェックボックス
B3にデータの名前を参照したもの(='F7')
100行下の103行目にデータがあります。
3行目のチェックボックスを押すと103行目の値が行単位で削除されます。
現在のコード
Code.gs
1function onEdit(e) { 2 const inspection_seet = ['Main']; 3 const canged_seet = e.source.getSheetName(); 4 const changed_cell = e.range.getA1Notation(); 5 6 const cellA3 = ['A3']; 7 8 const ss = SpreadsheetApp.getActiveSpreadsheet(); 9 const sheet = ss.getActiveSheet(); 10 const rangeA3 = sheet.getRange('A3'); 11 12 const checkvalA3 = rangeA3.getValues(); 13 14 for (var i = 0; i < inspection_cell.length; i++) { 15 if (canged_seet == inspection_seet[i]) { 16 if (changed_cell == cellA3[i]) { 17 if (checkvalA3[i][0] === true) { 18 rangeA3.setValue('FALSE') 19 Browser.msgBox('A3を削除しました',); 20 sheet.getRange('Main!A103:CV103').clearContent(); 21 } 22 } 23 } 24 } 25 }
試したこと
ネットで色々調べて書いてみたのですが初心者なもので...
deleteOneを実行するまではできたのですが、その中のif文がうまく動かないです。
Code.gs
1function onEdit(e) { //リセットボタン 2 const inspection_seet = ['Main'];//対象のシートを指定 3 const canged_seet = e.source.getSheetName(); 4 const changed_cell = e.range.getA1Notation(); 5 6 var colIdx = 1; 7 var col = e.range.getColumn(); 8 9 // スプレッドシートを取得 10 const ss = SpreadsheetApp.getActiveSpreadsheet(); 11 // シートを取得 12 const sheet = ss.getActiveSheet(); 13 14 // 値を取得 15 const checkval = range.getValues(); 16 const checkvalA3 = rangeA3.getValues(); 17 18 for (var i = 0; i < inspection_cell.length; i++) { 19 if (canged_seet == inspection_seet[i]) {//編集されたシートが指定シートだったら実行 20 if (col === colIdx) { //A列が編集されたら実行 21 deleteOne(); 22 } 23 } 24 } 25} 26function deleteOne() { 27 const ss = SpreadsheetApp.getActiveSpreadsheet(); 28 const sheet = ss.getActiveSheet(); 29 const range = sheet.getRange('A3:B36'); 30 const values = range.getValues(); 31 32 const cell = ['A3:A13']; //この範囲にあるセル1つが変更されたら働くようにしたいが書き方がわからないです。 33 const changed_cell = e.range.getA1Notation(); 34 35 var deleCell = changed_cell.offset(100, 0).getRange(); 36 const deleRow = deleCell.getRow(); 37 38 if (changed_cell == cell[i]) { 39 if (values[i][0] === true) { 40 sheet.getRange(deleRow).clearContent(); 41 values.setValue('FALSE') 42 Browser.msgBox('実行されました'); 43 } 44 } 45}
ご教授いただけると幸いです。
> for (var i = 0; i < inspection_cell.length; i++) {
ここ、間違ってないですか?
inspection_cell ではなく inspection_seet ではないでしょうか?
inspection_cell は定義されてないので、forループが行われないのではないでしょうか?
> 試したこと
こちらのコードでは、エラーが発生しています。
エラー
ReferenceError: range is not defined
at onEdit(on_edit:15:22)
エラーを解消してからコード掲載をお願いします。

回答1件
あなたの回答
tips
プレビュー