通过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
相关产品推荐
相关产品推荐

