5 Stimmen

Verbessern Sie die Skriptleistung durch Zwischenspeichern von Tabellenwerten

Ich versuche, eine Web-App mit Hilfe von 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. Später könnte ich weitere Funktionen hinzufügen.

Ich habe eine funktionale App bekommen, 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 entschied, dass dies höchstwahrscheinlich daran lag, dass ich das Tabellenblatt jedes Mal, wenn es aufgerufen wurde, mit der ID über die Klasse SpreadsheetApp geladen habe.

Ich entschied mich dafür, die Tabellenblattwerte in meiner doGet-Funktion mit dem CacheService zu zwischenspeichern und die Daten jedes Mal stattdessen aus dem Cache abzurufen.

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

So habe ich das Caching implementiert; meiner Meinung nach mache ich laut der API-Referenz 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

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

Verwenden Sie das JSON-Hilfsprogramm, um die Ergebnisse zu steuern.

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 ausdrücklich möchten, dass die Daten nicht ablaufen, ist Cache möglicherweise nicht die beste Option.

Sie können Cache beispielsweise verwenden, um zu steuern, wie lange ein Benutzer angemeldet bleiben kann.

Sie könnten auch versuchen, eine globale Variable zu verwenden, von der Ihnen einige Leute sagen würden, dass Sie sie niemals verwenden 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