Можно ли в пользовательское меню послать функцию, которая принимает параметры на вход?

Работаю с google apps script, понадобилось в пользовательское меню добавить функцию, которая принимает параметры на вход. В официальной документации не нашла ничего. Может кто сталкивался с подобной задачей?


Ответы (1 шт):

Автор решения: oshliaer

Можно, но зачем? Да и что значит "пеедать параметры", если вы вызываете пункт меню с именем функции, а не с самой функцией. Самое правильно в этом случае -- это предоставить для вызываемой функции контекст, который она сможет прочитать и обработать согласно настройкам, которые можно хранить где угодно: в свойствах пользователя, в кеше, на отдельном листе Таблицы и т.п.

Единственный полезный вариант -- это генерация динамичекского меню, напрмиер, из билиотеки.

Путь требуется вызывать функцию-обработчик события меню 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

введите сюда описание изображения введите сюда описание изображения

→ Ссылка