Google Apps Script转键值数组为菜单时,context_menu报无菜单项错误求助
我正在用Google Apps Script把键值数组转成自定义菜单,目前基于SpreadsheetApp开发,想适配其他应用。现在遇到的问题是调用context_menu()方法时,m.addToUi()行抛出异常:Exception: Custom menus must contain at least one item。我已经用simple_menu()验证了菜单创建逻辑是可行的,但找不到context_menu()的问题所在。
相关代码如下:
var f = 'my_function' var m_contex = {"Item1":f, "Item2":f, "SubMenu":{"subItem1":f, "subItem2":f}, "Item3":f} function my_function(){ Logger.log("triggered"); } function cm_rec(ui, m, name, items){ var sm = ui.createMenu(name); m.addSubMenu(sm); for(var key in items){ if(typeof items[key] === "string"){ Logger.log("adding " + key + " to "+name); sm.addItem(key, items[key]); }else{ cm_rec(ui, sm, key, items[key]); } } } function context_menu(ui, title, items){ var m = ui.createMenu(title); for(var key in items){ if(typeof items[key] === "string"){ Logger.log("adding " + key + " to "+title); m.addItem(key, items[key]); }else{ cm_rec(ui, m, key, items[key]); } } m.addToUi(); } function simple_submenu(ui, m, title){ var sm = ui.createMenu(title); sm.addItem("SubItem1", 'my_function'); sm.addItem("SubItem2", 'my_function'); m.addSubMenu(sm); } function simple_menu(ui){ var m = ui.createMenu("My Menu"); m.addItem("Item1", 'my_function'); m.addItem("Item2", 'my_function'); simple_submenu(ui, m, "SubMenu"); m.addItem("Item3", 'my_function'); m.addToUi(); } function tester1(){ //runs the simple_menu var ui = SpreadsheetApp.getUi(); Logger.log("Creating Simple Menu"); simple_menu(ui); } function tester2(){ // runs the context_menu var ui = SpreadsheetApp.getUi(); Logger.log(m_contex); context_menu(ui, "Custom Menu", m_contex); }
tester2的执行日志显示已添加菜单项,但仍报错:
2:44:27 PM Info {Item3=my_function, Item1=my_function, SubMenu={subItem2=my_function, subItem1=my_function}, Item2=my_function} 2:44:27 PM Info adding Item1 to Custom Menu 2:44:27 PM Info adding Item2 to Custom Menu 2:44:27 PM Info adding subItem1 to SubMenu 2:44:27 PM Info adding subItem2 to SubMenu 2:44:27 PM Info adding Item3 to Custom Menu
解决方案
问题根源在递归函数cm_rec里:你先创建子菜单sm,立刻就调用m.addSubMenu(sm)把它加到父菜单,但此时sm还没有任何菜单项。Google Apps Script要求添加到父菜单的子菜单必须至少包含一个可点击项,addSubMenu是立即生效的,空的子菜单会导致整个菜单结构被判定为无效。
只需要调整cm_rec的执行顺序:先给子菜单添加所有菜单项,最后再把它加到父菜单里。修改后的cm_rec函数如下:
function cm_rec(ui, m, name, items){ var sm = ui.createMenu(name); // 先添加所有菜单项和子菜单 for(var key in items){ if(typeof items[key] === "string"){ Logger.log("adding " + key + " to "+name); sm.addItem(key, items[key]); }else{ cm_rec(ui, sm, key, items[key]); } } // 所有项添加完成后,再将子菜单加入父菜单 m.addSubMenu(sm); }
修改后运行tester2,菜单就能正常创建,同时保留了适配不同Google Workspace应用UI对象的通用性。
内容的提问来源于stack exchange,提问作者Scott Paterson
相关产品推荐
相关产品推荐

