Я не был уверен, как назвать название, но вот оно
мне нужна помощь, чтобы передать переменную при вызове функции внутри функции меню
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).
В вашей ситуации, если вы хотите создать пользовательское меню, используя 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)
запускается с каждым аргументом.