2017-05-25 97 views
0

我目前正致力于将更新发布到Google表格的方式,而无需用户在其最后更新任何内容。这符合我必须满足的规范。 这是迄今为止使用每个表单绑定脚本的应用程序脚本库和样板代码完成的。图书馆定义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") 

与子菜单是什么,我呼吁menuItems Google Apps脚本参数名称。虽然我收集这个问题可能是由于生成的函数的范围,我似乎无法看到如何绕过它。

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

回答

1

修复此行

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

使用“了funcName”,而不是作为GAS文档中定义“functionName”是什么打乱它。显然,子菜单对象属性名称不能更改。

+0

啊,谢谢你发现那个错误。虽然这解决了一个问题,但库传递的脚本仍然不能使用可能是范围事物的函数。我想我必须在脚本中重构我的样板代码,以便将函数定义传递给它们,然后在那里进行评估。谢谢你的帮助。 – dbr