我目前正致力于将更新分发到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参数名称。虽然我收集这个问题可能取决于生成的函数的范围,我似乎无法看到如何绕过它。
任何建议都将不胜感激。非常感谢。
答案 0 :(得分:1)
修正此行
menuItems.push({name: items[j]['name'], functionName: curFunc.name});
使用'funcName'而不是GAS文档中定义的'functionName'会让人感到困惑。显然,子菜单对象属性名称不能更改。