У меня есть код кода скрипта Google App, который просит пользователя ввести некоторые значения через пользовательский диалог html. Кнопка в диалоговом окне запускает функцию в файле .gs, и я хочу дождаться возврата этой сработавшей функции, прежде чем продолжить работу с остальным кодом.
function main () {
selectSheets ();
//Below are the functions that I need openSheets to return before calling them (I'm not including their implementation here, as I don't think it's needed):
categoriesAndScoresDictionary = getCategoriesDictionary();
categoriesEntries = getCategoriesEntries(categoriesAndScoresDictionary);
//and other functions..
}
function selectSheets () {
var htmlDialog = HtmlService.createTemplateFromFile("sheets_menu")
var spreadsheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var sheetsArray = [];
for (index in spreadsheets) {
sheetsArray.push(spreadsheets [index].getSheetName());
}
htmlDialog.sheetsArray = sheetsArray;
var html = htmlDialog.evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME).setWidth(300);
SpreadsheetApp.getUi().showModalDialog(html, "Select sheets names");
return html
}
Следующая функция вызывается через onclick в html, и я хочу дождаться ее возврата, прежде чем продолжить выполнение в основной функции:
function openSheets (appsSelection, rubricsSelection) {
var spreadsheetFile = SpreadsheetApp.getActiveSpreadsheet();
Logger.log(appsSelection + " " + rubricsSelection);
//Open the sheet by name inside the opened Spreadsheet (inside the file)
//Open applications sheet:
applicationsSheet = spreadsheetFile.getSheetByName(appsSelection);
//Open rubrics sheet:
rubricsSheet = spreadsheetFile.getSheetByName(rubricsSelection);
//This function gets called from the html side and it runs successfully, I need to wait for it to return before executing other functions called in main ()
}
Это html:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<input type = "hidden" value="<?!= sheetsArray ?>" id= "sheetsArray"/>
<br>
<p>Select the name of the applications sheet:</p>
<select id = "sheetsList">
</select>
<br>
<p>Select the name of the rubrics sheet:</p>
<select id = "sheetsList2">
</select>
<br><br><br>
<center><input type= "button" value = "Confirm" onclick ="sendSelectionToJs()"/></center>
<script>
// Create the list element:
function fillSelection () {
var firstMenu = document.getElementById("sheetsList");
var secondMenu = document.getElementById("sheetsList2");
var holderArray = document.getElementById ("sheetsArray").value;
var sheetsArray = holderArray.split(",");
for (var i = 0; i<sheetsArray.length; i++){
var option = document.createElement("option");
option.value = sheetsArray[i];
option.innerHTML = sheetsArray[i];
firstMenu.appendChild(option);
}
for (var i = 0; i<sheetsArray.length; i++){
var option = document.createElement("option");
option.value = sheetsArray[i];
option.innerHTML = sheetsArray[i];
secondMenu.appendChild(option);
}
}
function sendSelectionToJs() {
var appsSelection = document.getElementById ("sheetsList").value;
var rubricsSelection = document.getElementById ("sheetsList2").value;
google.script.run.openSheets(appsSelection, rubricsSelection);
google.script.host.close();
}
fillSelection ();
</script>
</body>
</html>
Я попробовал идею о том, чтобы openSheets изменял значение флага, и я продолжал проверять значение флага перед выполнением остальных функций внутри main, но хотя значение меняется внутри openSheets, это никогда не меняется глобально.
РЕДАКТИРОВАТЬ: я пытаюсь попросить пользователя выбрать имена листов для обработки (они должны выбрать 2) в диалоговом окне html, а затем открыть эти листы через openSheets. Остальные функции, вызываемые в main ()
, должны знать имена листов, поэтому мне нужно дождаться возвращения openSheets.
Спасибо.