実現したいこと
GASで、スプレッドシートにフィルタをかけて表示された内容を取得し、行毎に書き換え、1回のメソッド呼び出しで反映させたい。
・フィルタをかけて表示された内容を取得:出来た
・フィルタをかけて表示された内容を行毎に書き換え:出来たのか不明
・書き換えた内容を1回のメソッド呼び出しでスプレッドシートに反映:やり方が判らない
具体的には、
・スプレッドシートの列は「メールアドレス」「メール送信済フラグ」
1.「メール送信済フラグ」が空白の行をフィルタして取得
2.行毎にメール送信し、送信したら「メール送信済フラグ」に値を書き込む
3.この処理を毎分繰り返す
発生している問題
スプレッドシートには、フォームから入力された内容が増えていくので、
メール送信済みの行は取得せず、最小限のデータのやり取りで済ませたい。
最小限のデータのやり取りにする書き方が判らない。
ソースコード
1// 1分毎のトリガーに設定しておく 2function onTimerEveryMinute() { 3 const ColAddress = 1; 4 const ColRemind = 2; 5 const SheetID = 'testSheetID'; 6 const SheetName = 'フォームの回答 1'; 7 const RowStart = 2; // 行:データ開始位置(見出し行が1) 8 9 // フィルタ準備(誰かが変えてたら掛け直される) 10 const Sheet = SpreadsheetApp.openById(SheetID).getSheetByName(SheetName); 11 var Filter = Sheet.getFilter(); 12 if (null != Filter) { 13 Filter.remove(); 14 } 15 Filter = Sheet.getRange(RowStart - 1, 1, Sheet.getLastRow(), Sheet.getLastColumn()).createFilter(); 16 17 // 値が空白(メール未送信)でフィルタ 18 var criteria = SpreadsheetApp.newFilterCriteria().whenCellEmpty(); 19 criteria.build(); 20 Filter.setColumnFilterCriteria(ColRemind, criteria); 21 22 // メール送信 23 var values = Sheet.getDataRange().getValues().filter(function(_, i) {return !Sheet.isRowHiddenByFilter(i + 1)}); 24 for(var j = RowStart - 1; j < values.length; j++) { 25 GmailApp.sendEmail(values[j][ColAddress - 1], 'testMailSubject', 'このメールはGoogle Apps Scriptによる自動送信です。', {name: 'testMailName'}); 26 // メール送信済フラグを立てる 27 values[j][ColRemind - 1] = 1; // 出来たのか不明 28 } 29 // ループ内でフラグ立てて、ループ外で一気に書き込みたいが、やり方が判らない 30 31 // メール送信したらデフォルトのフィルタ状態に復帰 32 if (null != criteria) { 33 Filter.removeColumnFilterCriteria(ColRemind); // remindフィルタ解除 34 } 35}
読んだteratailのページ
・スプレッドシートのデータをフィルタで非表示にした行を除外して取得したい
https://teratail.com/questions/228915
・【GAS】フィルタをかけて表示される行の行番号を知りたい
https://teratail.com/questions/297477
回答1件
あなたの回答
tips
プレビュー