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になった