5 Stimmen

Verbessern Sie die Skriptleistung durch das Zwischenspeichern von Tabellenkalkulationswerten

Ich versuche, eine Web-App mit Google Apps Script zu entwickeln, die in eine Google Site eingebettet werden soll und einfach den Inhalt eines Google Sheets anzeigt und mithilfe einiger einfacher Parameter filtert. Zumindest vorerst. Ich kann später weitere Funktionen hinzufügen.

Ich habe eine funktionierende App, aber festgestellt, dass das Filtern manchmal eine Weile dauern kann, da der Client manchmal bis zu 5 Sekunden auf eine Antwort vom Server warten musste. Ich habe beschlossen, dass dies höchstwahrscheinlich darauf zurückzuführen ist, dass ich die Tabelle jedes Mal nach ID mit der SpreadsheetApp-Klasse geladen habe, wenn sie aufgerufen wurde.

Ich beschloss, die Tabellenwerte in meiner doGet-Funktion mit dem CacheService zu puffern und die Daten stattdessen jedes Mal aus dem Cache abzurufen.

Allerdings hat das aus irgendeinem Grund dazu geführt, dass ein 2-dimensionales Array nun als 1-dimensionales Array behandelt wird. Und so lande ich beim Anzeigen der Daten in einer HTML-Tabelle mit einer einzigen Spalte, wobei jede Zelle von einem einzelnen Zeichen belegt ist.

Das ist, wie ich das Caching implementiert habe; soweit ich aus der API-Referenz erkennen kann, mache ich nichts falsch:

function doGet() {
  CacheService.getScriptCache().put('data', SpreadsheetApp
                                  .openById('####')
                                  .getActiveSheet()
                                  .getDataRange()
                                  .getValues());

  return HtmlService
      .createTemplateFromFile('index')
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME);
}

function getData() {
  return CacheService.getScriptCache().get('data');
}

Dies ist das erste Mal, dass ich eine richtige Anwendung mit GAS entwickle (Ich habe es zuvor in Sheets verwendet). Gibt es etwas sehr Offensichtliches, das mir entgeht? Ich habe keine Typbeschränkungen auf der CacheService-Referenzseite gesehen...

6voto

Mogsdad Punkte 42905

CacheService speichert Strings, sodass Objekte wie Ihr zweidimensionales Array in Strings umgewandelt werden, was möglicherweise nicht Ihren Anforderungen entspricht.

Verwenden Sie das JSON-Dienstprogramm, um die Ergebnisse zu kontrollieren.

myCache.put( 'tag', JSON.stringify( myObj ) );

...

var cachedObj = JSON.parse( myCache.get( 'tag' ) );

2voto

Alan Wells Punkte 29081

Cache läuft ab. Die put Methode, ohne einen expirationInSeconds Parameter läuft nach 10 Minuten ab. Wenn Sie möchten, dass Ihre Daten länger als 10 Minuten erhalten bleiben, müssen Sie einen expirationInSeconds angeben, wobei das Maximum 6 Stunden beträgt. Wenn Sie also explizit möchten, dass die Daten nicht ablaufen, ist Cache möglicherweise nicht die beste Option.

Sie können Cache zum Beispiel für die Steuerung der Dauer verwenden, für die ein Benutzer angemeldet bleiben kann.

Sie könnten auch versuchen, eine globale Variable zu verwenden, obwohl einige Leute Ihnen sagen würden, dass Sie dies niemals tun sollten. Um eine globale Variable zu deklarieren, definieren Sie die Variable außerhalb einer Funktion.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X