ユーザ用ツール

サイト用ツール


13_javascript:03_gas:04_exceeded_maximum_execution_time

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
13_javascript:03_gas:04_exceeded_maximum_execution_time [2023/03/11 01:45] – 作成 matsui13_javascript:03_gas:04_exceeded_maximum_execution_time [2023/03/11 03:23] (現在) matsui
行 1: 行 1:
-====== 04 トリガーでExceeded maximum execution time対応 ======+====== 04 トリガーでExceeded maximum execution time対応 ======
  
 GASでは6分以上スクリプトを実行できない。 GASでは6分以上スクリプトを実行できない。
 そこで6分を超えそうなら、トリガーへ渡してトリガーから実行を繰り返す事で6分を超えて実行可能です。 そこで6分を超えそうなら、トリガーへ渡してトリガーから実行を繰り返す事で6分を超えて実行可能です。
  
 +[[13_javascript:03_gas:03_properties_service]] をカウントに利用する。
 +
 +===== トリガー制限 =====
 +トリガー制限にもあるので注意
 +処理の自動化のために時間等でトリガーを設定することも多いかと思いますが、このトリガーにも制限があります。
 +
 +^対象^無料アカウント^Google Workspace^
 +|トリガーの総実行時間|90 分 / 日|6 時間 / 日|
 +|トリガー数|20 / ユーザー / スクリプト|20 / ユーザー / スクリプト|
 +
 +
 +===== サンプルスクリプト =====
 +
 +これで10秒スリープしながら、30回スプレッドシートへ1行づつ文字を挿入していく
 +30秒を超えるようなら、countへ行数を保存しつつトリガーへ設定して実行させる。
 +設定したトリガーは5秒後に実行される。
  
 <code> <code>
 +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)
 +    }
 +  });
 +}
 </code> </code>
  
13_javascript/03_gas/04_exceeded_maximum_execution_time.1678499149.txt.gz · 最終更新: 2023/03/11 01:45 by matsui