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

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

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

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

Q&A

解決済

1回答

2013閲覧

GASでチェックボックスから該当の行の値を削除する

ss2020

総合スコア1

Google Apps Script

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

1グッド

0クリップ

投稿2022/10/13 06:27

実現したいこと

チェックボックスでTrueにした行から100行下のデータを行ごと削除する
例)A3のチェックボックスを押すと、103行目の値を削除する。

現在の状態

今は3行目のみ実行できるよう無理やり実装したのですが、
最終的にはチェックボックスの実装を複数行したいので、この内容をもっと効率良く書ける方法があれば知りたいです。

スプレッドシートの状態としては、

 AB
3☑️りんご(=’F103’)
4 みかん(=’F104’)

...

 EFGH
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}

ご教授いただけると幸いです。

Cocode👍を押しています

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

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

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

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

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

k.a_teratail

2022/10/13 06:56

> for (var i = 0; i < inspection_cell.length; i++) { ここ、間違ってないですか? inspection_cell ではなく inspection_seet ではないでしょうか? inspection_cell は定義されてないので、forループが行われないのではないでしょうか?
k.a_teratail

2022/10/13 07:01

> 試したこと こちらのコードでは、エラーが発生しています。 エラー ReferenceError: range is not defined at onEdit(on_edit:15:22) エラーを解消してからコード掲載をお願いします。
guest

回答1

0

ベストアンサー

deleteOneを実行するまではできたのですが、その中のif文がうまく動かないです。
const changed_cell = e.range.getA1Notation();

deleteOneメソッド内に変数e の記述がないので、エラーになっていましたので
if文まで到達せずでした。

なので、
deleteOneメソッドで eの変数が必要なので引数として追加する必要があります。

この範囲にあるセル1つが変更されたら働くようにしたい

変更されたセル範囲を「getA1Notation」で取得しているので、文字列として、「A3~A13」の比較を行う必要があります。

下記は参考コードです。

gs

1function onEdit(e) { //リセットボタン 2 const inspection_seet = ['Main'];//対象のシートを指定 3 const canged_seet = e.source.getSheetName(); 4 5 var colIdx = 1; 6 var col = e.range.getColumn(); 7 8 for (var i = 0; i < inspection_seet.length; i++) { 9 if (canged_seet == inspection_seet[i]) {//編集されたシートが指定シートだったら実行 10 if (col === colIdx) { //A列が編集されたら実行 11 deleteOne(e); 12 } 13 } 14 } 15} 16function deleteOne(e) { 17 const ss = SpreadsheetApp.getActiveSpreadsheet(); 18 const sheet = ss.getActiveSheet(); 19 20 // A3~A13の文字列配列を作成 21 const cell = [...Array(11)].map((v, index) => `A${index + 3}` ); 22 const changed_cell = e.range.getA1Notation(); 23 24 // 変更されたセルから100行下の行数 25 var deleCell = sheet.getRange(changed_cell).offset(100, 0).getRow() 26 27 if (cell.indexOf(changed_cell) != -1) { // A3~A13セルが変更されたか 28 if (sheet.getRange(changed_cell).getValue()) { // A3~13セルの値がTrueか 29 sheet.getRange(`A${deleCell}:ZZ${deleCell}`).clearContent(); // A~ZZセルの内容をクリア 30 sheet.getRange(changed_cell).setValue('FALSE') // Aセルのチェックを外す 31 Browser.msgBox('実行されました'); 32 } 33 } 34}

投稿2022/10/13 07:43

k.a_teratail

総合スコア845

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

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

ss2020

2022/10/13 09:10

そちらのコードで解決できました。 解説もして頂きありがとうございます。勉強になります。 A3~A13の文字列配列を作成するコードの書き方はまだ理解できていない部分なので勉強してきます。 親切にご回答頂き大変助かりました。ありがとうございました。
k.a_teratail

2022/10/13 09:26

> A3~A13の文字列配列を作成するコードの書き方 1行で書けそうだったので、1行で書けるコードにしました。 やっていることは、下記と同じになります。 let a = [] for (let i = 0; i < 11; i++) { a.push(`A${i + 3}`) } console.log(a) // [ 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'A11', 'A12', 'A13' ]
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問