GAS エラー「Exceeded maximum execution time」と戦った

「Exceeded maximum execution time」実行時間がGoogleAppScriptの最大実行時間6分を超えると表示されてしまうようです。
解決策は実行時間を短くする、プロパティセット&トリガーを設定する2つの方法があります。

実行時間はこれ以上短くできなかったので、プロパティセット&トリガーを設定する方法を採用しました。

プロパティセット&トリガーにはその実行コードが必要です。

勉強用にコードをまとめました。
そのまま貼り付ければ動くはずです。

var MAX_RUNNING_TIME = 100;  //スクリプト実行時間(ミリ秒)
var REASONABLE_TIME_TO_WAIT = 40000;  //トリガー実行までの時間
var triggerKey = 'start_row';
var scriptProperties = PropertiesService.getScriptProperties();  
var startRow= scriptProperties.getProperty(triggerKey);
if(!startRow){ startRow = 0 }
Logger.log('startRow '+startRow);
Logger.log('REASONABLE_TIME_TO_WAIT  '+REASONABLE_TIME_TO_WAIT);
Logger.log('MAX_RUNNING_TIME  '+MAX_RUNNING_TIME);

function runMe() {
  var startTime= (new Date()).getTime();
  for(var ii = startRow; ii <= 400; ii++) {
    var currTime = (new Date()).getTime();
    Logger.log('ii '+ii+' '+(currTime - startTime));
    if(currTime - startTime >= MAX_RUNNING_TIME) {
      // 時間がなければトリガーセット
      setTrigger(currTime,ii)
      break;
    }else{
      // 時間があれば実行
    }
  }
}

function setTrigger(time, triggerValue){
  scriptProperties.setProperty(triggerKey, triggerValue);
  ScriptApp.newTrigger("runMe")
            .timeBased()
            .at(new Date(time+REASONABLE_TIME_TO_WAIT))
            .create();
  Logger.log('トリガーセット完了');
}

function deleteProperty() {
  var sp = PropertiesService.getScriptProperties().deleteProperty(triggerKey);
  sp.deleteProperty(triggerKey);
  var triggerValue = sp.getProperty(triggerKey);
  Logger.log(triggerKey + ':' + triggerValue);
  Logger.log('トリガー削除完了');
}
  • スクリプト実行時間REASONABLE_TIME_TO_WAITを超えるとプロパティ&トリガーがセットされます
  • トリガー実行までの時間はREASONABLE_TIME_TO_WAITで設定します

下記ページ内のstackoverflowのリンク先を参考にさせていただきました。

参考サイト:BigQueryをGASで動かしてSpreadSheetに結果を書いたらtimeoutになった

  • このエントリーをはてなブックマークに追加