update_trigger
Modify existing triggers in Google Tag Manager by updating settings like filters, event conditions, and timing parameters to refine when tags fire.
Instructions
既存のトリガーを更新します。filter、autoEventFilter、waitForTagsなどのすべての設定を更新できます。
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | アカウントID | |
| containerId | Yes | コンテナID | |
| workspaceId | Yes | ワークスペースID | |
| triggerId | Yes | トリガーID | |
| name | No | トリガー名 | |
| type | No | トリガータイプ | |
| customEventFilter | No | カスタムイベントフィルタ(CUSTOM_EVENTタイプ用) | |
| filter | No | フィルタ(linkClick、clickなどのタイプ用) | |
| autoEventFilter | No | 自動イベントフィルタ(linkClickタイプ用) | |
| waitForTags | No | タグの待機を有効化(linkClickタイプ用) | |
| checkValidation | No | バリデーションチェック(linkClickタイプ用) | |
| waitForTagsTimeout | No | タグ待機タイムアウト(ミリ秒、linkClickタイプ用) | |
| formId | No | フォームID(formSubmissionタイプ用) | |
| formClasses | No | フォームクラス(formSubmissionタイプ用) | |
| verticalThreshold | No | 垂直スクロール閾値(パーセント、scrollDepthタイプ用) | |
| horizontalThreshold | No | 水平スクロール閾値(パーセント、scrollDepthタイプ用) | |
| selector | No | CSSセレクタ(elementVisibilityタイプ用) | |
| visiblePercentageThreshold | No | 表示割合閾値(パーセント、elementVisibilityタイプ用) | |
| continuousTimeMinMilliseconds | No | 連続表示時間(ミリ秒、elementVisibilityタイプ用) | |
| videoId | No | YouTube動画ID(youtubeVideoタイプ用) | |
| enableTriggerOnVideoStart | No | 動画開始時に発火(youtubeVideoタイプ用) | |
| enableTriggerOnVideoProgress | No | 動画再生中に発火(youtubeVideoタイプ用) | |
| enableTriggerOnVideoComplete | No | 動画完了時に発火(youtubeVideoタイプ用) | |
| enableTriggerOnVideoPause | No | 動画一時停止時に発火(youtubeVideoタイプ用) | |
| enableTriggerOnVideoSeek | No | 動画シーク時に発火(youtubeVideoタイプ用) | |
| interval | No | インターバル(ミリ秒、timerタイプ用) | |
| limit | No | 発火回数の上限(timerタイプ用) | |
| startTimerOn | No | タイマー開始タイミング(timerタイプ用、例: "windowLoad", "domReady") |
Implementation Reference
- src/index.js:1449-1774 (handler)MCP tool handler for 'update_trigger'. Fetches existing trigger data, merges with provided arguments handling special logic for different trigger types (e.g., formSubmission, scrollDepth), preserves fingerprint, and calls GTMClient.updateTrigger to perform the API update.case 'update_trigger': { // 既存のトリガーデータを取得 const existingTrigger = await this.gtmClient.getTrigger( args.accountId, args.containerId, args.workspaceId, args.triggerId ); // 更新データを構築(指定されたパラメータで上書き) const triggerData = { name: args.name !== undefined ? args.name : existingTrigger.name, type: args.type !== undefined ? args.type : existingTrigger.type, }; // カスタムイベントフィルタ if (args.customEventFilter !== undefined) { triggerData.customEventFilter = args.customEventFilter; } else if (existingTrigger.customEventFilter) { triggerData.customEventFilter = existingTrigger.customEventFilter; } // フィルタ if (args.filter !== undefined) { triggerData.filter = args.filter; } else if (existingTrigger.filter) { triggerData.filter = existingTrigger.filter; } // 自動イベントフィルタ if (args.autoEventFilter !== undefined) { triggerData.autoEventFilter = args.autoEventFilter; } else if (existingTrigger.autoEventFilter) { triggerData.autoEventFilter = existingTrigger.autoEventFilter; } // タグ待機設定 if (args.waitForTags !== undefined) { triggerData.waitForTags = { type: 'boolean', value: args.waitForTags }; } else if (existingTrigger.waitForTags) { triggerData.waitForTags = existingTrigger.waitForTags; } // バリデーションチェック if (args.checkValidation !== undefined) { triggerData.checkValidation = { type: 'boolean', value: args.checkValidation }; } else if (existingTrigger.checkValidation) { triggerData.checkValidation = existingTrigger.checkValidation; } // タグ待機タイムアウト if (args.waitForTagsTimeout !== undefined) { triggerData.waitForTagsTimeout = { type: 'template', value: String(args.waitForTagsTimeout) }; } else if (existingTrigger.waitForTagsTimeout) { triggerData.waitForTagsTimeout = existingTrigger.waitForTagsTimeout; } // formSubmission用の処理 if (triggerData.type === 'formSubmission') { if (args.formId !== undefined || args.formClasses !== undefined) { triggerData.filter = []; if (args.formId !== undefined) { triggerData.filter.push({ type: 'contains', parameter: [ { type: 'template', key: 'arg0', value: '{{Form ID}}' }, { type: 'template', key: 'arg1', value: args.formId } ] }); } else if (existingTrigger.filter) { // 既存のForm IDフィルタを保持 const formIdFilter = existingTrigger.filter.find(f => f.parameter?.some(p => p.value === '{{Form ID}}') ); if (formIdFilter) { triggerData.filter.push(formIdFilter); } } if (args.formClasses !== undefined) { triggerData.filter.push({ type: 'contains', parameter: [ { type: 'template', key: 'arg0', value: '{{Form Classes}}' }, { type: 'template', key: 'arg1', value: args.formClasses } ] }); } else if (existingTrigger.filter) { // 既存のForm Classesフィルタを保持 const formClassesFilter = existingTrigger.filter.find(f => f.parameter?.some(p => p.value === '{{Form Classes}}') ); if (formClassesFilter) { triggerData.filter.push(formClassesFilter); } } } else if (existingTrigger.filter) { triggerData.filter = existingTrigger.filter; } } // scrollDepth用の処理 if (triggerData.type === 'scrollDepth') { if (args.verticalThreshold !== undefined || args.horizontalThreshold !== undefined) { triggerData.parameter = [ { type: 'template', key: 'verticalThresholdUnits', value: 'PERCENT' }, { type: 'template', key: 'verticalThreshold', value: String(args.verticalThreshold !== undefined ? args.verticalThreshold : (existingTrigger.parameter?.find(p => p.key === 'verticalThreshold')?.value || 25)) } ]; if (args.horizontalThreshold !== undefined) { triggerData.parameter.push( { type: 'template', key: 'horizontalThresholdUnits', value: 'PERCENT' }, { type: 'template', key: 'horizontalThreshold', value: String(args.horizontalThreshold) } ); } else if (existingTrigger.parameter) { const horizontalThreshold = existingTrigger.parameter.find(p => p.key === 'horizontalThreshold'); if (horizontalThreshold) { triggerData.parameter.push( { type: 'template', key: 'horizontalThresholdUnits', value: 'PERCENT' }, horizontalThreshold ); } } } else if (existingTrigger.parameter) { triggerData.parameter = existingTrigger.parameter; } } // elementVisibility用の処理 if (triggerData.type === 'visible' || triggerData.type === 'elementVisibility') { triggerData.type = 'visible'; if (args.selector !== undefined || args.visiblePercentageThreshold !== undefined || args.continuousTimeMinMilliseconds !== undefined) { triggerData.parameter = [ { type: 'template', key: 'selector', value: args.selector !== undefined ? args.selector : (existingTrigger.parameter?.find(p => p.key === 'selector')?.value || '') }, { type: 'template', key: 'visiblePercentageThreshold', value: String(args.visiblePercentageThreshold !== undefined ? args.visiblePercentageThreshold : (existingTrigger.parameter?.find(p => p.key === 'visiblePercentageThreshold')?.value || 50)) }, { type: 'template', key: 'continuousTimeMinMilliseconds', value: String(args.continuousTimeMinMilliseconds !== undefined ? args.continuousTimeMinMilliseconds : (existingTrigger.parameter?.find(p => p.key === 'continuousTimeMinMilliseconds')?.value || 0)) } ]; } else if (existingTrigger.parameter) { triggerData.parameter = existingTrigger.parameter; } } // youtubeVideo用の処理 if (triggerData.type === 'youtubeVideo') { if (args.enableTriggerOnVideoStart !== undefined || args.enableTriggerOnVideoProgress !== undefined || args.enableTriggerOnVideoComplete !== undefined || args.enableTriggerOnVideoPause !== undefined || args.enableTriggerOnVideoSeek !== undefined || args.videoId !== undefined) { triggerData.parameter = [ { type: 'template', key: 'enableTriggerOnVideoStart', value: String(args.enableTriggerOnVideoStart !== undefined ? args.enableTriggerOnVideoStart : (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoStart')?.value || false)) }, { type: 'template', key: 'enableTriggerOnVideoProgress', value: String(args.enableTriggerOnVideoProgress !== undefined ? args.enableTriggerOnVideoProgress : (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoProgress')?.value || false)) }, { type: 'template', key: 'enableTriggerOnVideoComplete', value: String(args.enableTriggerOnVideoComplete !== undefined ? args.enableTriggerOnVideoComplete : (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoComplete')?.value || false)) }, { type: 'template', key: 'enableTriggerOnVideoPause', value: String(args.enableTriggerOnVideoPause !== undefined ? args.enableTriggerOnVideoPause : (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoPause')?.value || false)) }, { type: 'template', key: 'enableTriggerOnVideoSeek', value: String(args.enableTriggerOnVideoSeek !== undefined ? args.enableTriggerOnVideoSeek : (existingTrigger.parameter?.find(p => p.key === 'enableTriggerOnVideoSeek')?.value || false)) } ]; if (args.videoId !== undefined) { triggerData.filter = [ { type: 'equals', parameter: [ { type: 'template', key: 'arg0', value: '{{Video ID}}' }, { type: 'template', key: 'arg1', value: args.videoId } ] } ]; } else if (existingTrigger.filter) { triggerData.filter = existingTrigger.filter; } } else { if (existingTrigger.parameter) { triggerData.parameter = existingTrigger.parameter; } if (existingTrigger.filter) { triggerData.filter = existingTrigger.filter; } } } // timer用の処理 if (triggerData.type === 'timer') { if (args.interval !== undefined || args.limit !== undefined || args.startTimerOn !== undefined) { triggerData.parameter = [ { type: 'template', key: 'interval', value: String(args.interval !== undefined ? args.interval : (existingTrigger.parameter?.find(p => p.key === 'interval')?.value || 1000)) }, { type: 'template', key: 'limit', value: String(args.limit !== undefined ? args.limit : (existingTrigger.parameter?.find(p => p.key === 'limit')?.value || 1)) }, { type: 'template', key: 'startTimerOn', value: args.startTimerOn !== undefined ? args.startTimerOn : (existingTrigger.parameter?.find(p => p.key === 'startTimerOn')?.value || 'windowLoad') } ]; } else if (existingTrigger.parameter) { triggerData.parameter = existingTrigger.parameter; } } // その他のタイプのパラメータを保持 if (!triggerData.parameter && existingTrigger.parameter) { triggerData.parameter = existingTrigger.parameter; } // fingerprintを保持(更新に必要) if (existingTrigger.fingerprint) { triggerData.fingerprint = existingTrigger.fingerprint; } return { content: [ { type: 'text', text: JSON.stringify( await this.gtmClient.updateTrigger( args.accountId, args.containerId, args.workspaceId, args.triggerId, triggerData ), null, 2 ), }, ], }; }
- src/index.js:408-530 (schema)Input schema definition for the 'update_trigger' tool, defining parameters for GTM trigger update including IDs and type-specific configurations.inputSchema: { type: 'object', properties: { accountId: { type: 'string', description: 'アカウントID', }, containerId: { type: 'string', description: 'コンテナID', }, workspaceId: { type: 'string', description: 'ワークスペースID', }, triggerId: { type: 'string', description: 'トリガーID', }, name: { type: 'string', description: 'トリガー名', }, type: { type: 'string', description: 'トリガータイプ', }, customEventFilter: { type: 'array', description: 'カスタムイベントフィルタ(CUSTOM_EVENTタイプ用)', }, filter: { type: 'array', description: 'フィルタ(linkClick、clickなどのタイプ用)', }, autoEventFilter: { type: 'array', description: '自動イベントフィルタ(linkClickタイプ用)', }, waitForTags: { type: 'boolean', description: 'タグの待機を有効化(linkClickタイプ用)', }, checkValidation: { type: 'boolean', description: 'バリデーションチェック(linkClickタイプ用)', }, waitForTagsTimeout: { type: 'number', description: 'タグ待機タイムアウト(ミリ秒、linkClickタイプ用)', }, // formSubmission用 formId: { type: 'string', description: 'フォームID(formSubmissionタイプ用)', }, formClasses: { type: 'string', description: 'フォームクラス(formSubmissionタイプ用)', }, // scrollDepth用 verticalThreshold: { type: 'number', description: '垂直スクロール閾値(パーセント、scrollDepthタイプ用)', }, horizontalThreshold: { type: 'number', description: '水平スクロール閾値(パーセント、scrollDepthタイプ用)', }, // elementVisibility用 selector: { type: 'string', description: 'CSSセレクタ(elementVisibilityタイプ用)', }, visiblePercentageThreshold: { type: 'number', description: '表示割合閾値(パーセント、elementVisibilityタイプ用)', }, continuousTimeMinMilliseconds: { type: 'number', description: '連続表示時間(ミリ秒、elementVisibilityタイプ用)', }, // youtubeVideo用 videoId: { type: 'string', description: 'YouTube動画ID(youtubeVideoタイプ用)', }, enableTriggerOnVideoStart: { type: 'boolean', description: '動画開始時に発火(youtubeVideoタイプ用)', }, enableTriggerOnVideoProgress: { type: 'boolean', description: '動画再生中に発火(youtubeVideoタイプ用)', }, enableTriggerOnVideoComplete: { type: 'boolean', description: '動画完了時に発火(youtubeVideoタイプ用)', }, enableTriggerOnVideoPause: { type: 'boolean', description: '動画一時停止時に発火(youtubeVideoタイプ用)', }, enableTriggerOnVideoSeek: { type: 'boolean', description: '動画シーク時に発火(youtubeVideoタイプ用)', }, // timer用 interval: { type: 'number', description: 'インターバル(ミリ秒、timerタイプ用)', }, limit: { type: 'number', description: '発火回数の上限(timerタイプ用)', }, startTimerOn: { type: 'string', description: 'タイマー開始タイミング(timerタイプ用、例: "windowLoad", "domReady")', }, }, required: ['accountId', 'containerId', 'workspaceId', 'triggerId'], },
- src/index.js:405-531 (registration)Tool registration in the ListToolsRequest handler, defining name, description, and schema for 'update_trigger'.{ name: 'update_trigger', description: '既存のトリガーを更新します。filter、autoEventFilter、waitForTagsなどのすべての設定を更新できます。', inputSchema: { type: 'object', properties: { accountId: { type: 'string', description: 'アカウントID', }, containerId: { type: 'string', description: 'コンテナID', }, workspaceId: { type: 'string', description: 'ワークスペースID', }, triggerId: { type: 'string', description: 'トリガーID', }, name: { type: 'string', description: 'トリガー名', }, type: { type: 'string', description: 'トリガータイプ', }, customEventFilter: { type: 'array', description: 'カスタムイベントフィルタ(CUSTOM_EVENTタイプ用)', }, filter: { type: 'array', description: 'フィルタ(linkClick、clickなどのタイプ用)', }, autoEventFilter: { type: 'array', description: '自動イベントフィルタ(linkClickタイプ用)', }, waitForTags: { type: 'boolean', description: 'タグの待機を有効化(linkClickタイプ用)', }, checkValidation: { type: 'boolean', description: 'バリデーションチェック(linkClickタイプ用)', }, waitForTagsTimeout: { type: 'number', description: 'タグ待機タイムアウト(ミリ秒、linkClickタイプ用)', }, // formSubmission用 formId: { type: 'string', description: 'フォームID(formSubmissionタイプ用)', }, formClasses: { type: 'string', description: 'フォームクラス(formSubmissionタイプ用)', }, // scrollDepth用 verticalThreshold: { type: 'number', description: '垂直スクロール閾値(パーセント、scrollDepthタイプ用)', }, horizontalThreshold: { type: 'number', description: '水平スクロール閾値(パーセント、scrollDepthタイプ用)', }, // elementVisibility用 selector: { type: 'string', description: 'CSSセレクタ(elementVisibilityタイプ用)', }, visiblePercentageThreshold: { type: 'number', description: '表示割合閾値(パーセント、elementVisibilityタイプ用)', }, continuousTimeMinMilliseconds: { type: 'number', description: '連続表示時間(ミリ秒、elementVisibilityタイプ用)', }, // youtubeVideo用 videoId: { type: 'string', description: 'YouTube動画ID(youtubeVideoタイプ用)', }, enableTriggerOnVideoStart: { type: 'boolean', description: '動画開始時に発火(youtubeVideoタイプ用)', }, enableTriggerOnVideoProgress: { type: 'boolean', description: '動画再生中に発火(youtubeVideoタイプ用)', }, enableTriggerOnVideoComplete: { type: 'boolean', description: '動画完了時に発火(youtubeVideoタイプ用)', }, enableTriggerOnVideoPause: { type: 'boolean', description: '動画一時停止時に発火(youtubeVideoタイプ用)', }, enableTriggerOnVideoSeek: { type: 'boolean', description: '動画シーク時に発火(youtubeVideoタイプ用)', }, // timer用 interval: { type: 'number', description: 'インターバル(ミリ秒、timerタイプ用)', }, limit: { type: 'number', description: '発火回数の上限(timerタイプ用)', }, startTimerOn: { type: 'string', description: 'タイマー開始タイミング(timerタイプ用、例: "windowLoad", "domReady")', }, }, required: ['accountId', 'containerId', 'workspaceId', 'triggerId'], }, },
- src/gtm-client.js:245-252 (helper)GTMClient helper method that performs the actual Google Tag Manager API update for a trigger using the googleapis library.async updateTrigger(accountId, containerId, workspaceId, triggerId, triggerData) { await this.ensureAuth(); const response = await this.tagmanager.accounts.containers.workspaces.triggers.update({ path: `accounts/${accountId}/containers/${containerId}/workspaces/${workspaceId}/triggers/${triggerId}`, requestBody: triggerData }); return response.data; }