Марина Asked:2024-03-01 13:55:57 +0000 UTC2024-03-01 13:55:57 +0000 UTC 2024-03-01 13:55:57 +0000 UTC 是否可以将一个函数发送到以参数作为输入的用户菜单? 772 我正在使用谷歌应用程序脚本,我需要向接受输入参数的用户菜单添加一个函数。我在官方文档中没有找到任何内容。有人遇到过类似的问题吗? google-apps-script 1 个回答 Voted Best Answer oshliaer 2024-03-01T18:38:13Z2024-03-01T18:38:13Z 这是可能的,但为什么呢?如果您使用函数名称而不是函数本身调用菜单项,那么“编辑参数”意味着什么。在这种情况下,最正确的做法是为被调用的函数提供一个上下文,它可以根据可以存储在任何地方的设置来读取和处理该上下文:在用户属性中、在缓存中、在表的单独工作表中等。 唯一有用的选项是生成动态菜单,例如从库中生成。 调用菜单事件处理函数所需的路径dynamicMenuItem /* exported dynamicMenuItem */ function dynamicMenuItem(e) { var caption = e.item.caption; var order = e.order; Browser.msgBox(Utilities.formatString('Был нажат %sй пункт меню: %s', order + 1, caption)); } 需要提前在环境中注册调用函数globalThis (function (self) { DYNAMIC_MENU_CONFIG.forEach(function (item, i) { self[item.functionName + i] = function () { return self[item.functionName]({ item: item, order: i }); }; }); })(this); 我们从全局变量中获取菜单设置 /** * @typedef {{ * caption: string, * functionName: string * }} GSRU.DynamicMenu */ const DYNAMIC_MENU_CONFIG = [ { caption: 'Пункт меню 1', functionName: 'dynamicMenuItem', }, { caption: 'Пункт меню 2', functionName: 'dynamicMenuItem', }, { caption: 'Пункт меню 3', functionName: 'dynamicMenuItem', }, ]; 更新并获取菜单 /* exported getDynamicMenu_ */ /** * * @param {GoogleAppsScript.Base.Ui} ui * @param {string} name */ function getDynamicMenu_(ui, name) { var menu = ui.createMenu(name); configDynamicMenu_(menu, DYNAMIC_MENU_CONFIG); return menu; } /** * @param {GoogleAppsScript.Base.Menu} menu * @param {GSRU.DynamicMenu[]} config */ function configDynamicMenu_(menu, config) { config.forEach(function (item, i) { menu.addItem(item.caption, item.functionName + i); }); } 将菜单添加到当前表 .addSubMenu(getDynamicMenu_(SpreadsheetApp.getUi(), 'Динамическое меню')) 表中的工作示例https://docs.google.com/spreadsheets/d/1KN2SuXbHN5ETss9Sj4WOTOIyxuxHUpuI_8GFewwtkBc/edit?usp=sharing
这是可能的,但为什么呢?如果您使用函数名称而不是函数本身调用菜单项,那么“编辑参数”意味着什么。在这种情况下,最正确的做法是为被调用的函数提供一个上下文,它可以根据可以存储在任何地方的设置来读取和处理该上下文:在用户属性中、在缓存中、在表的单独工作表中等。
唯一有用的选项是生成动态菜单,例如从库中生成。
调用菜单事件处理函数所需的路径
dynamicMenuItem需要提前在环境中注册调用函数
globalThis我们从全局变量中获取菜单设置
更新并获取菜单
将菜单添加到当前表
表中的工作示例https://docs.google.com/spreadsheets/d/1KN2SuXbHN5ETss9Sj4WOTOIyxuxHUpuI_8GFewwtkBc/edit?usp=sharing