Дождитесь выполнения функции в ГАЗЕ - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть код кода скрипта 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.

Спасибо.

1 Ответ

1 голос
/ 26 апреля 2020

Невозможно сделать так, чтобы код на стороне сервера ожидал завершения кода на стороне клиента до sh. ИМХО, вам следует изменить логику c вашего скрипта:

  1. Используйте функцию на стороне сервера, чтобы открыть диалоговое окно / боковую панель. Обычно такого рода функции не включают в себя что-то еще, поскольку открытие диалогового окна / боковой панели является асинхронным.
  2. Код на стороне клиента должен вызывать функцию на стороне сервера, которая может возвращать поддерживаемый объект JavaScript. Эта серверная функция может использоваться для вызова других серверных функций, которые должны запускаться синхронно (в определенном порядке c).

Related

...