我是新手/业余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);
}
我想要的行为是:
相反,我得到了:
提前感谢您的帮助,如果这是一个骗局,我很抱歉。我在发布之前就找到了答案。
答案 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);
}