🕰️

GASで指定した時間にバッチ処理したい場合の備忘録

2024/11/28に公開

想定読者

自分、Google Apps Scriptで時間指定して日々のバッチ処理を実行したい人

参考

参考サイト

ソース

修正しました

trigger.gs
/**
 * 定時実行したい関数
 */
function batch() {
  // タイムアウト等でバッチ設定が出来なくならないようにするため、先に次回バッチの設定をする
  clearTrigger(batch); // 古いバッチを削除する
  createNextTrigger(batch, 1, 9, 10); // 翌日9時10分に実行されるトリガーを設定する

  batchImpl();
}

/**
 * 実際にバッチ処理で行いたい関数
 */
function batchImpl() {
  // なんかの処理
  // do something
}

/**
 * n日後の指定時間に実行されるトリガーを作成する
 * @param {Function} func 削除する関数
 * @param {number} n 実行開始日
 * @param {number} hour 実行開始時間
 * @param {number} minitue 実行開始分
 */
function createNextTrigger(func, n=1, hour=0, minitue=0) {
  if (!func) throw new Error(`funcを指定してください`);
  const functionName = func.name;
  if (n < 1) throw new Error(`nは1以上の整数を指定してください`);
  if (hour < 0 || hour > 23) throw new Error(`hourは0~23の整数を指定してください ${hour}`);
  if (minitue < 0 || minitue > 59) throw new Error(`minitueは0~59の整数を指定してください ${minitue}`);

  const time = new Date();
  time.setDate(time.getDate() + n);
  time.setHours(hour, minitue);
  ScriptApp.newTrigger(functionName)
    .timeBased()
    .at(time)
    .create();
}

/**
 * 時間起動トリガーを削除する
 * @param {Function} func 削除する関数名
 */
function clearTrigger(func) {
  if (!func) throw new Error(`funcを指定してください`);
  const functionName = func.name;
  const triggers = ScriptApp.getProjectTriggers();
  for (const trigger of triggers) {
    // 時間起動のトリガーじゃない場合は消さない
    if (ScriptApp.TriggerSource.CLOCK !== trigger.getTriggerSource()) continue;
    // 関数名が違う場合は消さない
    if (functionName !== trigger.getHandlerFunction()) continue;
    ScriptApp.deleteTrigger(trigger);
  }
}

解説

batch 関数

トリガーとして登録される関数
createNextTrigger(batch, 1, 9, 10);の行を変更して実行間隔・実行時間を変更する
※第2引数以降は全て整数を渡す

batchImpl 関数

実行したい処理
この関数に処理したい内容を書く

createNextTrigger 関数

基本的にこのままでいい

clearTrigger 関数

基本的にこのままでいい

Discussion