実現したいこと
GASを用いて、スプレッドシート上で値が入力されている最後の行まで処理を行いたい。
前提
https://teratail.com/questions/tdhhsye5sh2cca
先日上記の質問をした者です。
いただいた回答で納得したつもりだったのですが、やっぱり思っていた挙動と違ったので、再質問させてください。
発生している問題・エラーメッセージ
function QRSendMail(){ var sheetname = 'customer_list'; const spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname); const lastRow = spreadsheet.getLastRow(); var rangeValues = spreadsheet.getDataRange().getValues(); for(var i=3 ; i<=lastRow ; i++){ var sending = rangeValues[i][0];
最初、上記のように書いていて、いただいた回答に従い、下記のように修正しました。(ifの条件内の=の削除)
function QRSendMail(){ var sheetname = 'customer_list'; const spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname); const lastRow = spreadsheet.getLastRow(); var rangeValues = spreadsheet.getDataRange().getValues(); for(var i=3 ; i<lastRow ; i++){ var sending = rangeValues[i][0];
当初の「i<=lastRow」だと、前回の質問のようなエラーが出てしまうのですが、
「i<lastRow」だと、エラーが出ない代わりに最後の行の1つ上の行までしか処理されません。
4~21行に値が入っている時、4~20行が処理されます。
配列の考え方がなかなか理解できず情けないのですが、なるべく分かりやすい説明と解決策をいただけると幸いです。
宜しくお願いいたします。
質問文のソースが途中で途切れていますが、forブロック内の記載してない範囲でも i を用いた処理を何か記述されていますか?
もしもそこでrangeValues配列にアクセスしたり、シート(spreadsheet変数)のメソッド呼び出しで i を使っているならば、インデックスがずれているせいで結果がおかしく見えているのかもしれません。
配列の添え字が0開始(処理範囲は3-20)、シート関数の行番号指定は1開始(処理範囲は4-21)となるので
全ての処理でそれらの整合性を取る必要があります。
var dept2 = rangeValues[i][6];
のように、別の複数の列の値を取ったあとに、
if(dept2 != ''){
GmailApp.sendEmail(mail, title, text1, options);
spreadsheet.getRange(i+1,2).setValue(today);
}
として、メールを送り、メールを送った日付を2列目の4行目以降のセルに入力するように、書いたつもりです!
申し訳ないですが、断片的なソースコードでは断片的な回答しかできません。
全文を質問文に追加すればよりよい回答が得られるかもしれません。
エラーが出ないのに部分的な処理しかできなかったのであれば、もしかすると自動メール送信の上限にひっかかっているかもしれません。(私は上限まで送ったことないので、エラーがでるのか単に処理が打ち切られるのか、どうなるのか把握していませんが……)
一時的に実際の処理(シート書き込みとかメール送信とか)をコメントアウトし代わりにconsole.log などにデバッグ出力して、どのデータに対してどんな処理がされる予定であったか確認してみれば分かりやすいかもしれません。
iを使っているのは、rangeValuesが[i][0]~[i][11]で複数列に並んでいるものと、
追記したspreadsheet.getRange(i+1,2).setValue(today)のみです。
何回か試して同じように最後の1行のみ処理されないため、メール送信数の上限は関係ないです。
G21のセルの値をご確認ください。
値が入力されていますか?
回答4件
あなたの回答
tips
プレビュー

