LANG SELRCT

コードを書く場所についてはこちら

2017年10月29日日曜日

トリガーをスクリプトで制御する

スクリプトでトリガーを制御する方法の覚書その1です

ここで言う「トリガー」とは
Google Apps Scriptで書いた処理を
指定した日時に自動的に実行する機能のことです

スクリプトエディタのUI上からトリガーを設定する方法はこちら

以下のコードを実行すると
1分ごとにmyFunctionを実行するトリガーが追加され
その追加したトリガーを65秒ごとに削除します
(削除しないと永遠にトリガーが増えていく)

これはUI上で1分おきに実行するトリガーを設定するのとほぼ変わらないので
実用的なコードではないですが
トリガーのIDを指定して削除する例を書きたくて書いてみました



コード.gs
function createTimeDrivenTriggers() {
  var trigger = ScriptApp.newTrigger('myFunction')
    .timeBased()
    .everyMinutes(1)
    .create();
  var trigger_id = trigger.getUniqueId();   
  Utilities.sleep(65000);
  deleteTrigger(trigger_id);
}  

function deleteTrigger(triggerId) {
  var allTriggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < allTriggers.length; i++) {
    if (allTriggers[i].getUniqueId() == triggerId) {
      ScriptApp.deleteTrigger(allTriggers[i]);
      break;
    }
  }
}

function myFunction() {
  //実行したい処理
}
意訳.gs
この処理は以下を実行する
指定した処理(例ではmyFunction)をトリガーに設定する
時間主導型で
指定した分毎(例では1分毎)に実行する
トリガーを作成する
作成したトリガーのIDを取得する
指定した秒数待機する(例では65秒)
deleteTriggerにトリガーのIDを渡す



この処理は以下を実行する
現在のプロジェクトのすべてのトリガーを取得する
トリガーの数だけ以下を繰り返す
triggerIdを見つけたら
そのトリガーを削除する
繰り返しの処理から抜ける



この処理は以下を実行する
実行したい処理を書く


おまけ


IDや時間の設定が本当に意図したとおりになっているのか
ログを出してみました



コード.gs
function createTimeDrivenTriggers() {
  var start = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd/HH:mm:ss');
  var trigger = ScriptApp.newTrigger('myFunction')
    .timeBased()
    .everyMinutes(1)
    .create();
  var trigger_id = trigger.getUniqueId();    
  Logger.log(trigger.getUniqueId());
  Utilities.sleep(65000);
  deleteTrigger(trigger_id);
  var end = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd/HH:mm:ss');
  Logger.log(["removed: " + trigger.getUniqueId(), "created_at: " + start, "end_at: " + end]);
}

function deleteTrigger() {
  var allTriggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < allTriggers.length; i++) {
    if (allTriggers[i].getUniqueId() == triggerId) {
      ScriptApp.deleteTrigger(allTriggers[i]);
      break;
    }
  }
}

function myFunction() {
  //実行したい処理
}
意訳.gs
この処理は以下を実行する
現在日時を取得する
指定した処理(例ではmyFunction)をトリガーに設定する
時間主導型で
指定した分毎(例では1分毎)に実行する
トリガーを作成する
作成したトリガーのIDを取得する
それをログに出す
指定した秒数待機する(例では65秒)
deleteTriggerにトリガーのIDを渡す
現在時刻を取得する
トリガーIDと開始時間と終了時間をログに出す


この処理は以下を実行する
現在のプロジェクトのすべてのトリガーを取得する
トリガーの数だけ以下を繰り返す
triggerIdを見つけたら
そのトリガーを削除する
繰り返しの処理から抜ける




この処理は以下を実行する
実行したい処理を書く




参考
https://developers.google.com/apps-script/guides/triggers/installable