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時間ごとに実行されるトリガーは残します。トリガーを識別するためにgetHandlerFunctionとgetEventTypeを使用し、条件に一致するトリガーを削除しています。
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のプロジェクトを整理し、予期せぬ動作を防ぐことができます。グローバル変数を使用することで、コードの再利用性を高め、メンテナンスを容易にすることができます。ぜひ、自身のプロジェクトでも試してみてください。