如何从Google Apps Script库访问Google表格单元格数据?
问题
我希望在Google云端硬盘的多个Google表格中复用同一个Google Apps Script,已将名为SISTRIXAbfrageFreigabe的脚本导入为库。通过表格绑定脚本的辅助函数调用库函数,但调用时无任何反应,推测是库脚本无法读取表格中的数据。
绑定脚本的调用代码:
function loc_my_credits() { SISTRIXAbfrageFreigabe.my_credits(); }
库中的my_credits函数代码:
function my_credits(){ // Base URL to access customsearch var urlTemplate = "https://api.sistrix.com/credits?api_key=%KEY%"; // initialize sheets: 1. Get the spreadsheet, 2. Get the first and the second sheets in this spreadsheet var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); var inputSheet = spreadSheet.getSheets()[0]; // Script-specific credentials & search engine var sistrix_Apikey = inputSheet.getRange('A2').getValue(); var url = urlTemplate.replace("%KEY%", encodeURIComponent(sistrix_Apikey)); var params = { muteHttpExceptions: true }; var xml = UrlFetchApp.fetch(url).getContentText(); var document = XmlService.parse(xml); var root = document.getRootElement(); var items = document.getRootElement().getChildren(); for (var i = 0; i < items.length; i++) { if(items[i].getName() == 'answer'){ var answer = items[i].getChildren(); return answer[0].getAttribute('value').getValue(); } } return 0; }
请问是否有办法让库脚本访问表格中存储的数据?
解决方案
核心问题是:库脚本中SpreadsheetApp.getActiveSpreadsheet()会指向库自身绑定的表格(若存在),而非调用它的目标表格。需要通过传递上下文的方式让库获取目标表格的访问权限,具体步骤如下:
1. 修改绑定脚本,传递表格上下文
在绑定脚本中获取当前表格对象,作为参数传入库函数:
function loc_my_credits() { // 获取当前绑定的表格对象 var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 将表格对象传给库函数 var creditResult = SISTRIXAbfrageFreigabe.my_credits(activeSpreadsheet); // 可根据需求处理返回结果,比如写入表格或打印日志 Logger.log("剩余额度:" + creditResult); }
2. 修改库函数,接收并使用传入的表格对象
调整库中的my_credits函数,不再自行获取表格,而是使用传入的对象:
function my_credits(spreadSheet){ var urlTemplate = "https://api.sistrix.com/credits?api_key=%KEY%"; // 使用传入的表格对象获取工作表 var inputSheet = spreadSheet.getSheets()[0]; var sistrix_Apikey = inputSheet.getRange('A2').getValue(); var url = urlTemplate.replace("%KEY%", encodeURIComponent(sistrix_Apikey)); var params = { muteHttpExceptions: true }; // 调用UrlFetch时带上params参数,确保异常被静默处理 var xml = UrlFetchApp.fetch(url, params).getContentText(); var document = XmlService.parse(xml); var root = document.getRootElement(); var items = root.getChildren(); for (var i = 0; i < items.length; i++) { if(items[i].getName() == 'answer'){ var answer = items[i].getChildren(); return answer[0].getAttribute('value').getValue(); } } return 0; }
3. 额外调试与权限注意事项
- 权限配置:确保库的部署权限允许调用脚本访问
SpreadsheetApp、UrlFetchApp等服务 - 日志排查:若仍无反应,可在关键步骤添加
Logger.log()输出变量(如sistrix_Apikey、生成的url),通过查看脚本日志定位问题 - 异常处理:确认
UrlFetchApp调用已传入params,避免请求出错直接抛出异常导致无返回结果
内容的提问来源于stack exchange,提问作者s.Panse
相关产品推荐
相关产品推荐

