Как заставить скрипт Google Apps ждать, пока пользователь выберет кнопку на одном HtmlOutput, прежде чем загружать следующий htmlOutput?

1

Я начинающий/любительский javascript/программа для сценариев Google Apps, поэтому, пожалуйста, простите меня, если ответ будет очевиден. Кроме того, это может быть настолько очевидно, что я даже не знаю правильного поискового запроса, чтобы найти свой ответ. Если это так, я сожалею об этом.

Я пишу функцию Google Apps Script, которая идеально загружала бы ряд окон HtmlOutput с каждым последующим открытием окна после того, как пользователь закрыл предыдущий. Однако, когда я пытаюсь запустить его, скрипт загружает все окна в порядок, не дожидаясь закрытия пользователем предыдущего окна.

Я также прекрасно понимаю, что использовать функцию Utilities.sleep() не рекомендуется. Однако, интересно, это единственный способ добиться этого в этом случае. Похоже, что будет более очевидный, лучший способ.

Как заставить программу ждать ответа пользователя перед загрузкой следующего окна?

Вот пример кода:

//THIS FUNCTION SETS UP THE HTMLOUTPUT
function setDialog(userText){
   var displayHtml = HtmlService.createHtmlOutput(
     '<!DOCTYPE html>'+
     '<html>'+
     '<head>'+
        '<base target="_top">'+
     '</head>'+
     '<body>'+
        '<h1>'+userText+'</h1>'+
        '<input type="button" value="Close" '+
            'onclick="google.script.host.close()" />'+
     '</body>'+
     '</html>');
   SpreadsheetApp.getUi()
     .showModalDialog(displayHtml, 'Here your HTML!');
}

//THIS FUNCTION DISPLAYS 4 DIALOGS BASED ON VARIABLES
function displayDialogs(){
   var uOne = 'One';
   var uTwo = 'Two';
   var uThree = 'Three';
   var uFour = 'Four';
   setDialog(uOne);
   setDialog(uTwo);
   setDialog(uThree);
   setDialog(uFour);
}

Поведение, которое я хочу выше, было бы следующим:

  1. Диалог: "Один" → Пользователь щелкает закрыть
  2. Диалог: "Два" → Пользователь щелкает закрыть
  3. Диалог: "Три" → Пользователь щелкает закрыть
  4. Диалог: "Четыре" → Пользователь щелкает закрыть

Вместо этого я получаю:

  1. Диалог: "Один", "Диалог": "Два", "Диалог": "Три", "Диалог": "Четыре" в быстрой последовательности.
  2. А затем пользователь может нажать, чтобы закрыть 4-й диалог.

Заранее спасибо за помощь, и я сожалею, если это обман. Я искал ответ перед публикацией.

Теги:
modal-dialog
google-apps-script

1 ответ

1
Лучший ответ

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

Глобальная переменная как объект JSON помогает контролировать поток. Кнопка "Закрыть" должна иметь в ней вызов функции google.script.run перед закрытием диалогового окна для открытия следующего диалогового окна.

var GLOBAL_OBJECT_FOR_NEXT_DISPLAY = {//Use all caps for Global variables
  "1":"Two",
  "2":"Three",
  "3":"Four"

}

//THIS FUNCTION SETS UP THE HTMLOUTPUT
function setDialog(userText, thisLoop){
   var displayHtml = HtmlService.createHtmlOutput(
     '<!DOCTYPE html>'+
     '<html>'+
     '<head>'+
        '<base target="_top">'+
     '</head>'+
     '<body>'+
        '<h1>'+userText+'</h1>'+
        '<input type="button" value="Close" '+
            'onclick="google.script.run.showNext(' + thisLoop + ');google.script.host.close(); " />'+
     '</body>'+
     '</html>');
   SpreadsheetApp.getUi()
     .showModalDialog(displayHtml, "Here your HTML!");
}

//THIS FUNCTION DISPLAYS 4 DIALOGS BASED ON VARIABLES
function displayDialogs(){
   var uOne = 'One';
   setDialog(uOne,1);
}

function showNext(count) {
  var whatNext;

  count = count.toString();
  Logger.log('count: ' + count)

  whatNext = GLOBAL_OBJECT_FOR_NEXT_DISPLAY[count];
  Logger.log('whatNext: ' + whatNext)

  if (!whatNext) {return;}//Stop if there is no next value found

  setDialog(whatNext,Number(count) + 1);

}
  • 0
    Спасибо, Сэнди, ты ответил на мой вопрос. Я возлюсь с этим немного, чтобы соответствовать моему конкретному случаю использования. Одна идея состоит в том, чтобы использовать массив вместо объекта, чтобы его было легче повторять. У меня также есть некоторые проблемы с передачей других параметров с помощью google.script.run но это лучше оставить для отдельного вопроса. Еще раз спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню