GAS V8运行时如何获取已删除Sheets对应的时间触发器ID?
解决方案
你不需要通过已删除表格的Spreadsheet实例获取对应触发器,V8运行时环境下直接按以下步骤操作即可:
- 首先调用
ScriptApp.getUserTriggers(ScriptApp.getService())获取当前脚本绑定的所有触发器,无需关联具体的表格实例 - 遍历所有触发器,通过
getTriggerSourceId()方法获取每个触发器绑定的资源ID(也就是对应Sheets的文件ID) - 对每个触发器尝试调用
SpreadsheetApp.openById(触发器对应的资源ID),如果抛出找不到资源的异常,说明该触发器绑定的表格已经被删除,你可以直接调用ScriptApp.deleteTrigger(触发器实例)删除对应无效触发器
参考实现代码
function cleanDeletedSheetTriggers() { // 获取当前脚本所有用户触发器 const allTriggers = ScriptApp.getUserTriggers(ScriptApp.getService()); allTriggers.forEach(trigger => { // 只筛选绑定到表格的触发器 if (trigger.getTriggerSource() === ScriptApp.TriggerSource.SPREADSHEETS) { const sheetId = trigger.getTriggerSourceId(); try { // 尝试访问表格验证是否存在 SpreadsheetApp.openById(sheetId); } catch (e) { // 匹配已删除表格的异常特征,删除无效触发器 if (e.message.includes("No item with the given ID could be found")) { ScriptApp.deleteTrigger(trigger); } } } }) }
注意事项
该方法需要你的插件申请了https://www.googleapis.com/auth/spreadsheets权限,否则调用openById时会抛出权限异常
你可以把上述清理逻辑放到插件的初始化流程里,或者单独提供一个触发器清理入口给用户触发执行
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

