You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:获取多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:17:06