1

Ich habe ein Google-Blatt, das mit Aktivitäten über ein Google-Formular ausgefüllt ist. Eines der Felder ist ein Aktivitätsdatumsfeld. Sobald dies erledigt ist, wird die Aktivität zu einem anderen Blatt für Berichtszwecke über Appendrow verschoben.Google apps scripts legen Zellenformeln fest, die eine Zeilennummer für eine Zeile benötigen, die über appendrow hinzugefügt wurde

var cells = [activityDate, title, completionDate, ...]; 
destsheet.appendRow (cells); 

in der Population einer Pivot-Tabelle zu unterstützen, eine der Spalten in dem Ziel Tabelle ist der Monat der Tätigkeit für die Zwecke Gruppierung, die =Text(A1, "MMMM") über die folgende Formel durchgeführt wird. Das Problem, das ich habe, ist, dass ich die Zeilennummer der Zeile, die dem Zielblatt hinzugefügt wurde, kennen muss, um die "Zeile" vollständig zu füllen. Angenommen, ich füge Zeile 89 an, dann kann ich die Formel für die Zeile auf = Text (A89, "MMMM") setzen. Das Problem, auf das ich stoße, ist, dass appendRow zwar atomar ist, aber das Arbeitsblatt zurückgibt, nicht die hinzugefügte Zeile.

Während ich die Zeile über getRange nach appendRow bekommen konnte, stelle ich mir vor, es ist möglich, dass ein anderer Benutzer eine Zeile zwischen den appendRow und den getRange Aufrufen einfügen könnte. Ich habe mein Problem gelöst, indem ich die Formel für die Spalte ändere: "= Text (Indirekt (Adresse (Zeile(), 1, 4)," MMMM ")". Dadurch erhält ich den ordnungsgemäß formatierten Monat für das Aktivitätsdatum für Berichtszwecke. Für die weniger Tabellenkalkulation ist die Formel, die ich für meine Lösung verwende, ein wenig verwirrend.

Gibt es eine Möglichkeit, die appendRow in einer atomaren Transaktion zu bekommen, so kann ich richtig Zellen in der Zeile konfigurieren, die "Zeile" Anzahl abhängig sein kann?

+0

Verwenden [Lock-Service] (https://developers.google.com/apps-script/reference/lock/lock-service) – Cooper

Antwort

0

Wie wäre es damit? Löschen Sie alle leeren Zeilen in Ihrem Zielblatt und rufen Sie dann in Ihrer Append-Zeilenfunktion die Methode getMaxRows() in derselben Transaktion auf, an die Sie die Zeile anhängen. Google appscript ist synchron, so dass keine weitere Zeile eingefügt werden kann, sobald die maximale Zeilenanzahl abgerufen wird.

function appendRow() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('Sheet1'); 
    var row = sheet.appendRow(['Some data']) 
    Logger.log(row.getMaxRows()) 
} 
+0

> eine andere Zeile nicht in dem Moment nimmt eingesetzt werden kann es die max zu erhalten Reiheninformation Das ist leider nicht wahr. Wie auch immer, Lösung ist gut genug, um – Kos

+0

zu verwenden Ich war beschäftigt und hatte keine Zeit, um eine Alternative zu erforschen. Mein Berichtsblatt enthält keine überflüssigen Zeilen, daher liefert getMaxRows() die Zeile, die ich gerade angehängt habe. Was mir nicht vertraut ist, ist, wie Google Multi-User-Zugriff behandelt. Ich habe mehrere Personen in derselben Tabelle. Ich dachte darüber nach etwas wie das oben zu tun. Meine Angst ist Benutzer 'A', würde eine Zeile anhängen, und Benutzer 'B' würde dann eine Zeile vor dem Aufruf von getMaxRows() für Benutzer 'A' anhängen. – BrianScheffer

+0

Es wird davon ausgegangen, dass der erwähnte Randfall technisch möglich ist. Daher kann ich eine Lösung vorschlagen, um eine eindeutige Schlüsselspalte zu haben. Damit meine ich, dass wenn ein Benutzer eine Zeile hinzufügt, ein eindeutiger Indexschlüssel generiert wird. Der Schlüssel kann aus ihrem Benutzernamen + einem Inkrement des Schlüssels bestehen, der sich bereits auf dem Blatt befindet. In dem unwahrscheinlichen Fall, dass der andere Benutzer eine Zeile zwischen den Anrufen festgelegt hat, haben sie immer noch eine eindeutige ID, da sie ihren eindeutigen Benutzernamen und eine Nummer enthält. Dann sucht jeder nachfolgende Anruf nach der eindeutigen ID. –

Verwandte Themen