You need to enable JavaScript to run this app. 通过Libraries调用其他Google Apps Script项目函数执行位置异常问题
优惠活动
大模型
产品
解决方案
定价
更多

通过Libraries调用其他Google Apps Script项目函数执行位置异常问题

你遇到的现象属于正常行为。如果你是通过将项目1作为库导入项目2的方式调用函数,默认执行上下文属于调用方也就是项目2,你代码中大量使用SpreadsheetApp.getActiveSpreadsheet()这类依赖当前执行环境活跃资源的方法,自然会操作项目2绑定的表格,而非项目1的资源。

要实现函数逻辑在项目1侧生效,可根据使用场景选择以下两种方案:

  • 方案1:将项目1部署为Web应用,完全隔离执行上下文
    操作步骤:在项目1的编辑页点击右上角「部署」>「新建部署」,部署类型选「Web应用」,执行身份选「我(部署者账号)」,访问权限根据需求设置(仅自己调用选「仅限自己」,对协作者开放可选「您所在组织内的任何人」或「任何人」),部署后拿到Web应用URL。项目2侧不需要导入项目1作为库,直接用UrlFetchApp.fetch()调用该URL即可触发项目1的函数运行,所有逻辑都会在项目1侧执行,操作的也是项目1的资源,无需修改现有函数代码。
  • 方案2:保留库引用方式,修改代码内的资源引用逻辑
    如果你不想使用Web应用方案,就需要把现有代码中所有依赖执行上下文的动态资源获取方法,替换为指定项目1资源ID的硬编码写法:
    把所有的SpreadsheetApp.getActiveSpreadsheet()替换为SpreadsheetApp.openById('替换为项目1绑定的电子表格ID'),同时确保库的执行身份设置为「电子表格所有者(项目1所属账号)」,且该账号持有对应文件夹、表格的编辑权限。
    针对你提供的示例代码,核心修改参考如下:
    function loadSgdata() {
      // 新增项目1表格ID常量,替换为你自己的ID
      const PROJECT1_SPREADSHEET_ID = "xxxxxx你的项目1电子表格IDxxxxxx";
      // 原写法取的是当前执行环境的活跃表格,修改为指定打开项目1的表格
      SpreadsheetApp.openById(PROJECT1_SPREADSHEET_ID).toast("Importing Subgrade Data...");
      
      var FldrId = '10flFnQPAygo3PAkja9Gymm_RlZYMQHXh';
      var FileName = 'SGMaster.rpt';
      var sheet_Name = "Import Raw SG" 
      // 此处同样替换为项目1的表格
      var ss = SpreadsheetApp.openById(PROJECT1_SPREADSHEET_ID).getSheetByName(sheet_Name)
      ss.getRange('A1:A').clearContent();
      
      //Reference to the folder    
      var fldr = DriveApp.getFolderById(FldrId);
    
      //Get files by that name
      var allFilesInFolder = fldr.getFilesByName(FileName);
      
      Logger.log('allFilesInFolder: ' + allFilesInFolder);
    
      if (allFilesInFolder.hasNext() === false) {
      return false;
      };
      
      var cntFiles = 0;
      //Even if it's only one file, must iterate a while loop in order to access the file (Google drive will allow multiple files of the same name)
      var delimiter = "\t"; // Added
      while (allFilesInFolder.hasNext()) {
      var thisFile = allFilesInFolder.next();
      cntFiles = cntFiles + 1;
      Logger.log('File Count: ' + cntFiles);
    
      
      var docContent = thisFile.getBlob().getDataAsString(); // Modified
      Logger.log('docContent : ' + docContent );
      var csv = Utilities.parseCsv(docContent, delimiter); // Added
      ss.getRange(ss.getLastRow() + 1, 1, csv.length, csv[0].length).setValues(csv); // Added
    }
    
      // 此处也要替换为项目1的表格
      var sheet = SpreadsheetApp.openById(PROJECT1_SPREADSHEET_ID).getSheetByName(sheet_Name)
      r1=sheet.getRange("A26:A")
      r2=sheet.getRange("A26:A")
    
      data=r1.getValues();
    
      for (i=0;i<data.length;i++)
      {
        data[i][0] = data[i][0].toString().substring(0,6) + data[i][0].toString().substring(14);
      }
      r2.setValues(data);
    }
    

内容的提问来源于stack exchange,提问作者Jon Bowles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 13:21:01