前提・実現したいこと
GAS&スプレッドシートでクローリングとスクレイピングをトリガー実行しています。
発生している問題・エラーメッセージ
動作におおよそに問題はないのですが、トリガー実行時に当該スプレッドシートを開いた時、シート書き込みに抜け漏れが生じることがあるとわかりました。対策のアイディアをいただけないでしょうか。
スクリプトの内容は次の通りです。
0. シート内で既定した巡回URLと巡回方法を読み込み
0. Parserライブラリ経由で今回取得データをシート内に一時保存
0. シート内で既存データと今回取得データを重複チェック後、新規追加データがあれば書き込み。
0. 新規追加データがあればメール通知
可否を調べていませんが、当該ファイルの閲覧を一時的にロックできたとしても、スクリプトが完遂しないとロックしたまま解除されないといった問題がありそうです。
消極的な回避策として、トリガー実行を深夜帯のみにすることも視野に入れています。
提案・意見などありましたらご教示ください。
2021/01/15 11:17追記
10ほどのサイトをトリガー実行で巡回。
共通処理はライブラリ化(下記コードの関数はライブラリ内にある)。
これまでエディタ実行、トリガー実行をそれぞれ15回 x 10サイト回しており、全て成功。
一度だけ、トリガー実行中に当該スプレッドシートを開き、添付コードの箇所でのシート書き込みに一行の抜けが生じました。処理は最後まで完遂しています。
当時itemListに格納していたデータ量は150行、テキスト形式ファイルにして200KB程度です。
スプレッドシート内のReportシートには700行、テキスト形式ファイルにして500KB程度のデータが存在します。
function myTemp(itemList, settings) { //itemList 連想配列 今回取得データを格納 //連想配列 書き込み先のシートや範囲などの情報を格納 //Tempシート 今回取得データを、重複チェックのため一時記録 //Reportシート 全データを蓄積 //Tempシート初期化 settings.sheet.temp.clear() //配列から挿入 itemList.forEach(function(x){ x.forEach(function(y){ let rowLast = settings.sheet.temp.getLastRow() let rowWrite = rowLast + 1 for(let i = 0; i <= y.length -1; i++) { settings.sheet.temp.getRange(rowWrite, i+1).setValue(y[i]) } }) }) //行末に重複チェック用の数式(COUNTIFS)を挿入 割愛 //重複データが存在する行を削除 割愛 } --- 2021/01/15 22:49追記 根本的な解決にはなっていませんが、処理の高速化を兼ね、シート書き込み回数を減らすことで回避することにしました。 コメントをくださった方がいるので、しばらく回答オープンにしておきます。
回答1件
あなたの回答
tips
プレビュー