web-dev-qa-db-fra.com

Ajout de plusieurs lignes à une feuille de calcul - Script Google Apps

Je souhaite ajouter plusieurs lignes à une feuille Google via GAS tout en tenant compte des performances et des possibilités indésirables.

Pour y parvenir pour une seule rangée, j’utiliserais appendRow car cela résoudrait les problèmes de mutations intermédiaires et achèverait toutes les actions dans une seule fonction.

Exemple simple:

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

Bien sûr, pour étendre cela à plusieurs lignes, je pourrais simplement passer en boucle sur cette fonction pour chaque ligne, bien que les meilleures pratiques de GAS déconseillent de telles pratiques.

Les tentatives d'utilisation de appendRow pour ajouter plusieurs lignes via un tableau 2D ont échoué et ont conduit l'API à utiliser des références aux tableaux secondaires en tant que valeurs entrant dans la ligne.

Je pose donc la question suivante: existe-t-il un moyen d’ajouter plusieurs lignes à une feuille de calcul qui traite toujours de la mutuabilité intermédiaire que appendRow fait et évite les boucles si possible?

6
dbr

Vous devriez consulter la documentation officielle de la Classe de feuille . Il existe un certain nombre de méthodes d'insertion de lignes en bloc répertoriées, dont l'une peut correspondre à vos critères. Si cela s'avère insuffisant, vous voudrez peut-être consulter le service de feuilles avancé .

MODIFIER

En réponse à votre commentaire, je ne pense pas qu'il soit possible d'ajouter des lignes et des données en bloc en tant qu'opération purement atomique. Mais il existe un moyen de répondre à vos préoccupations concernant les mutations intermédiaires, via la API LockService . Ce service vous permet d'empêcher l'accès simultané à un bloc de code. Ainsi, dans votre cas d'utilisation, vous pouvez utiliser les méthodes d'insertion en bloc pour créer de nouvelles lignes et les renseigner sans vous soucier des mutations. 

0
Dimu Designs

Edit: Réponse non satisfaisante

Dans ce cas, votre réponse ne correspond malheureusement pas à mes critères. Cette méthode peut conduire mutations de la feuille entre la création de la ligne et les données insertion. (I.e: quelqu'un insérant des données). Surmonter cela est une clé bonus de appendRow

Réponse originale:

Vous pouvez utiliser la méthode Range.setValues ​​() qui définira les valeurs simultanément. vous devez simplement obtenir la bonne plage (avec la longueur du tableau) et la bonne position (avec la méthode sheet.getLastRow () +1). Voici un exemple:

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);
8

Je veillerais également à créer une variable de ligne et de colonne pour cet extrait de code. Parfois, GAS génère une erreur si vous essayez d’ajouter directement object.length à la fonction getrange. c'est à dire. 

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