Google Apps ScriptでGoogle Sheetsの最終行までを取得し、取得し終わった行を削除する処理をしています。
大抵はうまくいくのですが、まれに実行が失敗することがあります。
原因を調べたところ、 getLastRow()
で取得した行番号が意図と違うことがあるのではないかという疑いを持っています。
詳細な仕様、回避手段等がわかれば教えていただけますでしょうか。
具体的な処理手順としては以下の通りです。
- 該当のシートには自動で行が追加される(Microsoft Flow経由で書き込んでいます)
- 定期的にスクリプトを起動
- 該当シートの2行目から最終行までのデータを読み込む(1行目はタイトル行)
- 該当シートの2行目から最終行までを行ごと削除する
発生している問題・エラーメッセージ
実行が失敗すると、G Suite Developer Hubの実行記録に以下のようなエラーメッセージが残ります。
再現条件は不明です。
エラー これらの行は範囲外にあります。
該当のソースコード
該当部分は下記の通りです。
データの取得~削除までの間、シート自体の操作は行っていません
GoogleAppsScript
1var ss = SpreadsheetApp.getActiveSpreadsheet(); 2var LogSheet = ss.getSheetByName("Sheet1"); 3var LastRow = LogSheet.getLastRow(); 4 5var targetRange = LogSheet.getRange(2, 1, LastRow, 1).getValues(); 6~処理~ 7 8LogSheet.deleteRows(2, LastRow - 1); //1行目はタイトル行のため残す
試したこと
LogSheet.getLastRow()
と LogSheet.getMaxRows()
を試したところ、失敗したログでは
LogSheet.getLastRow() : 77 LogSheet.getMaxRows() : 76
となりました。
つまり、「データの入っている最終行」が「シート自体の最大行」よりも大きい、という状態です。
また、成功したログでは両者の値は同じになるようです(試行回数が少ないため、確実かどうかはわかりません)。
可能性としては「最終行のデータがスプレッドシートの範囲外にある」「 getLastRow()
には注意すべき仕様がある」などがありそうですが、調べてもそれらしい答えが見つからなかったため、原因や対応方法がわかればお教えください。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。