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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

1回答

330閲覧

for文で最終行までループしたいが、処理が最終行以上行われてしまう

onqou1126

総合スコア11

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2022/09/18 11:16

前提

・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文の数値を変えて何度か試してみましたが必ず同じことが発生してしまいました。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/09/18 11:49

最終行よりも下のどこかに空白文字が入っているなどの理由で、getLastRow が見かけ上の最終行と異なる行番号を返している可能性はあります。 もし ・有効なデータのある行であれば、6列目(F列)に必ず誕生日が入力されており、 ・データのない行は、6列目(F列)は必ず空欄である ならば、 let birthdayCell = birthdayRange.getValue(); の直後に、 if (birthdayCell === '') continue; として、その後の処理をスキップして次の行の処理に移ればよいのではないでしょうか。 (6列目が空欄ならばスキップ、ということです)
Sobasenbei

2022/09/18 11:51

lastrowの値は正常ですか
onqou1126

2022/09/18 12:18

qnoir 様 Sobasenbei 様 ご回答ありがとうございました。 lastrowの値が正常かという問いで振り返ってみたところ、4行分多く処理が行われてしまっている箇所を最終行と認識され続けていたため、どれだけ実行しても同じことが繰り返されているだけでした。 各シートの多く処理されていた4行分を消去して再度実行したところ、正常に処理が行われました。 初歩的なミスで申し訳ございません。回答していただきありがとうございました。
guest

回答1

0

自己解決

lastrowの値が正常かという問いで振り返ってみたところ、4行分多く処理が行われてしまっている箇所を最終行と認識され続けていたため、どれだけ実行しても同じことが繰り返されているだけでした。
各シートの多く処理されていた4行分を消去して再度実行したところ、正常に処理が行われました。

投稿2022/09/18 12:18

onqou1126

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問