GASの実行時間は6分が上限!制限時間内に収めるスクリプトの対策方法
Google Apps Script(GAS)はサーバーレスで実行できる便利なスクリプトサービスですが、制限事項もいくつかあり、その中で最も大きいのが実行時間です。
GAS実行時間が6分以内と短くなっているため、スクリプトに工夫が求められます。
GASはサーバレスで便利な自動化ツール
Google Apps Script(GAS)はJavascriptベースの無料のスクリプトサービスです。
Googleのスプレッドシートやドキュメント、Googleカレンダー、GmailといったGoogleが提供するサービスを手軽に利用し、処理の自動化ができます。
さらに、Web APIやスクレイピングにも応用でき、情報収集の自動化やSlackやLINEなどのチャットボットも無料で作ることができます。
GASが便利なのは、サーバーレス環境で色々なトリガー実行が可能な点です。
1分~1時間単位でのスケジュール登録しての実行もできますし、毎週○曜日の18時に実行、さらに毎月1日に実行といった制御もできます。
さらに、スプレッドシートを修正した時に実行や、Webアプリとして生成されたURLにHTTP GET/POSTされた際に実行も、GASでは可能です。
初心者向けのGASの概要については以下の記事で解説しています↓
無料で便利なGASにも制約条件が
とても便利で無料で使えるGoogle Apps Script(GAS)ですが、制約条件も設けられています。
サーバーレスの自動化スクリプトサービスが無料で使えるということで、利用できるリソースにも限りがあるからです。
GASによるGmailのメール送信回数やGoogleカレンダーのイベント作成回数などは無制限で作ることができず、上限が定められています。
そうしたGASの制約条件の中でも、最も引っかかりやすいのが「実行時間」です。
GASの実行時間は6分が上限
Google Apps Script(GAS)のスクリプトは実行できる時間に6分という上限が設けられています。
もし、6分をオーバーしてしまうような処理負荷の大きいGASスクリプトを実行してしまうと、最後まで処理が実行されません。
6分経過した瞬間にスクリプトが強制終了されてしまい、実行ログにエラーが出力されます。
実行途中だった行以降は実行されずに、処理が中途半端に終わってしまいます。
6分の実行上限に引っかかりやすいGASスクリプト
Google Apps Script(GAS)の制限事項である6分の実行上限に引っかかりやすいスクリプトには特徴があります。
主に実行上限に引っかかりやすいGASスクリプトは以下3点です。
- GAS行数が膨大なスクリプト
- 3重,4重の多重ループで処理対象も多いスクリプト
- スプレッドシートのセルの読み書きが多数発生するGASスクリプト
時折GASで処理する内容が多すぎて、1つの実行関数でスクリプトの行数が1000行以上になることもあります。
GASで1000行というのは大規模すぎるプログラムなので、6分では収まらない可能性が出てきます。
さらに、forループやwhileループなどが入れ子になり、何重ものループになった場合、指数関数的に処理数が増えます。
例えば、1000回繰り返すforループが3重になっていると、1000³=10億回の繰り返し処理となり、6分をオーバーします。
また、スプレッドシートのセルの読み書きは実は処理負荷が大きい処理のため、数十個であれば問題ありませんが、何百個と読み書きを行うと実行時間が超過します。
こうした処理数が多い、処理負荷が大きいGASスクリプトの場合に、実行時間が6分を超えてしまい、エラーになります。
GAS実行時間の6分超過を避けるには?
Google Apps Script(GAS)の実行時間を6分を超えないようにするためには、スクリプトに工夫が求められます。
先程も紹介したように、GASで6分を超過するケースでは、行数が多い、多重ループが発生、スプレッドシートの読み書きが多いの3つが多いです。
そのため、行数が多い場合は、処理を2,3つ分割することで、分割した1つあたりの処理を6分以内で抑えることができます。
分割した処理の結果をスプレッドシートに記録し、次の分割した処理でスプレッドシートを読み込むことで分割実行が可能です。
多重ループが発生している場合は、多くの場合、ループ処理を見直すことができます。
3重ループだったものを2重ループに変更できれば、繰り返し回数を劇的に減らせます。
もし、データの個数が大量かつ、多重ループが必要な処理はGASに向いていないため、データベースを扱えるプログラミング言語に変更したほうがよいです。
スプレッドシートのセルの読み書きが多い場合は、getValueやsetValueでセルを1つずつ取得・書き込みしているケースが多いです。
その場合はgetRangeメソッドで複数セル範囲を指定して、getValues(setValues)メソッドで値を読み書きします。
複数セルを一括で取得しても、1つのセルを取得する時間とそこまで違いがないため、処理負荷を減らせます。
このようにGASスクリプトの処理を分割する、ループを見直す、スプレッドシートのセル取得・記録を一括にするで実行時間を減らし、6分超過するスクリプトも制限時間内に収めることができます。
かつては有料サービスのGoogle Workspaceであれば、実行時間は30分に延長することができました。
しかし、現在は有料版でも実行時間は無料のGoogleアカウントと同じ6分に変更されました。
そのため、実行時間がかかる場合は有料版にアカウントを移行する対応ができなくなりました。
数分で終了するGASスクリプトが理想
そもそも、実行時間が6分近くかかるGoogle Apps Scriptは、スクリプトとして好ましくありません。
GASスクリプトはGoogleのリソース状況でも実行時間が変化します。
あるときは1分で終わる処理が時折、倍近くかかることもあります。
そうした点で、6分以内だけど、6分近くかかるGASスクリプトの場合、実行状況によってはエラーしうる可能性が高いです。
そのため、GASスクリプトでは1分以内で収まる処理が推奨されます。
まとめ・終わりに
今回、Google Apps Script(GAS)の制約条件として、スクリプト実行時間が6分であることを紹介しました。
GASは便利なサーバーレスのスクリプトサービスですが、基本的に大規模な処理は向いていません。
そのため、6分以内の制限時間が設けられており、それを超えた瞬間にGASスクリプトがストップします。
6分を超えないようスクリプトを分割したり、処理負荷が大きいスプレッドシートの処理を見直す必要があります。
実行時間制限の6分はしっかり把握しておき、1回の実行時間が数分で収まるスクリプトの開発を心がけましょう。
ディスカッション
コメント一覧
まだ、コメントがありません