web-dev-qa-db-ja.com

Google Apps Scriptの最大実行時間を超えました

このエラーが常に発生するAppsスクリプトがあります。通知メールで判断すると、制限時間は5分です。この時間制限を延長する方法があるかどうか誰もが知っていますか?または、Apps Scriptを再度呼び出して、中断したところから再開する方法があるのでしょうか。どんな助けも大歓迎です。

46
Corry

できることの1つ(これはもちろん、達成しようとしていることによって異なります):

  1. 必要な情報(ループカウンターなど)をスプレッドシートまたは別の永続的なストア(つまりScriptProperties)に保存します。
  2. 5分ごとにスクリプトを終了してください。
  3. 5分ごとにスクリプトを実行するようにタイムドリブントリガーを設定します(または、 スクリプトサービス を使用してプログラムでトリガーを作成します)。
  4. 実行するたびに、使用した永続ストアから保存されたデータを読み取り、中断したところからスクリプトを実行し続けます。

これは万能のソリューションではありません。コードを投稿すれば、人々はより良​​い支援をすることができます。

これは、私が毎日使用しているスクリプトからの簡単なコードの抜粋です。

_function runMe() {
  var startTime= (new Date()).getTime();

  //do some work here

  var scriptProperties = PropertiesService.getScriptProperties();
  var startRow= scriptProperties.getProperty('start_row');
  for(var ii = startRow; ii <= size; ii++) {
    var currTime = (new Date()).getTime();
    if(currTime - startTime >= MAX_RUNNING_TIME) {
      scriptProperties.setProperty("start_row", ii);
      ScriptApp.newTrigger("runMe")
               .timeBased()
               .at(new Date(currTime+REASONABLE_TIME_TO_WAIT))
               .create();
      break;
    } else {
      doSomeWork();
    }
  }

  //do some more work here

}
_

注#1:変数_REASONABLE_TIME_TO_WAIT_は、新しいトリガーを起動するのに十分な大きさでなければなりません。 (5分に設定しましたが、それよりも短い可能性があると思います)。

注#2:doSomeWork()は、比較的高速に実行される関数でなければなりません(1分未満と言います)。

注#3:Googleは _Script Properties_ を廃止し、代わりに _Properties Service_ を導入しました。機能はそれに応じて変更されました。

65
Anton Soradoi

また、Googleサービスへの呼び出しの量を最小限に抑えるようにしてください。たとえば、スプレッドシート内のセル範囲を変更する場合は、各セルを読み取らずに変更し、保存し直します。代わりに、( Range.getValues() を使用して)範囲全体をメモリに読み込み、それを変更し、一度にすべてを保存します( Range.setValues() を使用して)。

これにより、実行時間を大幅に節約できます。

27
ronme

アントン・ソラドイの答え は問題ないようですが、データを一時シートに保存する代わりに キャッシュサービスを使用することを検討してください。

 function getRssFeed() {
   var cache = CacheService.getPublicCache();
   var cached = cache.get("rss-feed-contents");
   if (cached != null) {
     return cached;
   }
   var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml"); // takes 20 seconds
   var contents = result.getContentText();
   cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
   return contents;
 }

また、2014年4月現在、 スクリプトランタイムの制限は6分です


G Suite Business/Enterprise/Education and Early Accessユーザー:

2018年8月現在、これらのユーザーの最大スクリプトランタイムは30分に設定されています。

14
Liyali

ScriptDBを使用して、ループ内で大量の情報を処理している間に場所を保存しました。スクリプトは、5分間の制限を超えることができます。各実行中にScriptDbを更新することにより、スクリプトはdbから状態を読み取り、すべての処理が完了するまで中断した場所を取得できます。この戦略を試してみてください。結果に満足するでしょう。

5

G Suite BusinessまたはEnterpriseエディションを使用している場合。 App Makerの早期アクセスを登録する App makerを有効にした後、スクリプト実行ランタイムにより実行時間が増加します6分から30分になります:)

アプリメーカーの詳細 ここをクリック

5
Shiva