複数のスプレッドシートを集計したりするのにGoogle Apps Script(GAS)を使うことはよくあります。
ですが、GASは6分という制限時間があり、度々それに悩まされます。
6分を超えると「起動時間の最大値を超えました」とエラーが吐かれ、途中で処理が終了してしまいます。
これを解決する方法として、処理を途中で止め、どこまで処理したかを保存し、1分後に再度実行するようにトリガーを発行するという方法があります。
どこまで処理したかを保存できるような作りでないといけないという制約はあります。
例えば、行毎に処理しているならば、何行まで処理したかを保存しておけば良いということです。
どこに保存するかというと、PropertiesServiceというところにKey-Valueで保存できます。
トリガーは発行すると以下の図のようにずっとトリガー一覧に残ってしまいます。残っていても害はないのですが、邪魔なので削除する処理も入れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| function func() { var startTime = new Date(); var sheet = SpreadsheetApp.openById("1W3lfUaF_9msFJ2oRETpKMTvbF_xxxxxxxxxxxxx").getSheetByName("シート1"); var properties = PropertiesService.getScriptProperties(); var startRowKey = "startRow"; var triggerKey = "trigger"; var startRow = parseInt(properties.getProperty(startRowKey)); if(!startRow){ startRow = 1; }
var rows = sheet.getDataRange().getValues(); for(var i = startRow; i < rows.length; i++){ var diff = parseInt((new Date() - startTime) / (1000 * 60)); if(diff >= 5){ properties.setProperty(startRowKey, i); setTrigger(triggerKey, "func"); return; } } deleteTrigger(triggerKey); properties.deleteProperty(startRowKey); }
function deleteTrigger(triggerKey) { var triggerId = PropertiesService.getScriptProperties().getProperty(triggerKey); if(!triggerId) return; ScriptApp.getProjectTriggers().filter(function(trigger){ return trigger.getUniqueId() == triggerId; }) .forEach(function(trigger) { ScriptApp.deleteTrigger(trigger); }); PropertiesService.getScriptProperties().deleteProperty(triggerKey); }
function setTrigger(triggerKey, funcName){ deleteTrigger(triggerKey); var dt = new Date(); dt.setMinutes(dt.getMinutes() + 1); var triggerId = ScriptApp.newTrigger(funcName).timeBased().at(dt).create().getUniqueId(); PropertiesService.getScriptProperties().setProperty(triggerKey, triggerId); }
|
ちなみにですが、https://developers.google.com/apps-script/guides/services/quotasによると、Early Accessだと実行時間は30分になります。
条件満たしていたので会社で申請したら、2週間ぐらい経って、通って30分になりました。