我希望'openById'能够自动找到它附加的电子表格的ID,如果可能的话?
目前,我正在将电子表格中的单元格拉入HTML模板,该模板使用单元格数据填充设计。
如果用户“复制”电子表格,则ID(我手动输入的ID)仍然是我正在使用的原始电子表格的ID,而不是他们正在使用的新电子表格ID。
是否可以动态获取脚本附加的电子表格的ID?
// code.gs
function doGet() {
var template = HtmlService.createTemplateFromFile('index.html')
template.sheet = SpreadsheetApp.openById('THE SPREADSHEET ID');
// returning .evaluate() (an HtmlOutput object) will allow you to display this in a web app.
// to get the string HTML content, use .getContent() on the HtmlOutput
return template
.evaluate();
}
答案 0 :(得分:1)
方法openById
需要一个ID,它不会返回它。可以在电子表格对象上调用getId
的id。但是,doGet
和doPost
函数没有活动电子表格的概念;方法SpreadsheetApp.getActiveSpreadsheet()
在从它们调用时返回null
。似乎Web应用程序从未被视为绑定到电子表格,如列出触发器时的文档hints at。
所以,没有直接的方法来实现你想要的。但是有一种解决方法:指示用户执行捕获Id的函数并将其存储在ScriptProperties中(他们需要对此进行授权,因此onOpen
不会这样做)。示例:
function recordId() {
var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
PropertiesService.getScriptProperties().setProperty('id', ssId);
}
function doGet(e) {
var id = PropertiesService.getScriptProperties().getProperty('id');
var ss = SpreadsheetApp.openById(id); // have access to spreadsheet
return ContentService.createTextOutput(id); // confirms that id is known to the script
}
您可以使用onOpen
创建将启动recordId的菜单项,从而简化流程。