在加载下一个htmlOutput之前,如何强制Google Apps脚本等待用户在一个HtmlOutput上选择一个按钮?

时间:2017-10-27 23:30:35

标签: javascript google-apps-script modal-dialog

我是新手/业余javascript / Google Apps脚本程序员,如果答案显而易见,请原谅我。此外,可能很明显,我甚至不知道正确的搜索词来找到我的答案。如果是这样,我很抱歉这个骗子。

我正在编写一个Google Apps脚本功能,理想情况下会在用户关闭之前的每个后续窗口后加载一系列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's 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. 对话:'一' - &gt;用户点击关闭
  2. 对话:'两个' - &gt;用户点击关闭
  3. 对话:'三' - &gt;用户点击关闭
  4. 对话:'四' - &gt;用户点击关闭
  5. 相反,我得到了:

    1. 对话:'一',对话:'二',对话:'三',对话:'四'快速连续。
    2. 然后用户可以单击关闭第4个对话框。
    3. 提前感谢您的帮助,如果这是一个骗局,我很抱歉。我在发布之前就找到了答案。

1 个答案:

答案 0 :(得分: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's 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);

}