Можно ли в пользовательское меню послать функцию, которая принимает параметры на вход?
Работаю с google apps script, понадобилось в пользовательское меню добавить функцию, которая принимает параметры на вход. В официальной документации не нашла ничего. Может кто сталкивался с подобной задачей?
Ответы (1 шт):
Можно, но зачем? Да и что значит "пеедать параметры", если вы вызываете пункт меню с именем функции, а не с самой функцией. Самое правильно в этом случае -- это предоставить для вызываемой функции контекст, который она сможет прочитать и обработать согласно настройкам, которые можно хранить где угодно: в свойствах пользователя, в кеше, на отдельном листе Таблицы и т.п.
Единственный полезный вариант -- это генерация динамичекского меню, напрмиер, из билиотеки.
Путь требуется вызывать функцию-обработчик события меню 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

