图书馆定义的Google表格菜单

时间:2017-05-25 05:30:12

标签: javascript google-apps-script google-sheets

我目前正致力于将更新分发到Google表格而无需用户更新任何内容。这符合我必须满足的规范。 到目前为止,这是使用每个工作表绑定脚本的应用程序脚本库和样板代码完成的。

现在需要在工作表内具有自定义菜单,其菜单文本和功能也可以集中更新。我对如何实现这一点的想法是在库中定义菜单项及其相关功能。

function getMenu() {
  var menus = []
  var obrMenu = {name: 'obrMenu', menuItems: []};
  obrMenu['menuItems'].push({name: "Alert", func: "alert('Success')"});
  menus.push(obrMenu);
  return menus;
}

然后在容器脚本中使用以下内容将其转换为可用于创建菜单的内容。

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menus = lib.getMenu();
  for (var i = 0; i < menus.length; i++) {
    var cur = menus[i];
    var items = cur['menuItems'];
    var menuItems = []; 
    for (var j = 0; j < items.length; j++) {
      var curFunc = new Function(
       "return function " + items[j]['name'] + "(){" + items[j]['func'] + "}"
      )();
      menuItems.push({name: items[j]['name'], funcName: curFunc.name});
    }
    ss.addMenu(cur['name'], menuItems);
  }
}

此方法运行时会产生错误

Invalid argument: subMenus (line 15, file "Code")

subMenus是我称之为menuItems的Apps Script参数名称。虽然我收集这个问题可能取决于生成的函数的范围,我似乎无法看到如何绕过它。

任何建议都将不胜感激。非常感谢。

1 个答案:

答案 0 :(得分:1)

修正此行

      menuItems.push({name: items[j]['name'], functionName: curFunc.name});

使用'funcName'而不是GAS文档中定义的'functionName'会让人感到困惑。显然,子菜单对象属性名称不能更改。