求助:获取多个Google Sheets中触发器时遇到问题
问题分析与解决方案
核心问题
你的代码中ScriptApp.getProjectTriggers()方法只能获取当前运行该脚本的表格绑定的触发器,无法获取其他通过openById打开的目标表格的触发器。每个Google Sheet的绑定脚本都是独立的Apps Script项目,ScriptApp对象仅能访问当前脚本所属项目的资源。
解决方案
要获取其他Spreadsheet绑定脚本的触发器,需要借助Apps Script API来实现跨项目的触发器查询。以下是具体步骤和修改后的代码:
1. 启用Apps Script API
- 打开脚本编辑器,点击「资源」->「云平台项目」,查看当前脚本关联的云项目ID
- 访问Google Cloud Console,搜索并打开该项目
- 在API库中搜索「Apps Script API」,点击启用
2. 修改后的代码
function getAllTriggers() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var idsSheet = ss.getSheetByName('SheetIDs'); var triggersSheet = ss.getSheetByName('Triggers'); var data = idsSheet.getDataRange().getValues(); // 清空触发器表格原有内容(可选) triggersSheet.clearContents(); // 添加表头 triggersSheet.appendRow(['表格ID', '表格名称', '触发事件类型', '触发条件', '处理函数', '触发器ID']); for (var i = 1; i < data.length; i++) { var spreadsheetId = data[i][0]; try { // 获取目标表格绑定的脚本项目ID var scriptContentUrl = `https://script.googleapis.com/v1/spreadsheets/${spreadsheetId}/content`; var scriptResponse = UrlFetchApp.fetch(scriptContentUrl, { headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` } }); var scriptData = JSON.parse(scriptResponse.getContentText()); var scriptId = scriptData.scriptId; // 调用API获取该脚本项目的所有触发器 var triggersUrl = `https://script.googleapis.com/v1/projects/${scriptId}/triggers`; var triggersResponse = UrlFetchApp.fetch(triggersUrl, { headers: { Authorization: `Bearer ${ScriptApp.getOAuthToken()}` } }); var triggersData = JSON.parse(triggersResponse.getContentText()); if (triggersData.triggers && triggersData.triggers.length > 0) { var spreadsheet = SpreadsheetApp.openById(spreadsheetId); var spreadsheetName = spreadsheet.getName(); // 遍历触发器并写入表格 triggersData.triggers.forEach(trigger => { var triggerId = trigger.triggerId; var handlerFunction = trigger.functionName; var eventType = trigger.eventType; // 解析触发条件(区分时间驱动和事件驱动) var triggerCondition = ''; if (trigger.timeTrigger) { triggerCondition = `时间规则: ${trigger.timeTrigger.schedule}`; } else if (trigger.eventTrigger) { triggerCondition = `事件细节: ${trigger.eventTrigger.eventType}`; } triggersSheet.appendRow([spreadsheetId, spreadsheetName, eventType, triggerCondition, handlerFunction, triggerId]); }); } else { // 无触发器的情况 var spreadsheet = SpreadsheetApp.openById(spreadsheetId); var spreadsheetName = spreadsheet.getName(); triggersSheet.appendRow([spreadsheetId, spreadsheetName, '无触发器', '', '', '']); } } catch (error) { // 捕获异常并记录 triggersSheet.appendRow([spreadsheetId, '处理失败', error.toString(), '', '', '']); console.error(`处理表格ID ${spreadsheetId} 时出错: ${error.message}`); } } }
注意事项
- 首次运行脚本时,会弹出授权请求,需同意授予访问Apps Script API和表格的权限
- 确保你拥有目标表格的编辑权限,且目标表格的绑定脚本未被设置为私有不可访问
- 如果目标表格没有绑定任何脚本,API会返回空的触发器列表,代码会标记为「无触发器」
内容的提问来源于stack exchange,提问作者Bala Murali
相关产品推荐
相关产品推荐

