从doGet函数中查找附加电子表格的ID

时间:2016-06-13 10:01:16

标签: google-apps-script google-sheets

我希望'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();
}

1 个答案:

答案 0 :(得分:1)

方法openById 需要一个ID,它不会返回它。可以在电子表格对象上调用getId的id。但是,doGetdoPost函数没有活动电子表格的概念;方法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的菜单项,从而简化流程。