You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script转键值数组为菜单时,context_menu报无菜单项错误求助

问题:Google Apps Script自定义菜单创建报错“Custom menus must contain at least one item”

我正在用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:05:44