it-swarm.com.de

Aktualisieren Sie Daten, die von einer benutzerdefinierten Funktion in Google Sheet abgerufen wurden

Ich habe ein benutzerdefiniertes Google Apps-Skript geschrieben, das ein id erhält und Informationen von einem Webdienst abruft (ein Preis).

Ich verwende dieses Skript in einer Tabelle und es funktioniert einwandfrei. Mein Problem ist, dass sich diese Preise ändern und meine Tabelle nicht aktualisiert wird.

Wie kann ich erzwingen, dass das Skript erneut ausgeführt und die Zellen aktualisiert werden (ohne manuell über jede Zelle zu gehen)?

74
tbkn23

Okay, es scheint, als ob mein Problem darin bestand, dass sich Google auf seltsame Weise verhält - es führt das Skript nicht erneut aus, solange die Skriptparameter ähnlich sind, sondern es verwendet zwischengespeicherte Ergebnisse aus den vorherigen Durchläufen. Daher wird keine erneute Verbindung mit der API hergestellt und der Preis nicht erneut abgerufen. Es wird lediglich das zuvor zwischengespeicherte Skriptergebnis zurückgegeben.

Weitere Informationen finden Sie hier: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888

und hier: Skript zum Zusammenfassen von Daten, die nicht aktualisiert werden

Meine Lösung bestand darin, meinem Skript einen weiteren Parameter hinzuzufügen, den ich nicht einmal benutze. Wenn Sie die Funktion nun mit einem anderen Parameter als den vorherigen Aufrufen aufrufen, muss das Skript erneut ausgeführt werden, da das Ergebnis für diese Parameter nicht im Cache gespeichert wird.

Wenn ich also die Funktion aufrufe, übergebe ich für den zusätzlichen Parameter "$ A $ 1". Ich habe auch ein Menüelement mit dem Namen "refresh" erstellt. Wenn ich es ausführe, werden das aktuelle Datum und die aktuelle Uhrzeit in A1 gespeichert. Daher müssen alle Aufrufe des Skripts mit $ A $ 1 als zweitem Parameter neu berechnet werden. Hier ist ein Code aus meinem Skript:

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Refresh",
    functionName : "refreshLastUpdate"
  }];
  sheet.addMenu("Refresh", entries);
};

function refreshLastUpdate() {
  SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());
}

function getPrice(itemId, datetime) {
  var headers =
      {
        "method" : "get",
        "contentType" : "application/json",
        headers : {'Cache-Control' : 'max-age=0'}
      };

  var jsonResponse = UrlFetchApp.fetch("http://someURL?item_id=" + itemId, headers);
  var jsonObj = eval( '(' + jsonResponse + ')' );
  return jsonObj.Price;
  SpreadsheetApp.flush();
}   

Und wenn ich den Preis eines Artikels mit der ID 5 in eine Zelle schreiben möchte, verwende ich die folgende Formel:

=getPrice(5, $A$1)

Wenn ich die Preise aktualisieren möchte, klicke ich einfach auf den Menüpunkt "Aktualisieren" -> "Aktualisieren". Denken Sie daran, dass Sie die Tabelle neu laden müssen, nachdem Sie das Skript onOpen() geändert haben.

78
tbkn23

Ich weiß, das ist eine alte Frage. Diese Methode erfordert jedoch keine Benutzeraktion außer dem Vornehmen einer Änderung.

Was ich getan habe, war ähnlich wie tbkn23.

Die Funktion, die ich neu auswerten möchte, hat einen zusätzlichen nicht verwendeten Parameter, $ A $ 1. Der Funktionsaufruf ist also

=myFunction(firstParam, $A$1)

Aber im Code ist die Funktionssignatur

function myFunction(firstParam)

Anstatt eine Aktualisierungsfunktion zu haben, habe ich die onEdit (e) -Funktion wie diese verwendet

function onEdit(e)
{
   SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());
}

Diese Funktion wird immer dann ausgelöst, wenn eine Zelle in der Tabelle bearbeitet wird. Wenn Sie nun eine Zelle bearbeiten, wird eine Zufallszahl in A1 eingefügt. Dadurch wird die Parameterliste gemäß dem Vorschlag von tbkn23 aktualisiert, wodurch die benutzerdefinierte Funktion neu ausgewertet wird.

32
Lexi Brush

Dies ist sehr spät und ich weiß nicht, dass es nützlich wäre, aber tatsächlich gibt es hier Einstellungen, mit denen Sie NOW() automatisch aktualisieren können

enter image description here

12
Thaina

Wenn sich Ihre benutzerdefinierte Funktion in einer bestimmten Spalte befindet, ordnen Sie Ihre Tabelle einfach nach dieser Spalte.

Die Bestellung erzwingt eine Aktualisierung der Daten, wodurch Ihre benutzerdefinierte Funktion für alle Zeilen dieser Spalte gleichzeitig aufgerufen wird.

4
flu

Dies mag ein super alter Thread sein, aber vielleicht nützlich für jemanden, der dies versucht, wie ich es gerade war.

Wenn ich Lexis Skript so wie es ist abarbeite, schien es nicht mehr mit den aktuellen Sheets zu funktionieren, aber wenn ich die Dummy-Variable als Parameter in meine Funktion einfüge (es ist nicht erforderlich, sie tatsächlich innerhalb der Funktion zu verwenden), wird dies tatsächlich der Fall sein zwinge Google Sheets, die Seite erneut zu aktualisieren.

Deklaration wie: function myFunction (firstParam, dummy) und anschließender Aufruf wie vorgeschlagen. Das hat bei mir geklappt.

Wenn es ärgerlich ist, wenn eine Zufallsvariable auf allen von Ihnen bearbeiteten Arbeitsblättern angezeigt wird, können Sie die Beschränkung auf ein Arbeitsblatt leicht wie folgt vornehmen:

function onEdit(e)
{
  e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}
1
AvengingAB

Jedes Mal, wenn Sie Ihre Web-App bereitstellen, wird dieselbe Version verwendet. Deshalb wird es nicht aktualisiert.

Sobald Sie Änderungen vorgenommen haben, gehen Sie zu Datei-> Versionen verwalten und speichern Sie die neue Version. Neue Version erscheint. Wählen Sie dann beim Deployment die Version, die Sie ausführen möchten enter image description here

0
Azamat Mahkamov