wake-up-neo.com

Mehrere Zeilen an Tabellenkalkulation anhängen - Google Apps Script

Ich möchte über GAS mehrere Zeilen an ein Google-Blatt anhängen und dabei auf Leistung und unerwünschte Möglichkeiten Rücksicht nehmen.

Um dies für eine einzelne Zeile zu erreichen, würde ich appendRow verwenden, da dies Probleme mit dazwischen liegenden Mutationen angeht und alle Aktionen in einer einzigen Funktion ausführt.

Einfaches Beispiel:

var sheet= SpreadsheetApp.openById(ssId).getSheetByName(sheetName);
sheet.appendRow(["foo", "bar", "foobar"]);

Um dies auf mehrere Zeilen auszudehnen, könnte ich diese Funktion für jede Zeile einfach durchlaufen, obwohl GAS Best Practices davon abraten.

Versuche, appendRow zum Hinzufügen mehrerer Zeilen über ein 2D-Array zu verwenden, waren nicht erfolgreich und führten die API unter Verwendung von Verweisen auf die sekundären Arrays als Werte in die Zeile.

Ich frage daher, gibt es eine Möglichkeit, mehrere Zeilen an eine Kalkulationstabelle anzuhängen, die immer noch die mögliche Veränderlichkeit behebt, die appendRow macht und wo möglich Schleifen vermeidet?

6
dbr

Sie sollten die offizielle Dokumentation für die Sheet-Klasse lesen. Es werden eine Reihe von Methoden zum Einfügen von Massenzeilen aufgelistet, von denen eine möglicherweise Ihren Kriterien entspricht. Wenn sich dies als unzureichend erweist, möchten Sie vielleicht den Advanced Sheet Service betrachten.

EDIT

Als Antwort auf Ihren Kommentar glaube ich nicht, dass es eine Möglichkeit gibt, Zeilen und Daten als reine atomare Operation in großen Mengen hinzuzufügen. Es gibt jedoch eine Möglichkeit, Ihre Bedenken hinsichtlich intervenierender Mutationen über die LockService-API anzusprechen. Mit diesem Dienst können Sie den gleichzeitigen Zugriff auf einen Codeblock verhindern. Für Ihren Anwendungsfall können Sie die Bulk-Insert-Methoden nutzen, um neue Zeilen zu erstellen und diese zu füllen, ohne sich um Mutationen kümmern zu müssen. 

0
Dimu Designs

Edit: Antwort nicht zufriedenstellend

In diesem Fall erfüllt Ihre Antwort leider meine Kriterien nicht. Diese Methode kann Zu Mutationen im Arbeitsblatt zwischen Zeilenerstellung und Einfügen von Daten Führen. (I.e: jemand, der Daten einfügt). Dies zu überwinden, ist ein wichtiger Bonus von appendRow

Ursprüngliche Antwort:

Sie können die Methode Range.setValues ​​() verwenden, um die Werte auf einmal festzulegen. Sie müssen nur den guten Bereich (mit der Arraylänge) und die gute Position (mit sheet.getLastRow () +1-Methode) ermitteln. Hier ist ein Beispiel:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

var example = [[1,2,3],[4,5,6],[7,8,9]];
sheet.getRange(sheet.getLastRow()+1, 1, example.length, example[0].length).setValues(example);

Ich würde sicherstellen, dass Sie auch eine Zeilen- und Spaltenvariable für dieses Codefragment erstellen. Manchmal gibt GAS einen Fehler aus, wenn Sie versuchen, object.length direkt in der getrange-Funktion hinzuzufügen. d.h. 

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var example = [[1,2,3],[4,5,6],[7,8,9]];
var row = example.length;
var column = example[0].length;

sheet.getRange(sheet.getLastRow()+1, 1, row, column).setValues(example);

4
Colin Jameson