Skript zusammenzufassen Daten nicht aktualisiert
Ich habe ein Google-spreadsheet von Arbeitszeittabellen-Daten; es ist ein Blatt für jeden Monat, jedes Blatt ist eine Menge von sechs-Spalte Blöcke, ein block pro client.
Habe ich eine Zusammenfassung Blatt, das geht und wird die Summe für jeden Kunden und zeigt Sie in einer Liste:
function getClientTotals(sheetname, colcount)
{
colcount = colcount ? colcount : 6;
var res;
var ss = SpreadsheetApp.openById('myid_goes_here');
if(ss)
{
res = [];
var totrow = ss.getRange(sheetname + '!A1:ZZ1').getValues()[0];
for(var i = 0; i < totrow.length; i += colcount)
{
res.push([totrow[i], totrow[i + colcount - 1]]);
}
}
return res;
}
Ich habe dann nur Hinzugefügt, eine Zelle zu meine Zusammenfassung mit =getClientTotals($C$7,$C$8)
die Pässe in den Blattnamen für den Monat und die Anzahl der Spalten für die einzelnen Kunden (im Falle des "schema" änderungen.
Diesem alles Prima funktioniert, es wird jedoch nicht aktualisiert, wenn die Quelldaten geändert werden. Ich habe eine onEdit
trigger; keine Freude. Es wird aktualisiert, wenn Sie gehen, um den Skript-editor und klicken Sie auf " Speichern, aber das ist nicht sinnvoll. Bin ich etwas fehlt?
InformationsquelleAutor Whelkaholism | 2012-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihnen fehlt die anspruchsvolle caching
bugfeature. Es funktioniert auf diese Weise:Google ist der Auffassung, dass alle Ihre benutzerdefinierten Funktionen hängen nur auf Ihre Parameter-Werte direkt zurückgeben, deren Ergebnis (kann man Optional auch abhängig von anderen, statische Daten).
Angesichts dieser Voraussetzung Sie beurteilen können Ihre Funktionen nur, wenn sich ein parameter ändert. z.B.
Nehmen wir an, wir haben den text "10" auf die Zelle B1, dann auf einer anderen Zelle, geben wir
=myFunction(B1)
myFunction wird ausgewertet, und das Ergebnis abgerufen werden. Dann, wenn Sie ändern die Zelle B1 der Wert "35", custom neu bewertet werden als erwartet und das neue Ergebnis abgerufen normal.
Nun, wenn Sie ändern die Zelle B1 wieder auf die ursprüngliche "10", es gibt keine re-evaluation, dem ursprünglichen Ergebnis abgerufen werden sofort aus dem cache.
So, wenn Sie den Blattnamen als parameter, um es zu Holen dynamisch und das Ergebnis zurückgeben, du brichst die caching-Regel.
Kann man leider nicht haben benutzerdefinierte Funktionen, ohne diese erstaunliche Funktion. Also müssen Sie entweder ändern Sie es, um die Werte zu erhalten, die direkt, anstatt den Namen des Blattes, oder nicht verwenden Sie eine benutzerdefinierte Funktion. Zum Beispiel könnten Sie haben einen parameter in deinem script sagen wo die Zusammenfassungen sollten Sie gehen und haben eine
onEdit
aktualisieren Sie Sie, Wann immer ein total verpasst.Gut, Sie können eine Schaltfläche erstellen, tatsächlich eine Zeichnung, und weisen Sie eine Skript-Funktion, die erhöht werden, die Sie dummy-parameter Zelle, zwingen das update.
Genial, funktioniert perfekt, danke!
Ich weiß, aber wieso werde ich hier erwähnt?
denn gestern gab es einen Kommentar von dir, aber jetzt ist es Weg.
InformationsquelleAutor Henrique G. Abreu
andere Lösung für die caching-problem.
haben, wird eine dummy-variable in der Methode.
pass
als der Wert zu diesem parameter.
z.B.
den Ausgang der filter wird nicht verwendet. jedoch zeigt es die Tabelle, diese Formel ist empfindlich auf B4:Z10-Bereich.
InformationsquelleAutor Chamil
Ich hatte ein ähnliches Problem, erstellen Sie ein dashboard für Arbeit. Chamil die Lösung von oben (nämlich mit Blatt-Filter-Funktion übergeben Sie den Wert auf eine dummy-variable in Ihrer Funktion) funktioniert Prima, trotz der jüngsten Kommentar von Arsen. In meinem Fall war ich mit einer Funktion zur überwachung der Reichweite und konnte nicht verwenden Sie den filter auf der gleichen Strecke, da sich dadurch ein Zirkelbezug. Also ich hatte gerade eine Zelle (in meinem Fall E45 im code unten), in dem ich die Zahl geändert, Wann immer ich wollte, dass meine Funktion aktualisieren:
Als Chamil angegeben, der filter ist nicht im script verwendet:
InformationsquelleAutor ART
Nutze ich eine dummy-variable in einer Funktion diese variable bezieht sich auf eine Zelle im Arbeitsblatt
dann ist y eine Myfunction() in Skript schreibt eine Math.Ramdon Zahl in dieser Zelle.
Diese "MyFunction" ist unter einen trigger-service ("Bearbeiten/Aktuellen Projekt-Trigger) und Sie können wählen, verschiedene event-Trigger, zum Beispiel Auf-Offen oder Zeit Gefahren, von dort können Sie zum Beispiel ein Zeitraum von 1 minute bis zu einem Monat
InformationsquelleAutor Paulino Seoane
Was Sie tun können, ist die Einrichtung einer anderen Zelle irgendwo in der Tabelle, die aktualisiert wird jedes mal, wenn ein neues Blatt Hinzugefügt. Stellen Sie sicher, dass es nicht-update für alle ändern, aber nur, wenn Sie wollen, um die Berechnung (in Ihrem Fall, wenn Sie ein Blatt einfügen). Sie übergeben dann den Verweis auf diese Zelle, um Ihre benutzerdefinierten Funktion. Wie erwähnt, das benutzerdefinierte Funktion kann der parameter ignoriert werden.
InformationsquelleAutor theworldismyoyster
Gegeben, die Funktion erklärt sich von Henrique Abreu, können Sie versuchen, die out-of-box-Arbeitsblatt-Funktion ABFRAGE , dass SQL mochte Abfrage ist, was ich oft in der Arbeit
auf raw-Daten, und die Daten als Zusammenfassung zu einer anderen Registerkarte, die Ergebnisdaten werden in Echtzeit aktualisiert, folgende änderung in den Rohdaten.
Mein Vorschlag basiert auf der Tatsache, dass Ihr Skript nicht erweiterte arbeiten wie URL fetch, nur Daten zu arbeiten, ohne die eigentlichen Daten zu Lesen, die ich nicht geben kann eine genaue Lösung mit ABFRAGE.
Bezüglich der - cache-Funktion erwähnt von Henrique Abreu (ich habe nicht genug Ruf zu Kommentar direkt unter seiner Antwort), habe ich Tests und gefunden, dass:
aussieht, es ist kein cache zu arbeiten, Test-Funktion das Skript unten gezeigt:
function adder(base) {
Utilities.sleep(5000);
return base + 10;
}
Anwendung, die benutzerdefinierte Funktion Addierer() in das Blatt, indem Sie eine Zelle, und dann geändert, der Wert der Zelle hin und her, jedes mal, wenn ich die loading-Meldung und die Gesamtzeit von mehr als 5 Sekunden.
Es könnte im Zusammenhang mit dem update erwähnt in diesem GAS Problem:
das Problem in diesem Thema erwähnt bleibt, meine Tests deutet darauf hin, dass Google Blatt neu berechnen, die benutzerdefinierte Funktion jedes mal NUR, WENN
Funktion getCellValue(sheetName,row,col)
{
var ss= SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName(sheetName);
zurück sh.getRange(row, col).getValue();
}
Eine änderung eines Wertes in gelben Zellen führen zu einer Neuberechnung der benutzerdefinierten Funktion; die eigentliche Datenquelle-Wert ändern, wird ignoriert-Funktion.
InformationsquelleAutor Albert
Ich wollte nicht zu haben, ein dummy-parameter. YMMV.
1 Eine Zelle, die eine 'Liste der Elemente', ist der "Aktualisieren" -
2 Skript mit "onEdit", wenn die Zelle "Aktualisieren":
a)Leer aus der Dokument-cache
b)Füllen Sie die doc-cache mit externen Daten (a-Tabelle in meinem Fall)
c)Für alle Zellen, die mit meinem 'getStockoData(...' benutzerdefinierte Funktion
Holen Sie sich die Formel
set '=0'
legen Sie die fromula
d)Setzen Sie die Zelle in (1) mit einem Wert von "Bereit"
Bedeutet dies aktualisieren Sie die bits, die Sie möchten, ABER NICHT SCHNELL.
InformationsquelleAutor andrewdb
Als @Brionius sagte einer extra dinamic argument der Funktion. wenn Sie verwenden jetzt (), die Sie zu timeout-Problemen machen das update ein wenig langsamer...
InformationsquelleAutor David Valdivieso