このページの翻訳:
- 日本語 (ja)
- English (en)
最近の更新
Tag Cloud
このページへのアクセス
今日: 6 / 昨日: 0
総計: 845
- Dokuwiki.fl8.jp(503)
- 13 CentOS6メール設定(26)
- FreeBSD カーネル再構築(24)
- 05 rsync(23)
最近の更新
このページへのアクセス
今日: 6 / 昨日: 0
総計: 845
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)
}
});
}