2016-06-17 11 views
0

Ich schrieb einen Google Apps-Skript-Code, es wird ein Google-Tabellenblatt öffnen und die Werte nach Zeilen auflisten, aber es gibt 2 Probleme: 1. Die Ausgabe in zufälliger Reihenfolge. 2. Der Div-Text mit der ID "loding" ändert sich in "Finished!" vor Liste aller Werte. Ich dachte, das Skript wird auf die serverseitige Funktionsrückgabe warten, wenn ich es mit "withSuccessHandler()" ausführe, aber das ist es nicht. Wie kann ich das korrigieren?Wie google apps Skript serverseitige Funktionen synchron aufrufen?

index.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <base target="_top"> 
     <script> 
      function jsListValue() { 
       // Get count. 
       google.script.run.withSuccessHandler(function(count) { 
        // List all values. 
        for(count; count>0; count=count-1) { 
         // Get a value. 
         google.script.run.withSuccessHandler(function(content) { 
          // Shows in "output". 
          var new_div = document.createElement("div"); 
          new_div.appendChild(document.createTextNode(content)); 
          document.getElementById("output").appendChild(new_div); 
         }).gsGetValue(count); 
        } 
        // Change loding notice. 
        document.getElementById("loding").innerHTML = "Finished!"; 
       }).gsGetCount(); 
      } 
     </script> 
    </head> 
    <body onload="jsListValue()"> 
     <div id="output"></div> 
     <div id="loding">Loding now...</div> 
    </body> 
</html> 

code.gs

function    doGet() { 
    return HtmlService.createHtmlOutputFromFile('index').setSandboxMode(HtmlService.SandboxMode.IFRAME); 
} 
function    gsOpenSheet() { 
    // Return sheet of the note data. 
    return (SpreadsheetApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").getSheetByName("sheet1")); 
} 
function    gsGetCount() { 
    // Return last row index in this sheet. 
    return (gsOpenSheet().getLastRow()); 
} 
function    gsGetValue(index) { 
    // Return value in the (index,1). 
    return (gsOpenSheet().getRange(index,1).getValue()); 
} 
+0

Sie nicht einzelne Werte in diesem Fall bekommen sollte. Sie müssen in diesem Fall keine individuellen Werte abrufen, da der Index die Zeile ist und die Zeilen alle zusammenhängend sind. Wenn Sie nicht zusammenhängende Zeilen benötigen, wäre das anders. Sie führen mehrere schnelle Aufrufe an dieselbe serverseitige Funktion aus. Die Reihenfolge, in der die Serverseite funktioniert, kann in dieser Situation nicht garantiert werden. Mehrere Instanzen derselben Funktion werden gleichzeitig ausgeführt. Sie werden nicht unbedingt in der Reihenfolge ausgeführt, da serverseitige Funktionen gleichzeitig ausgeführt werden können. –

+0

Zugehörig: http://stackoverflow.com/questions/35749500/client-javascript-receiving-outdated-values-from-server-side-document-set-and-fe/35752170 –

Antwort

2

GAS ist sehr ähnlich wie Javascript, und alle Anrufe an die Google-Funktionen Server-Seite sind asynchron. Du kannst das nicht ändern (zumindest habe ich keine Dokumentregistrierung gesehen).

Was Sie tun können, ist, verwenden Sie eine Callback-Funktion auf der Client-Seite, die den Server für einen "Erfolg" Rückgabewert abfragt. Es wird weiterhin 1 Minute lang Polling sagen oder aber beenden. Lassen Sie ein Client-Flag auf "true" setzen, wenn der Erfolgswert vom Server zurückgegeben wird. Auf der Clientseite sollte nichts weitergehen, es sei denn, das Flag ist wahr. Auf diese Weise können Sie steuern, was auf der Client-Seite passiert.

+0

Apps-Skript hat eine eingebaute Möglichkeit zu handhaben dies, siehe meine Antwort unter – howMuchCheeseIsTooMuchCheese

+0

@howMuchCheeseIsTooMuchCheese gut ya, das ist die dokumentierte Methode. Aber die serverseitigen Funktionen werden immer noch asynchron aufgerufen, im Gegensatz zu dem, was das OP wollte. –

0

Sie verwenden möchten withSuccessHandlerDocs

<!DOCTYPE html> 
<html> 
    <head> 
    <base target="_top"> 
    <script> 
     function onSuccess(numUnread) { 
     var div = document.getElementById('output'); 
     div.innerHTML = 'You have ' + numUnread 
      + ' unread messages in your Gmail inbox.'; 
     } 

     google.script.run.withSuccessHandler(onSuccess) 
      .getUnreadEmails(); 
    </script> 
    </head> 
    <body> 
    <div id="output"></div> 
    </body> 
</html> 
Verwandte Themen