ユーザ用ツール

サイト用ツール


サイドバー

このページの翻訳:



最近の更新



Tag Cloud

13_javascript:03_gas:04_exceeded_maximum_execution_time

04 トリガーでExceeded maximum execution time対応

GASでは6分以上スクリプトを実行できない。
そこで6分を超えそうなら、トリガーへ渡してトリガーから実行を繰り返す事で6分を超えて実行可能です。

03 GAS Properties Service グローバル変数のように利用(永続化) をカウントに利用する。

トリガー制限

トリガー制限にもあるので注意
処理の自動化のために時間等でトリガーを設定することも多いかと思いますが、このトリガーにも制限があります。

対象無料アカウントGoogle Workspace
トリガーの総実行時間90 分 / 日6 時間 / 日
トリガー数20 / ユーザー / スクリプト20 / ユーザー / スクリプト

サンプルスクリプト

これで10秒スリープしながら、30回スプレッドシートへ1行づつ文字を挿入していく
30秒を超えるようなら、countへ行数を保存しつつトリガーへ設定して実行させる。
設定したトリガーは5秒後に実行される。

const ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var scriptProperties = PropertiesService.getScriptProperties();  
var MAX_RUNNING_TIME = 30000;  //スクリプト実行時間(ミリ秒) 30秒
var REASONABLE_TIME_TO_WAIT = 5000;  //トリガー実行までの時間 5秒後

function main(){
  // トリガー制限にかからないようトリガーを削除
  deletedTriggers();
  // countを1にしておく
  scriptProperties.setProperty('count', 1);
  runProccess();
}

function runProccess() {
  var count = scriptProperties.getProperty("count");
  if(!count){ count = 1 }

  var startTime= (new Date()).getTime();
  for(var i = Number(count); i <= 30; i++) {

    var currTime = (new Date()).getTime();
    Logger.log('i '+i+' '+(currTime - startTime));
    if(currTime - startTime >= MAX_RUNNING_TIME) {
      // 時間がなければトリガーセット
      setTrigger(currTime,i)
      break;
    }else{
      var array = [['てすとメッセージ','実行行:' + i]]; 
      sheet.getRange(i,1,1,2).setValues(array).setFontWeight("bold");
      ss.toast(ii + "/30" + '実行中', '進行状況',0);
      Utilities.sleep(10000);
      // 時間があれば実行
      if( i == 30){
        sheet.getRange('A3').setValue('完了');
      }
    }
  }
}

function setTrigger(time, triggerValue){
  scriptProperties.setProperty('count', triggerValue);
  ScriptApp.newTrigger("runProccess")
            .timeBased()
            .at(new Date(time+REASONABLE_TIME_TO_WAIT))
            .create();
  Logger.log('トリガーセット完了');
  ss.toast('続きの処理をトリガーで処理しています。', '進行状況', -1);
}

function deletedTriggers(){
  var triggers = ScriptApp.getProjectTriggers();
  Logger.log('トリガー数: ' + triggers.length);

  triggers.forEach(function(trigger){
    // Logger.log(trigger.getHandlerFunction());
    if(trigger.getHandlerFunction() == 'runProccess'){
      ScriptApp.deleteTrigger(trigger)
    }
  });
}
13_javascript/03_gas/04_exceeded_maximum_execution_time.txt · 最終更新: 2023/03/11 12:23 by matsui