Задать вопрос
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант

Как передать аргументы в функцию, вызванную из меню?

Добрый день. Есть задача - сделать меню, пункты которого загружаются из таблицы.
При статичном меню делаю так:
function onOpen() { 
  //Выполняется при открытии
  SpreadsheetApp
  .getUi()
  .createMenu('Меню')
  .addItem('Функция1','function1')
  .addItem('Функция2','function2')
  .addToUi();
};

Как можно передать функции какие-либо параметры, или узнать какой именно пункт меню был вызван, если сделать одинаковые имена функциям? Есть вариант - называть функции menuItem1, menuItem2, menuItem3 и т.п. и для каждого делать обработчик клика, который будет вызывать целевую функцию с нужными данными, но это костыль. В справке гугла функции так же строкой задаются и про параметры ничего не сказано.
  • Вопрос задан
  • 728 просмотров
Подписаться 2 Простой 3 комментария
Решения вопроса 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Допустим, у вас есть описание меню для некоторой функции

var MENU = [
  {
    caption: 'Пункт меню 1',
    functionName: 'itemMenu',
  },
  {
    caption: 'Пункт меню 2',
    functionName: 'itemMenu',
  },
  {
    caption: 'Пункт меню 3',
    functionName: 'itemMenu',
  },
];


Очевидно, что вы помимо основного меню сможете построить и меню из этого массива

function onOpen() {
  var ui = SpreadsheetApp.getUi();

  var menu = ui.createMenu('Test');

  MENU.forEach(function(item, i) {
    menu.addItem(item.caption, item.functionName + i);
  });

  menu.addToUi();
}


Положим, что itemMenu работает как-то так

function itemMenu(e) {
  var caption = e.item.caption;
  var order = e.order;
  Browser.msgBox(
    Utilities.formatString('Был нажат %sй пункт меню: %s', order + 1, caption)
  );
}


Тогда можно передать глобальному контексту обернутые колбэки с заданным аргументом

(function(self) {
  MENU.forEach(function(item, i) {
    self[item.functionName + i] = function() {
      return self[item.functionName]({ item: item, order: i });
    };
  });
})(this);


Полный листинг тут

5e5bcdbc5dd9e315037179.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы