无法使用changeType INSERT_GRID触发器getname()新添加的谷歌工作表

Pra*_*acy 1 javascript google-sheets google-apps-script google-sheets-api

希望使用可安装的触发器获取新添加的工作表(手动添加)的名称。带有 INSERT_GRID 的 ChangeType 对我来说工作得很好(通过在添加工作表时输出一些随机值进行测试),但是当我尝试获取新添加的工作表的名称时,它却给了我文档中第一个工作表名称的值。

还有其他选择吗?听说这可能是应用程序脚本中以前的错误。

function log(e)
{
if (e.changeType === "INSERT_GRID") {  
     var news = e.source.getActiveSheet().getName(); //fails to get correct value
     e.source.getSheetByName("Client").getRange(1, 1).setValue(news);
}}
Run Code Online (Sandbox Code Playgroud)

Tan*_*ike 5

我相信你的目标如下。

  • 您想要使用 OnChange 事件触发器检测添加的工作表的工作表名称。
  • 在您当前的问题中,您无法检索添加的工作表的工作表名称。当这是错误或规范时,您想了解实现目标的替代方案。

为此,这个答案怎么样?

问题和解决方法:

不幸的是,在现阶段,OnChange事件触发器的事件对象似乎没有有关添加的sheet的信息。这样,当使用您的脚本时,将检索第一个选项卡的工作表名称。我不确定这是错误还是当前规范。

因此,为了实现您的目标,我想提出以下解决方法。此解决方法的流程如下。

  1. 首先,初始工作表名称保存到 PropertiesService。
  2. 添加工作表时,通过比较当前工作表和从 PropertiesService 检索到的初始工作表来检索添加的工作表。

示例脚本:

要使用此脚本,请关闭 Google 电子表格并再次打开。由此,onOpen运行并将初始工作表名称保存到 PropertiesService。然后,当添加工作表时,检索添加的工作表并将添加的工作表的工作表名称放入单元格中。

function saveCurrentSheets(prop, spreadsheet) {
  const sheets = spreadsheet.getSheets().reduce((o, s) => Object.assign(o, {[s.getSheetName()]: true}), {});
  prop.setProperty("sheets", JSON.stringify(sheets));
}

function onOpen(e) {
  saveCurrentSheets(PropertiesService.getScriptProperties(), e.source);
}

function log(e) {
  if (e.changeType === "INSERT_GRID") {
    const prop = PropertiesService.getScriptProperties();
    const oldSheets = prop.getProperty("sheets");
    if (!oldSheets) {
      saveCurrentSheets(prop, e.source);
      return;
    }
    const oldSheetsObj = JSON.parse(prop.getProperty("sheets"));
    const addedSheet = e.source.getSheets().filter(s => !oldSheetsObj[s.getSheetName()])[0];
    const news = addedSheet.getSheetName();
    e.source.getSheetByName("Client").getRange(1, 1).setValue(news);
    saveCurrentSheets(prop, e.source);
  } else if (e.changeType === "REMOVE_GRID") {
    saveCurrentSheets(PropertiesService.getScriptProperties(), e.source);
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 在此脚本中,请将OnChange事件触发器安装到 的函数中log
  • 在此脚本中,当删除现有工作表时,PropertiesService 的值将由当前工作表名称更新。

笔记:

  • 当Google Spreadsheet中有很多工作表时,我认为初始工作表名称需要是一个文件而不是PropertiesService,因为“属性值大小为9kB / val”。和“属性总存储为 500kB/属性存储。”。请小心这一点。

参考: