谷歌表格插件无法正确获取当前触发的触发器ID,所有触发器执行均返回首个触发器详情
谷歌表格插件无法正确获取当前触发的触发器ID,所有触发器执行均返回首个触发器详情
看起来你遇到的核心问题是触发器识别逻辑错误:你当前通过遍历所有触发器、根据处理函数名fetchSynctriggerWithDetails来查找“当前触发的触发器”,但因为多个触发器都绑定了同一个处理函数,find方法只会返回第一个匹配项,所以每次执行都拿到同一个触发器ID。
正确的解决方案:利用触发事件对象获取当前触发器
在Google Apps Script中,当触发器主动触发函数执行时,你可以通过ScriptApp.getTriggerSourceEvent()直接获取到触发本次执行的事件对象,从这个对象里就能拿到对应的触发器实例,不需要遍历所有触发器。
修改你的getTriggerDetailsSync函数如下:
function getTriggerDetailsSync() { // 获取触发当前函数执行的事件对象 var event = ScriptApp.getTriggerSourceEvent(); if (!event) { Logger.log('该函数不是由触发器触发的'); return null; } // 从事件对象中获取当前触发的触发器 var currentTrigger = event.trigger; if (!currentTrigger) { Logger.log('无法获取当前触发的触发器'); return null; } var triggerId = currentTrigger.getUniqueId(); Logger.log('当前触发的触发器ID:' + triggerId); // 从PropertiesService中获取对应的触发器详情 var triggerDetailsStr = PropertiesService.getScriptProperties().getProperty(triggerId); var triggerDetails = triggerDetailsStr ? JSON.parse(triggerDetailsStr) : null; return triggerDetails; }
为什么原来的方法不行?
你之前的代码用:
var currentTrigger = ScriptApp.getProjectTriggers().find(trigger => trigger.getHandlerFunction() === 'fetchSynctriggerWithDetails' );
这个逻辑的问题在于:所有你创建的同步触发器都绑定了同一个fetchSynctriggerWithDetails函数,find方法会返回数组中第一个满足条件的触发器,而不是实际触发本次执行的那个。
额外验证建议
- 修改后,你可以手动触发某个特定触发器(或者等待它自动触发),查看日志里的
当前触发的触发器ID是否和你创建时保存的ID一致; - 确保在
createSyncTrigger函数中,你确实是用新创建的触发器ID(trigger.getUniqueId())来保存triggerDetails的,避免保存时就用错了ID。
备注:内容来源于stack exchange,提问作者Parduman Rana
相关产品推荐
相关产品推荐

