このページの翻訳:
- 日本語 (ja)
- English (en)
最近の更新
Tag Cloud
このページへのアクセス
今日: 4 / 昨日: 0
総計: 843
- Dokuwiki.fl8.jp(263)
- 13 CentOS6メール設定(15)
- 34 UnboundでHA構成(13)
- 05 rsync(13)
- FreeBSD カーネル再構築(12)
- 02 ProFTPD(12)
最近の更新
このページへのアクセス
今日: 4 / 昨日: 0
総計: 843
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) } }); }