GAS『Trigger Already Exists』エラーの原因・対処まとめ

GAS『Trigger Already Exists』エラーの原因・対処まとめ

この記事では、Google Apps Script(GAS)で頻発する『Trigger Already Exists』エラーの発生条件や、対処方法を具体例やサンプルコードと共にまとめています。WordPressのブログに直接貼り付けてすぐ使えるよう、h1とh3タグのみで構成しています。

『Trigger Already Exists』エラーとは

GASで同一スクリプトに同一トリガーを複数回追加しようとすると発生するエラー。既に同じ種別や同じ関数、同一イベントのトリガーが存在することが原因。

エラーが発生する主な条件

  • すでに追加されているトリガーと同一種類・関数・イベントのトリガーをcreateメソッドなどで再度追加した場合
  • デプロイやテスト時にスクリプトの初期化コードが繰り返し実行された場合

トリガー一覧の確認方法

function listTriggers() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    Logger.log(triggers[i].getHandlerFunction() + ' : ' + triggers[i].getEventType());
  }
}

このコードで、現在設定されている全トリガーの関数名とイベントタイプを確認できる。

トリガーの重複を防ぐ方法

function createUniqueTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() === 'myFunction' && triggers[i].getEventType() === ScriptApp.EventType.TIME_DRIVEN) {
      return;
    }
  }
  ScriptApp.newTrigger('myFunction')
    .timeBased()
    .everyDay()
    .atHour(8)
    .create();
}

同じ関数とイベント種別のトリガーが無い場合のみ新規作成することで、重複を防げる。

不要トリガーの削除手順

function deleteTriggersByFunction(funcName) {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() === funcName) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

トリガー作成前や不要なトリガー整理の際に活用できる。

トリガー作成のベストプラクティス

  • トリガー作成時には必ず既存トリガーとの重複チェックを行う
  • 初回セットアップやデプロイ用関数では明示的にトリガー管理の処理を実装する

自動実行コードサンプル

function setupTriggers() {
  deleteTriggersByFunction('myFunction');
  ScriptApp.newTrigger('myFunction')
    .timeBased()
    .everyDay()
    .atHour(8)
    .create();
}

事前に同名関数の既存トリガーを削除してから新規作成することで、意図しない重複エラーを防ぐ。

トリガー管理で注意したいポイント

  • プロジェクト全体のトリガー設計を整理しておく
  • 必要がないタイミングでトリガー追加処理が動作しないようガードロジックを入れる
  • 予期せぬ重複登録を検出できる機能も加えるとより安全

まとめ

  • 『Trigger Already Exists』は重複トリガー作成によって発生
  • 事前チェック・既存トリガー削除などで確実に回避できる
  • トリガー管理用関数を1つ用意しておくと運用がラク