Google Apps Scriptで「起動時間の最大値を超えました」への対策

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
Photo by: Nicole De Khors @BURST

以下の記事で、Google Apps Scriptは6分以上連続で実行できないため、途中で5分で実行を切って再実行を設定するようにしていました。

【SEO検証】サーチコンソールデータをスプレッドシートへ自動反映

今回はその解説を行いたいと思います。以下の3つの考え方です。

1:for文で繰り返し実行している行を、5分の段階でストップさせる
2:5分の段階でストップした時に、何行目まで実行したか記録して、トリガーを設定する
3:トリガーにより実行済みの行の続きからスタートするようにする

配列を使えばこの処理は不要なのですが、勉強のため記録しておきたいと思います。処理中に次のトリガーを設定できるとは・・・Google Apps Scriptはいろいろと柔軟にできておもしろいです。PropertiesServiceについてや、トリガーの処理といったところは覚えておくと今後も使えると思います。

前回の記事では、以下のようなスクリプトで掲載順位を反映させていました。

◆の部分が説明を省略した途中で5分で実行を切って再実行を設定している箇所です。これについて見ていきましょう。

1:for文で繰り返し実行している行を、5分の段階でストップさせる

5分の段階でストップさせるためには、スタートの時間から計測する必要があります。そのため、まず開始時刻を取得しています。

ここで取得した開始時刻は、for文内の行ごとの繰り返し部分で利用しています。繰り返し毎にその時の時刻と開始時刻とを比較して5分経過していないかをチェックしています。以下の部分です。

diffのところで書いている「parseInt」は整数に変換する関数ですね。その後ろの部分は時刻の差分を「分」に直しています。IF文内は「5分経過していたら、何行まで処理したかを保存して、トリガーを発行する」という内容です。
「何行まで処理したかを保存」「トリガーを発行」は次以降の章の内容です。続けて見ていきましょう。

2:5分の段階でストップした時に、何行目まで実行したか記録して、トリガーを設定する

何行目まで実行したかの記録については、以下の部分で行っています。

Property Serviceというものを利用してkey-value形式で保存しています。Property Serviceに関する説明は、こちらのサイトをご覧ください。

iはfor文内で1づつ増加する変数ですので、実行中のiの数値をstartRowKeyという名前で保存する、といった内容になります。

この処理の下ごしらえとして、以下のような宣言をあらかじめしていました。

最後にトリガーの発行です。具体的には以下の部分で行っています。

「positionDataReflect」というのが現在行っている処理ですので、この処理の実行をトリガーに設定しています。setTriggerの内容としては、以下の処理の部分です。詳しい説明はこちらのサイトのまま利用させていただいているので割愛しますが、1分後に指定したtriggerKey&処理を実行するトリガーを設定する、という形です。

これで、ひとまずは5分ごとに区切って中断し、その時にトリガーを設定して1分後に再開するところはできました。

3:トリガーにより実行済みの行の続きからスタートするようにする

中断した処理をトリガーで再開した時に頭から実行されていきますが、その時に効いてくるのがfor文の前のこの分岐です。

変数startRowが開始行を決めています。

は、Property Serviceに保存したstartRowKeyを取り出しています。実行中のiの数値をstartRowKeyという名前で保存していましたので、もし中断から再開した場合であれば、startRowが中断時のiの数値となります。つまり、中断した行数が開始行になってくれるというわけです。

その下の

は、中断から再開した場合でない場合のstartRowの初期値の設定です。

と、iの初期値はstartRowにしていますので、これで再開時もうまく中断した行から実行してくれるというわけです。

そのようにfor文内で中断、再開を繰り返しながら全件実行した後、最後に以下の処理でトリガーとProperty Serviceに保存した行数の情報を削除しています。

これをしないと変にトリガーが残ったり、次回実行時にstartRowが最初の行から実行しなかったりするので、必要な後処理です。
deleteTriggerの処理以下の通りですが、詳しい説明はこれも参考サイトの通りなので割愛します。

最後に

これで実行時間が長くなってしまった場合でも処理を続けることは大丈夫ですね。
参考にさせていただいたサイトはまとめて下に記載します。感謝!!

参考記事:

Google Apps Script で6分以上の処理をする

Property Service で Google Apps Script でデータを保存する

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください