如何访问Google Apps Script库文件?求类似Excel ThisWorkbook的免硬编码方案
解决Google Apps Script库中获取自身所在电子表格的问题
嘿,这个场景我太熟悉了!确实,当你从用户文件调用库的代码时,SpreadsheetApp.getActive()或者SpreadsheetApp.getActiveSpreadsheet()都会返回调用方的用户文件,这和Excel里ThisWorkbook的行为完全不同,挺让人头疼的。不过我们可以用脚本属性来实现类似的效果,而且不需要硬编码文件ID,完美适配库的不同副本。
具体解决方案步骤:
在库的绑定脚本中设置脚本属性
首先,在你的库文件(也就是那个作为管理文件的电子表格)的绑定脚本里,创建并运行一次这个函数,把当前库所在电子表格的ID存入脚本属性:function setLibrarySpreadsheetId() { // 获取脚本属性存储对象 const scriptProps = PropertiesService.getScriptProperties(); // 获取当前库所在电子表格的ID const librarySsId = SpreadsheetApp.getActiveSpreadsheet().getId(); // 将ID存入脚本属性 scriptProps.setProperty('LIBRARY_SPREADSHEET_ID', librarySsId); }这个函数只需要运行一次——当你复制库文件的副本时,只需要在新副本的脚本里再运行一次它,就会自动存储新副本的电子表格ID,完全不用手动修改代码。
编写库的方法获取自身电子表格
接着,在库的脚本里写一个公共函数,供用户文件调用,用来获取库所在的电子表格:function getLibrarySpreadsheet() { const scriptProps = PropertiesService.getScriptProperties(); const librarySsId = scriptProps.getProperty('LIBRARY_SPREADSHEET_ID'); // 检查是否已设置ID,避免报错 if (!librarySsId) { throw new Error('请先运行库中的setLibrarySpreadsheetId函数,完成库文件ID的初始化!'); } // 返回库所在的电子表格对象 return SpreadsheetApp.openById(librarySsId); }
为什么这个方法可行?
- 脚本属性(Script Properties)是每个脚本独立拥有的存储,库的每个副本的脚本属性都是分开的,所以复制库后,新副本的脚本属性只会存储自己的电子表格ID,不会和原库冲突。
- 当用户文件调用
getLibrarySpreadsheet()时,会从库脚本的属性中读取对应的ID,打开的就是库所在的电子表格,完全不受用户文件上下文的影响。
使用示例
在用户文件的代码里,你只需要这样调用库的方法,就能获取到库所在的管理文件了:
// 假设你的库的标识符是MyLibrary const adminSpreadsheet = MyLibrary.getLibrarySpreadsheet(); // 接下来就可以操作管理文件的工作表、读取设置了 const settingsSheet = adminSpreadsheet.getSheetByName('Settings'); const settingsData = settingsSheet.getDataRange().getValues();
内容的提问来源于stack exchange,提问作者Max Makhrov
相关产品推荐
相关产品推荐

