【问题标题】:Spreadsheet onOpen menu from a Library从库中打开菜单的电子表格
【发布时间】:2012-10-11 14:52:59
【问题描述】:

我将在几个用户之间分发一个带有 onOpen 菜单的电子表格。我想将菜单定义和功能保留在库中,所以如果我添加一些菜单选项或更新一些功能,使用该电子表格的每个人都会自动更新。

到目前为止,在电子表格脚本上我只有这个简单的代码:

function onOpen() {
  myLib.loadMenu();
}

菜单加载到电子表格上没有问题,但是无论我如何命名菜单上的调用和实际函数(有或没有 myLib。)我总是收到错误“找不到脚本函数 doSomething”时使用该菜单中的选项。

关于我应该如何命名菜单中的函数调用和库中的实际函数的任何想法,以使这种方法起作用。

谢谢,福斯托

EDIT-1:让我提供更多细节和示例代码

我的目标是能够从库中为该电子表格菜单添加更多选项,而无需更新每个用户的电子表格。

这是所有包含在电子表格脚本中的示例代码,尚未使用任何库,它可以正常工作

function onOpen() {
  testMenu();
}
function testMenu() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu(
    'Testing', [
      { name: 'Do Something #1', functionName: 'someFunction1' },
      null,
      { name: 'Do Something #2', functionName: 'someFunction2' } ]);
}
function someFunction1() {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue("Hello from someFunction1");
}
function someFunction2() {
  SpreadsheetApp.getActiveSheet().getRange("A2").setValue("Bye from someFunction2");
}

我想要做的是获得相同的功能,但在电子表格脚本和库之间拆分代码,如下所示

关于电子表格脚本

function onOpen() {
  xsLib.testMenu();
}

在图书馆

function testMenu() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu(
    'Testing', [
      { name: 'Do Something #1', functionName: 'someFunction1' },
      null,
      { name: 'Do Something #2', functionName: 'someFunction2' } ]);
}
function someFunction1() {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue("Hello from someFunction1");
}
function someFunction2() {
  SpreadsheetApp.getActiveSheet().getRange("A2").setValue("Bye from someFunction2");
}

在这种拆分方法中,从库调用构建的菜单在电子表格上正确显示,但是当使用该测试菜单中的选项时,我收到一条消息错误,例如:“找不到脚本函数 someFunction1”

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    最后我检查了你不能给脚本中不包含的触发器函数。您最可能需要做的是在脚本中为您的 scpreadsheet 创建一个包装函数。像这样的:

    function doSomething() {
      myLib.doSomething();
    }
    

    编辑: 您正在寻找的功能目前不可用。要达到预期的效果,您需要指定您要调用的函数属于库,并且不允许这样做。

    对此有一个功能请求:

    http://code.google.com/p/google-apps-script-issues/issues/detail?id=799

    如果您有兴趣拥有此功能,请在此问题上投票以提高其优先级。

    最好的,

    安东

    【讨论】:

    • 感谢 Anton,这就是我迄今为止所做的,但这种方法不允许我从库中向电子表格菜单添加新项目。假设该库被“包含”在脚本中,对吧?
    • 您能否描述一个您想添加菜单项的过程?即步骤是什么?
    • 正在做一个更好的解释,今晚晚些时候我会发布一个编辑,再次感谢
    • @FaustoR。啊哈,现在我明白你要做什么了。不幸的是,当前版本的 GAS 无法做到这一点。我在回答中添加了一些解释
    【解决方案2】:

    错误如:“找不到脚本函数 someFunction1” 正在尝试在“本地”代码而不是 lib 中调用 someFunction1

    看; https://code.google.com/p/google-apps-script-issues/issues/detail?id=1346

    您可以通过向“本地”代码添加存根函数来解决此问题。

    【讨论】:

      【解决方案3】:

      好消息!这适用于新的 Google 表格。现在是 2014 年 4 月 4 日,您仍然需要前往 Google 云端硬盘设置并选中“使用新的 Google 表格”。 (注意:测试版 = 错误)。这仅适用于新的表格,如果您正在处理旧表格,它将无法工作。

      ~~在你的图书馆里~~

      var menu = SpreadsheetApp.getUi().createMenu('Magical Menu');
      menu.addItem('Do The Thing', 'LibraryName.function_name');
      menu.addToUi();
      

      ~~~

      【讨论】:

      • 不错。 SpreadsheetApp.getActive().addMenu() 无法为库函数使用点符号。 SpreadsheetApp.getUi().createMenu() 成功。
      【解决方案4】:

      这就是我解决工作的方法

      // ----myLibrary----
      function loadMenu() {
        var menuList = [
          { name: 'New', functionName: 'myLibrary.addData' },
          { name: 'Modify', functionName: 'myLibrary.modifyData' },
          { name: 'Delete', functionName: 'myLibrary.deleteData' },
        ];
      
        return menuList;
      }
      
      function modifyData() {
        Logger.log('called by modifyData');
      }
      
      function addData() {
        Logger.log('called by addData');
      }
      
      function deleteData() {
        Logger.log('called by deleteData');
      }
      // ----myLibrary----
      
      // -----Client-------
      function onOpen() {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var menuList = myLibrary.loadMenu();
        ss.addMenu('Custom Menu', menuList);
      }
      // -----Client-------
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多