2017-10-27 2 views
1

Ich bin ein Anfänger/Amateur-Javascript/Google Apps Script-Programmierer, also bitte vergib mir, wenn die Antwort offensichtlich sein sollte. Außerdem kann es so offensichtlich sein, dass ich nicht einmal den richtigen Suchbegriff kannte, um meine Antwort zu finden. Wenn es so ist, tut es mir leid für den Betrogenen.Wie kann ich Google Apps Script erzwingen, dass der Benutzer vor dem Laden des nächsten htmlOutput eine Schaltfläche auf einem HtmlOutput auswählt?

Ich schreibe eine Google Apps Script-Funktion, die idealerweise eine Reihe von HtmlOutput-Fenstern mit jedem folgenden Fenster öffnen würde, nachdem der Benutzer das vorherige Fenster geschlossen hat. Wenn ich jedoch versuche, es auszuführen, lädt das Skript alle Fenster der Reihe nach, ohne darauf zu warten, dass der Benutzer das vorherige Fenster schließt.

Ich bin mir auch etwas bewusst, dass es nicht beste Praxis ist, die Utilities.sleep() Funktion zu verwenden. Ich frage mich jedoch, ob dies der einzige Weg ist, dies in diesem Fall zu erreichen. Es scheint, dass es einen offensichtlicheren, besseren Weg geben würde.

Wie kann ich das Programm zwingen, auf die Antwort des Benutzers zu warten, bevor das nächste Fenster geladen wird? Hier

ist ein Beispielcode:

//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); 
} 

Das Verhalten, das ich oben würde sein wollen:

  1. Dialog: 'One' -> Benutzer klickt schließen
  2. Dialog: 'Two' -> Benutzer klickt auf Schließen
  3. Dialog: 'Drei' -> Benutzer klickt auf Schließen
  4. Dialog: 'Vier' -> Benutzer klickt auf Schließen

Stattdessen erhalte ich:

  1. Dialog: 'One', Dialog: 'Zwei', Dialog: 'Drei', Dialog: 'Vier' in schnellen Folge.
  2. Und dann kann der Benutzer klicken, um den vierten Dialog zu schließen.

Vielen Dank im Voraus für die Hilfe, und es tut mir leid, wenn dies ein Betrogener ist. Ich habe vor dem Posten nach einer Antwort gesucht.

Antwort

1

Die folgende Änderung Ihres Codes zeigt aufeinanderfolgende Dialoge nacheinander an, nur wenn der vorherige geschlossen ist, und stoppt, wenn keine weiteren angezeigt werden.

Eine globale Variable als JSON-Objekt hilft, den Fluss zu steuern. Der "Schließen" -Button muss einen google.script.run Funktionsaufruf enthalten, bevor der Dialog geschlossen wird, damit der nächste Dialog geöffnet wird.

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); 

} 
+0

Danke, Sandy, Sie haben meine Frage beantwortet. Ich fummle etwas daran herum, um meinen genauen Anwendungsfall zu erfüllen. Eine Idee besteht darin, ein Array anstelle eines Objekts zu verwenden, damit es leichter iterierbar ist. Ich habe auch Probleme mit der Übergabe anderer Parameter mit 'google.script.run', aber das ist besser für eine separate Frage. Danke noch einmal! – snoski

Verwandte Themen