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

Я не был уверен, как назвать название, но вот оно

мне нужна помощь, чтобы передать переменную при вызове функции внутри функции меню

function onOpen(){

  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Custom Menu')
    .addSubMenu
    (ui.createMenu('Save')
      .addItem('Save All', 'doSaveAll')
      .addSeparator()
      .addItem('Save Grafics (Trade - Options - BTC - Termo - Future -  Fund)', 'doSaveSheets')
      .addSeparator()
      .addItem('Save Trade',   'doSaveSheet("Trade")')
      .addItem('Save Options', 'doSaveSheet("Opções")')
      .addItem('Save BTC',     'doSaveSheet("BTC")')
      .addItem('Save Termo',   'doSaveSheet("Termo")')
      .addItem('Save Future',  'doSaveSheet("Future")')
      .addItem('Save Fund',    'doSaveSheet("Fund")')
      .addSeparator()
      .addItem('Save Proventos','doSaveProventos')
      .addSeparator()
      .addItem('Save Balanço (BLC - DRE - FLC - DVA)','doSaveDatas')
    //....
    )
    .addToUi();
};

когда я пытаюсь из меню использовать торговлю, я получаю сообщение об ошибке

Função de script não encontrada: doSaveSheet("Trade")

я думаю, это будет что-то вроде

Function script was not found: doSaveSheet("Trade")

есть ли способ из меню вызвать эту функцию с этой переменной или мне нужно обойти что-то вроде:

function menuSaveTrade() {
  doSaveSheet('Trade');
}

      .addItem('Save Trade',   'menuSaveTrade()')

это помешало бы созданию функции, структурированной следующим образом:

function doSaveSheets() 
{
  const sheetNames = ['Trade', 'Opções', 'BTC', 'Termo', 'Future', 'Fund'];
  
  sheetNames.forEach(sheetName => 
  {
    try 
    {
      doSaveSheet(sheetName);
    } 
    catch (error) 
    {
      console.error(`Error saving sheet ${sheetName}:`, error);
    }
  });
}

function doSaveSheet(sheetName) 
{
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ss_t = ss.getSheetByName(sheetName);                                 // ss_s = target spreadsheet
  const ss_c = ss.getSheetByName('Config');                                  // ss_c = config spreadsheet

  Utilities.sleep(2500); // 2,5 secs

  console.info('Save:', sheetName);

  if (sheetName === 'Trade') 
  {
      var C2_ = ss_t.getRange('C2').getValue();  

      var Proventos = ss_c.getRange(ENP).getDisplayValue();        // ENP = Enable Proventos
      var Save = ss_c.getRange(STR).getDisplayValue();             // STR = Save to Trade 

    const ss_p = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Prov');

      var B3_ = ss_p.getRange('B3').getDisplayValue();  

    if ( ( B3_ == "Proventos" || Proventos != "TRUE" ) && ( C2_ > 0 ) )  // check if error
    {
      processSaveSheet(ss_t, sheetName, Save) 

      doExportSheet(sheetName)                                     // Special case to export alone
    }

  doCheck(sheetName)
  }
//.......
}

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

🤔 А знаете ли вы, что...
JavaScript может выполняться как на стороне клиента (в браузере), так и на стороне сервера (с использованием Node.js).


1
50
1

Ответ:

Решено

В вашей ситуации, если вы хотите создать пользовательское меню, используя doSaveSheet(sheetName) с аргументами ['Trade', 'Opções', 'BTC', 'Termo', 'Future', 'Fund'], как насчет следующего обходного пути?

В этом обходном пути пользовательское меню создается динамически. Этот обходной путь относится к этому ответу.

Когда это отражено в образце сценария, получается следующее.

Пример сценария:

Скопируйте и вставьте следующий скрипт в редактор скриптов Google Spreadsheet. И снова откройте таблицу Google. Таким образом создается пользовательское меню.

setCustomMenu(); // In this workaround, please don't remove this line.
function onOpen() { } // In this workaround, please don't remove this line.

function setCustomMenu() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('Custom Menu');
  var subMenu = ui.createMenu('Save')
    .addItem('Save All', 'doSaveAll')
    .addSeparator()
    .addItem('Save Grafics (Trade - Options - BTC - Termo - Future -  Fund)', 'doSaveSheets')
    .addSeparator();
  var obj = [ // This is from your showing script.
    { name: 'Save Trade', arg: 'Trade' },
    { name: 'Save Options', arg: 'Opções' },
    { name: 'Save BTC', arg: 'BTC' },
    { name: 'Save Termo', arg: 'Termo' },
    { name: 'Save Future', arg: 'Future' },
    { name: 'Save Fund', arg: 'Fund' },
  ];
  obj.forEach(({ name, arg }, i) => {
    var fn = `func${i}`;
    this[fn] = function (arg) {
      return function () { return doSaveSheet(arg) };
    }(arg);
    subMenu.addItem(name, fn);
  });
  subMenu.addSeparator()
    .addItem('Save Proventos', 'doSaveProventos')
    .addSeparator()
    .addItem('Save Balanço (BLC - DRE - FLC - DVA)', 'doSaveDatas')
  //...
  menu.addSubMenu(subMenu).addToUi();
}

function doSaveSheets() {

  // Please replace this script with your actual script of doSaveSheets().

}

function doSaveSheet(sheetName) {

  Browser.msgBox(sheetName);
  // Please replace this script with your actual script of doSaveSheet(sheetName).

}

Тестирование:

При тестировании приведенного выше сценария получается следующий результат. В этом тесте запускается Browser.msgBox(sheetName);. Вы можете видеть, что функция doSaveSheet(sheetName) запускается с каждым аргументом.

Ссылка: