使用Google Apps脚本库时访问局部变量

时间:2018-10-03 16:50:40

标签: google-apps-script google-sheets

我正在使用不同的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,但是从子表执行脚本总是会产生库表的属性范围。

是否有可能避免为了传递某些工作表特定的变量而将所有局部函数重新映射到库函数的需求?非常感谢。

2 个答案:

答案 0 :(得分:1)

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

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

比从表中读取获取值要快得多,但是我不能说我也没有从电子表格中提取变量的功能。当时很容易,而且可以正常工作。除非有人编辑格式或意外删除值或工作表。

答案 1 :(得分:0)

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

-

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

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();
        }
    }
}