google-apps-script zählen - Aktualisieren Sie Daten, die von einer benutzerdefinierten Funktion in Google Sheet abgerufen werden




3 Answers

Ok, es scheint, als ob mein Problem darin besteht, dass sich Google auf seltsame Weise verhält - es führt das Skript nicht erneut aus, solange die Skriptparameter ähnlich sind, es verwendet zwischengespeicherte Ergebnisse der vorherigen Läufe. Daher stellt es keine Verbindung zur API her und ruft den Preis nicht erneut ab, sondern gibt einfach das vorherige Skriptergebnis zurück, das zwischengespeichert wurde.

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 verwende. Wenn Sie nun die Funktion mit einem Parameter aufrufen, der sich von vorherigen Aufrufen unterscheidet, muss das Skript erneut ausgeführt werden, da sich das Ergebnis für diese Parameter nicht im Cache befindet.

Also wenn ich die Funktion anrufe, übergebe ich für den zusätzlichen Parameter "$ A $ 1". Ich habe auch einen Menüpunkt namens refresh erstellt, und wenn ich ihn starte, 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 des Artikels mit ID 5 in eine Zelle setzen 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() .

einfügen tabellen

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

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

Wie kann ich es erzwingen, das Skript erneut auszuführen und die Zellen zu aktualisieren (ohne jede Zelle manuell zu durchlaufen)?




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




Dies mag ein sehr alter Thread sein, aber er könnte für jemanden nützlich sein, der das versucht, wie ich es gerade getan habe.

Wenn man Lexis Skript so wie es ist abarbeitet, scheint es mit den aktuellen Sheets nicht mehr zu funktionieren, aber wenn ich die Dummy-Variable als Parameter in meine Funktion einfüge (keine Notwendigkeit, sie tatsächlich innerhalb der Funktion zu verwenden), wird es tatsächlich funktionieren Erzwinge Google Tabellen, um die Seite erneut zu aktualisieren.

Also, Deklaration wie: function myFunction (firstParam, dummy) und dann würde es aufgerufen werden, wie es vorgeschlagen wurde. Das hat für mich funktioniert.

Wenn es außerdem lästig ist, dass eine Zufallsvariable auf allen von Ihnen bearbeiteten Blättern angezeigt wird, können Sie sie wie folgt auf ein Blatt beschränken:

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



Related

google-apps-script google-spreadsheet custom-function