【问题标题】:Access local variables while using Google Apps Script Libraries在使用 Google Apps 脚本库时访问本地变量
【发布时间】:2018-10-03 16:50:40
【问题描述】:

我正在使用不同的 Google 电子表格,它们都使用相同的表格和结构。它们都使用一组相同的功能,这些功能是通过使用自定义菜单项来执行的。

要为所有电子表格只维护一次功能,一个用作所有其他电子表格的库。现在问题来了:所有电子表格都有一组单独的属性,需要传递给库函数调用。这就是为什么我目前正在做这样的事情:

作为lib 提供的库中的示例函数以及所有工作表的菜单结构:

function onOpen() {
   var ui = SpreadsheetApp.getUi();
   ui.createMenu('Actions')
             .addItem("My Library Function", "trackingHelper")
             .addItem("My 2nd Library Function", "anotherFunction")
             .addToUi();
}

function trackingHelper(sheetProperties) {
   do something and use the sheetProperties
}

现在,在“子”表中,我添加了如下内容:

var sheetProperties = {key: value, ...}

function onOpen() {
   lib.onOpen();
}

function trackingHelper() {
   lib.trackingHelper(sheetProperties);
}

function anotherFunction() {
   lib.anotherFunction(sheetProperties);
}

问题是,如果我添加新功能,我总是需要编辑所有工作表。这就是为什么我想用图书馆电子表格中的菜单做这样的事情:

function onOpen() {
   var ui = SpreadsheetApp.getUi();
   ui.createMenu('Actions')
             .addItem("My Library Function", "lib.trackingHelper")
             .addItem("My 2nd Library Function", "lib.anotherFunction")
             .addToUi();
}

所以我只想在所有子工作表中添加一个带有此菜单的onOpen,以免单独添加所有功能。但是我现在如何传递我的子属性?我尝试使用PropertiesService,但从子工作表执行脚本总是产生库工作表的属性范围。

是否有可能避免将所有本地函数重新映射到库函数以传递一些特定于工作表的变量?非常感谢。

【问题讨论】:

  • 考虑使用DocumentProperties
  • 不幸的是,调用库函数似乎使用库脚本/文档的属性范围,而不是子属性。我刚刚尝试过,DocumentProperties 总是引用库脚本/文档,而不是使用调用子脚本。
  • stackoverflow.com/questions/22818320/… 可能会有所帮助。或者,使用fileId 的键和适当的配置信息设置UserProperties
  • 感谢您的建议!恐怕多个用户也在使用这些脚本。到目前为止,最简单的解决方案似乎是将值直接存储在子表中并通过getRange().getValues() 检索它们,因为这种方法总是引用调用表。它既不优雅也不快速,但似乎有效。但是,也许还有另一种方法。

标签: google-apps-script google-sheets


【解决方案1】:

子工作表中的工作表属性是可变的还是静态的?

如果是静态的,则以子电子表格 ID 作为键将它们存储在属性服务中,然后使用 getactivespreadsheet().getID 从 lib 文件中提取属性。

比从工作表中读取值快得多,但我不能说我也没有从电子表格中提取变量的函数。当时这很容易,而且很有效。除非有人编辑格式或意外删除值或工作表。

【讨论】:

  • 谢谢你,这是一个伟大而简单的想法,无需读取单元格即可识别调用表。由于getRange()getValue() 调用通常会导致巨大的延迟,我可以使用ID 而不是直接读取值。目前,我在主脚本中使用设置字典。我可以毫不费力地切换到那里的 ID 密钥。
【解决方案2】:

编辑:我和你有同样的问题。我仍然需要重新映射子脚本中的所有库函数,但是我已经弄清楚了如何管理各个属性,如下所示。

--

在库中,您可以管理每个孩子的变量:

PROJECT_NAME1 = {
    name: 'abc',
    visibleOverride: false
};

PROJECT_NAME2 = {
    name: 'xyz',
    visibleOverride: true
};

在子脚本中,你可以有一个像这样的全局变量:

PROJECT = lib.PROJECT_NAME1;

在子脚本中,将全局 PROJECT 变量传递给库函数:

function hideSheet() {
    lib.Group.toggleSheetVisibility(PROJECT, false);
}

function showSheet() {
    lib.Group.toggleSheetVisibility(PROJECT, true);
}

在库中,您可以访问由原始子脚本自定义的各个设置:

Group = {

    toggleSheetVisibility: function (PROJECT, visible) {

        var sheet = SpreadsheetApp
            .getActive()
            .getActiveRange()
            .getSheet();

        if (!PROJECT.visibleOverride) {

            visible
                ? sheet.showSheet()
                : sheet.hideSheet();
        }
    }
}

【讨论】:

  • 感谢分享,这似乎也是一个优雅的解决方案。目前,我坚持使用getValues() 调用从每个电子表格中的ScriptHelper 工作表中获取各个值,因为这几乎不需要编写脚本。这样,值(它们很简单,总是字符串或数字)也可以在电子表格中维护。但是,您的解决方案将允许在一个地方管理所有单独的设置。一定会考虑的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多