Google Apps Scriptで一時的なトリガーのみを消し、定期的なトリガーだけを残すように管理する方法【GAS・サンプルコードあり】

この記事の内容について、業務や開発でお困りの場合は個別に対応できます。

Google Apps Scriptを使用していると、特定の処理を定期的に実行したり、エラー時に再試行するためのトリガーが必要になることがあります。しかし、これらのトリガーが不要になったときには、適切に削除しないとプロジェクトが煩雑になり、予期せぬ動作の原因となることがあります。今回は、一時的なトリガーを管理する方法について紹介します。

コード例

まず、以下のようなスクリプトを作成しました。ここでは、特定の関数を実行するための一時的なトリガーを管理しています。

// トリガー対象関数の名前をグローバル変数として定義
const HANDLER_FUNCTION = 'extractAndSaveEmailAttachments';

function deleteTemporaryTriggers() {
  // 既存の一時的なトリガーを削除。ただし、1時間ごとのトリガーは残す
  const triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(trigger => {
    if (trigger.getHandlerFunction() === HANDLER_FUNCTION &&
      trigger.getEventType() === ScriptApp.EventType.TIME_BASED &&
      !trigger.getTriggerSourceId()) { // 1時間ごとのトリガーでない場合
      ScriptApp.deleteTrigger(trigger);
    }
  });
}

function createRetryTrigger() {
  // 一時的なトリガーを削除
  deleteTemporaryTriggers();

  // 既存の同じトリガーが存在しない場合のみ新しいトリガーを作成
  const triggers = ScriptApp.getProjectTriggers();
  const hourlyTriggerExists = triggers.some(trigger =>
    trigger.getHandlerFunction() === HANDLER_FUNCTION &&
    trigger.getEventType() === ScriptApp.EventType.TIME_BASED &&
    trigger.getTriggerSourceId() === 'hourly'
  );

  // 10分後の一時的なトリガーを作成
  if (!hourlyTriggerExists) {
    ScriptApp.newTrigger(HANDLER_FUNCTION)
      .timeBased()
      .after(10 * 60 * 1000) // 10分後に再実行
      .create();
  }
}

コードの説明

グローバル変数の定義

まず、トリガー対象の関数名をグローバル変数HANDLER_FUNCTIONとして定義しました。これにより、関数名をハードコーディングすることなく、再利用性が向上し、コードのメンテナンスが容易になります。

const HANDLER_FUNCTION = 'extractAndSaveEmailAttachments';

一時的なトリガーの削除

deleteTemporaryTriggers関数は、既存の一時的なトリガーを削除する役割を持ちます。ただし、1時間ごとに実行されるトリガーは残します。トリガーを識別するためにgetHandlerFunctiongetEventTypeを使用し、条件に一致するトリガーを削除しています。

function deleteTemporaryTriggers() {
  const triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(trigger => {
    if (trigger.getHandlerFunction() === HANDLER_FUNCTION &&
      trigger.getEventType() === ScriptApp.EventType.TIME_BASED &&
      !trigger.getTriggerSourceId()) {
      ScriptApp.deleteTrigger(trigger);
    }
  });
}

再試行トリガーの作成

createRetryTrigger関数は、一時的なトリガーを削除し、必要に応じて新しいトリガーを作成します。まず、一時的なトリガーを削除し、次に同じトリガーが存在しないことを確認します。存在しない場合のみ、10分後に実行される一時的なトリガーを作成します。

function createRetryTrigger() {
  deleteTemporaryTriggers();

  const triggers = ScriptApp.getProjectTriggers();
  const hourlyTriggerExists = triggers.some(trigger =>
    trigger.getHandlerFunction() === HANDLER_FUNCTION &&
    trigger.getEventType() === ScriptApp.EventType.TIME_BASED &&
    trigger.getTriggerSourceId() === 'hourly'
  );

  if (!hourlyTriggerExists) {
    ScriptApp.newTrigger(HANDLER_FUNCTION)
      .timeBased()
      .after(10 * 60 * 1000)
      .create();
  }
}

まとめ

一時的なトリガーを管理することで、Google Apps Scriptのプロジェクトを整理し、予期せぬ動作を防ぐことができます。グローバル変数を使用することで、コードの再利用性を高め、メンテナンスを容易にすることができます。ぜひ、自身のプロジェクトでも試してみてください。

ZIDOOKA!

この記事の内容について、対応できます

この記事に関連する技術トラブルや開発上の問題について個別対応を行っています。

個別対応は3,000円〜 内容・工数により事前にお見積りします
最後までお読みいただきありがとうございました

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

AI活用に関するポリシー

当サイトでは、記事の執筆補助にAIを活用する場合がありますが、全面的な委任は行いません。