1

如何在制作新工作表或更改工作表名称或复制工作表或从谷歌电子表格删除工作表时通过谷歌应用程序脚本自动刷新当前工作表名称列表

:::::: 我需要工作表名称列表 :::::::::::::

  1. 有很多张
  2. 新工作表将由其他用户添加
  3. 新工作表的名称将被其他用户更改
  4. 一些工作表将被其他用户删除
  5. 我需要现有的工作表名单而不是过去

:::::::::::::::::::::::::::::::::::::::::

并且工作表名称列表应显示在 代码表达式为 sheet[1]的第二张工作表上

下面的代码运行良好。但不会通过添加工作表或删除工作表来刷新

function sheetnames()
{
 return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(function(x) {return x.getName();});
}
4

1 回答 1

3

我相信你的情况和目标如下。

  • 您正在使用sheetnames()Google 电子表格上的自定义函数作为自定义函数。
  • 您已经确认您的功能sheetnames()有效。
  • 您希望在删除、插入、复制工作表以及更改工作表名称时刷新自定义功能。

为了达到上述目的,我想提出以下方法。

用法:

1. 准备脚本。

在这种情况下,用于刷新sheetnames()电子表格中的自定义函数的示例脚本由 OnChange 事件触发器运行。为此,请将以下示例脚本复制并粘贴到电子表格的容器绑定脚本中,并保存该脚本。

function onChange(e) {
  var lock = LockService.getDocumentLock();
  if (lock.tryLock(10000)) {
    try {
      const prop = PropertiesService.getScriptProperties();
      if ((e.changeType === "OTHER" || e.changeType === "REMOVE_GRID" || e.changeType === "INSERT_GRID") && !prop.getProperty("run")) {
        const formula = "=sheetnames";  // <--- Please set the function name of the custom function.
        const ss = e.source;
        const tempFormula = "=sampleFormula";
        ss.createTextFinder("^\\" + formula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(tempFormula);
        ss.createTextFinder("^\\" + tempFormula).matchFormulaText(true).useRegularExpression(true).replaceAllWith(formula);
        prop.setProperty("run", "done");
      } else {
        prop.deleteProperty("run");
      }
    } catch(e) {
      throw new Error(e);
    } finally {
      lock.releaseLock();
    }
  }
}
  • 为了避免脚本的重复运行,LockService使用了。
  • 为了避免触发的无限循环,PropertiesService使用了。

2. 安装 OnChange 事件触发器。

为了执行函数onChange,请在函数中安装 OnChange 事件触发器onChange您可以在此官方文档中查看安装方法。

3. 测试

为了测试上面的脚本,在你安装了函数onChange作为可安装的 OnChange 事件触发器之后,例如,请插入新的工作表。这样,您可以确认自定义功能sheetnames()已刷新。

参考:

于 2020-07-09T05:20:02.703 回答