プロジェクト内のすべてのトリガーを削除する場合
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;
}
}
}
triggerの名前を指定して削除する場合
function deleteTrigger(functionName) {
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
if (allTriggers[i].getHandlerFunction() == functionName) {
ScriptApp.deleteTrigger(allTriggers[i]);
break;
}
}
}
試したこと
シートにトリガーを登録する
トリガーを削除する
本当は同じことをPropertiesServiceで実装しようとしましたが
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;
}
}
}
triggerの名前を指定して削除する場合
function deleteTrigger(functionName) {
var allTriggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < allTriggers.length; i++) {
if (allTriggers[i].getHandlerFunction() == functionName) {
ScriptApp.deleteTrigger(allTriggers[i]);
break;
}
}
}
おまけ
試したこと
シートにトリガーを登録する
- スクリプトでトリガーを作成する
- シートにトリガーの日付けとIDを書き込む
トリガーを削除する
- 登録されたトリガーの日付けが現在日時よりも古ければ削除する
- シートに書き込まれたデータも削除する
本当は同じことをPropertiesServiceで実装しようとしましたが
いろいろと試しているうちに頭がくしゃくしゃになってきたので
別の方法としてシートに書き出す方法から試してみることにしました
ちなみにトリガーで実行するmyFunctionはログを出すだけです
別の方法としてシートに書き出す方法から試してみることにしました
ちなみにトリガーで実行する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回実行します
- 2017/10/29 20:51
- 2017/10/29 20:52
- 2017/10/29 20:53
- 2017/10/30 20:00
- 2017/10/31 20:00
編集>現在のプロジェクトのトリガーを選択します
createTrigger()を実行して登録した5つのトリガーが
現在のプロジェクトのトリガーに表示されていると思います
var SS_URL = "URL";
で設定したスプレッドシートを開くと
A列に日付け
B列にトリガーのID
が書き込まれています
トリガーを削除する
deleteTrigger()を実行すると
現在日時よりも前に設定さているトリガーが削除されます