функция с параметром для addItem в меню электронной таблицы с помощью скрипта приложения

Мне нужно при каждом открытии электронных таблиц проверять наличие доступных листов в электронной таблице и создавать надстройку списка, которая позволяет перейти к конкретному листу, щелкнув в списке элементов

Количество листов будет большим и будет динамически добавляться в процессе работы.

Я сейчас блокирую, чтобы эта "фиктивная" функция принимала параметры, поэтому при вызове она должна открывать лист по его индексу.

function onOpen() {
  var monthPlanShortcuts = SpreadsheetApp.getUi().createMenu("Month Plan Shortcuts");
  var gotoSheet = SpreadsheetApp.getUi().createMenu("Go to sheet");
  // get properties to know who is the editor
  var userProperties = PropertiesService.getUserProperties();
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  if (sheets.length > 1) {
    for (var index = 0; index< sheets.length;index++)
    {
      var currentIndex = userProperties.setProperty("index",index);
      gotoSheet.addItem(sheets[index].getName(),"dummy");
    }
  }
  monthPlanShortcuts
    .addItem('View Current Week Plan', 'gotoCurrentWeek')
    .addItem('Go to Specific Week', 'gotoSpecificWeek')
  .addSeparator()
  .addSubMenu(gotoSheet)
  .addToUi();
}

какие-либо предложения??


person Mo SAEED    schedule 07.02.2017    source источник
comment
К сожалению, вы не можете передать значение параметра из функции в .addItem('Title of Menu Item', 'function name') вызываемой функции. Таким образом, невозможно сделать то, что вы хотите за один шаг из меню. Вам нужно будет открыть диалоговое окно или боковую панель из меню. Или откройте боковую панель автоматически при открытии электронной таблицы, и с помощью HTML и JavaScript вы можете создать что-то, что будет связывать имя листа с любым кодом, который вы хотите запустить.   -  person Alan Wells    schedule 07.02.2017
comment
@SandyGood, спасибо, но нет никакого обходного пути, например: 1 - создание функций с определенным именем и отметка их функциональности для активации листа или 2 - получение индекса списка, который также будет ссылаться на индекс листа или 3- уникальная функция, которая принимает имя функции и передается в функцию с параметрами   -  person Mo SAEED    schedule 08.02.2017
comment
Я не знаю, как можно обойтись.   -  person Alan Wells    schedule 09.02.2017


Ответы (1)


Есть хакерский обходной путь:

Динамически создавайте функции верхнего уровня, а затем обращайтесь к ним при добавлении пунктов меню.

Пример:

/**
 * @OnlyCurrentDoc
 */
function onOpen() {
  let menu = SpreadsheetApp.getUi().createMenu("Dynamic entries");
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  for (var sheet of ss.getSheets()) {
    let id = sheet.getSheetId();
    let funName = "dynamicFun" + id;
    menu.addItem(sheet.getName() + "(" + id + ")", funName)
  }
  menu.addToUi();
}

for (var sheet of SpreadsheetApp.getActiveSpreadsheet().getSheets()) {
  let id = sheet.getSheetId();
  let funName = "dynamicFun" + id;
  this[funName] = function() { myRealFun(id); };
}

function myRealFun(id) {
  SpreadsheetApp.getUi().alert("" + id + " was pressed");
}
person Florian Loitsch    schedule 31.12.2020