LANG SELRCT

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

2017年10月29日日曜日

トリガー(不要になったもの)をスクリプトで削除する

プロジェクト内のすべてのトリガーを削除する場合

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


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;
    }
  }
}


おまけ


試したこと

シートにトリガーを登録する

  • スクリプトでトリガーを作成する
  • シートにトリガーの日付けとIDを書き込む


トリガーを削除する

  • 登録されたトリガーの日付けが現在日時よりも古ければ削除する
  • シートに書き込まれたデータも削除する

本当は同じことをPropertiesServiceで実装しようとしましたが
いろいろと試しているうちに頭がくしゃくしゃになってきたので
別の方法としてシートに書き出す方法から試してみることにしました

ちなみにトリガーで実行するmyFunctionはログを出すだけです


コード.gs
var SS_URL = "URL";

function myFunction() {
  Logger.log("success");
}

function createTrigger() {
  var date = new Date("2017/10/29/19:54");
  var trigger = ScriptApp.newTrigger('myFunction')
    .timeBased()
    .at(date)
    .create();
  var trigger_id = trigger.getUniqueId();
  set_values(date, trigger_id);
}

function set_values(date, trigger_id) {
  var ss = SpreadsheetApp.openByUrl(SS_URL);
  var sh = ss.getSheets()[0];
  var row = get_last_data_row(ss, sh);
  sh.getRange(row, 1).setValue(date);
  sh.getRange(row, 2).setValue(trigger_id);
}

function get_past_data() {
  var ss = SpreadsheetApp.openByUrl(SS_URL);
  var sh = ss.getSheets()[0];
  var row = get_last_data_row(ss, sh);
  var past_data = [];
  for (var i = 0; i < row; i++) {
    var date = sh.getRange((i + 2), 1).getValue();
    var id = sh.getRange((i + 2), 2).getValue();
    if (date < new Date()) {
      past_data.push(id);
      sh.deleteRow(i + 2);
    }
  }
  return past_data;
}

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

function get_last_data_row(ss, sh) {
  var values = sh.getRange("A:A").getValues();
  for (var i = values.length - 1; i >= 0; i--) {
    if (values[i] != "") {
      break;
    }
  }
  var last_row = i + 2;
  return last_row;
}
意訳.gs
スプレッドシートのURLを設定する

この処理は以下を実行する
設定したテキストをログに出す


この処理は以下を実行する
新しい日付けを設定する
指定した処理(例ではmyFunction)をトリガーに設定する
時間主導型で
指定した日付けで
トリガーを作成する
作成したトリガーのIDを取得する
set_valuesに日付けとトリガーのIDを渡す


この処理は以下を実行する
スプレッドシートを取得する
0番目のシートを取得する
データを入力する行を取得する
その行の1列目のに日付けを入力する
その行の1列目にトリガーのIDを入力する


この処理は以下を実行する
スプレッドシートを取得する
0番目のシートを取得する
データが入力されている最終行(の次)を取得する
past_dataという入れ物を用意する
最終行になるまで2行目から以下を繰り返す
1列目のi+2行目の値を取得する(日付)
2列目のi+2行目の値を取得する(trigger_id)
もし日付けが現在日時よりも前なら
past_dataにtrigger_idを追加して
i+2行目を削除する


past_dataを返す


この処理は以下を実行する
past_dataを取得する
現在のプロジェクトのトリガーをすべて取得する
その数の分だけ以下を繰り返す
past_dataに入っている個数分以下を繰り返す
もしallTriggersのi番目とpast_dataのj番目のトリガーIDが同じなら
そのトリガーを削除する





この処理は以下を実行する
指定されたシートのA列の値をすべて取得する
一番下から上に向かって以下を繰り返す
もし値が空でなければ
繰り返しから抜ける


値が入っている最終行の次の行番号を
返す


試してみる


トリガーを登録する


createTrigger()の中の
var date = new Date("2017/10/29/19:54");
この日時を変えていくつか登録します

例として以下の日時を設定して
createTrigger()を5回実行します

  1. 2017/10/29 20:51
  2. 2017/10/29 20:52
  3. 2017/10/29 20:53
  4. 2017/10/30 20:00
  5. 2017/10/31 20:00


編集>現在のプロジェクトのトリガーを選択します



createTrigger()を実行して登録した5つのトリガーが
現在のプロジェクトのトリガーに表示されていると思います



var SS_URL = "URL";
で設定したスプレッドシートを開くと
A列に日付け
B列にトリガーのID
が書き込まれています


トリガーを削除する


deleteTrigger()を実行すると
現在日時よりも前に設定さているトリガーが削除されます




シートからも削除されます