前提
・Googleフォームでイベントの参加申込を行い、一つのスプレッドシートに統括している。
・参加者の生年月日により階級を設定し、スプレッドシートの指定したセルに表示。
実現したいこと
・各シートの最終行を取得し、最終行までの範囲までで処理を終わらせたい。
発生している問題・エラーメッセージ
・どのシートを見ても、入力されている最終行よりも4行分多く処理が行われてしまっている。
該当のソースコード
function gradeCheck() { let ss = SpreadsheetApp.getActiveSpreadsheet(); let sheets = ss.getSheets(); for(i = 0; i < sheets.length; i++){ let sheet = sheets[i]; let titleRange = sheet.getRange("K1"); titleRange.setValue("階級"); let lastRow = sheet.getLastRow(); for(n = 0; n < lastRow-2; n++){ let range = sheet.getRange(n+2,11); let birthdayRange = sheet.getRange(n+2,6); let birthdayCell = birthdayRange.getValue(); let date1 = new Date ('yyyy/mm/dd'); let date2 = new Date ('yyyy/mm/dd'); let date3 = new Date ('yyyy/mm/dd'); let date4 = new Date ('yyyy/mm/dd'); let date5 = new Date ('yyyy/mm/dd'); let date6 = new Date ('yyyy/mm/dd'); let date7 = new Date ('yyyy/mm/dd'); let date8 = new Date ('yyyy/mm/dd'); if(date1 <= birthdayCell && birthdayCell<= date2){ range.setValue("〇〇"); }else if(date3 <= birthdayCell && birthdayCell <= date4){ range.setValue("△△"); }else if(date5 <= birthdayCell && birthdayCell <= date6){ range.setValue("××"); }else if (date7 <= birthdayCell && birthdayCell <= date8){ range.setValue("※※"); }else { range.setValue("参加不可"); } } } }
試したこと
for文の数値を変えて何度か試してみましたが必ず同じことが発生してしまいました。
最終行よりも下のどこかに空白文字が入っているなどの理由で、getLastRow が見かけ上の最終行と異なる行番号を返している可能性はあります。
もし
・有効なデータのある行であれば、6列目(F列)に必ず誕生日が入力されており、
・データのない行は、6列目(F列)は必ず空欄である
ならば、
let birthdayCell = birthdayRange.getValue();
の直後に、
if (birthdayCell === '') continue;
として、その後の処理をスキップして次の行の処理に移ればよいのではないでしょうか。
(6列目が空欄ならばスキップ、ということです)
lastrowの値は正常ですか
qnoir 様
Sobasenbei 様
ご回答ありがとうございました。
lastrowの値が正常かという問いで振り返ってみたところ、4行分多く処理が行われてしまっている箇所を最終行と認識され続けていたため、どれだけ実行しても同じことが繰り返されているだけでした。
各シートの多く処理されていた4行分を消去して再度実行したところ、正常に処理が行われました。
初歩的なミスで申し訳ございません。回答していただきありがとうございました。
回答1件
あなたの回答
tips
プレビュー