57 votes

Moyen plus rapide de trouver la première ligne vide dans une colonne de feuille Google

J'ai fait un script qui toutes les quelques heures ajoute une nouvelle ligne à une feuille de calcul Google Apps.

Voici la fonction que j'ai créée pour trouver la première ligne vide :

function getFirstEmptyRow() {
  var spr = SpreadsheetApp.getActiveSpreadsheet();
  var cell = spr.getRange('a1');
  var ct = 0;
  while ( cell.offset(ct, 0).getValue() != "" ) {
    ct++;
  }
  return (ct);
}

Ça fonctionne bien, mais lorsque j'atteins environ 100 lignes, c'est vraiment lent, même dix secondes. Je crains qu'en atteignant des milliers de lignes, ce sera trop lent, peut-être atteindra-t-il le délai d'attente ou pire. Y a-t-il une meilleure façon de faire ?

5voto

Sonny Points 180

Et pourquoi ne pas utiliser appendRow?

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
spreadsheet.appendRow(['ceci est dans la colonne A', 'colonne B']);

2 votes

Pourquoi pas? Parce qu'il ne répond pas à la question - la "première ligne vide" n'a pas été identifiée. Au lieu de cela, une nouvelle ligne a été ajoutée en bas du tableur, même s'il y a des lignes "vides" au-dessus.

0 votes

Il s'agit de la meilleure réponse et @Mogsdad a tort : sheet.appendRow() NE rajoute PAS une ligne en bas de la feuille et NE laissera PAS de lignes vides au-dessus. Au lieu de cela, il fait exactement ce que l'OP a demandé : il rajoute une ligne après la dernière ligne de la feuille qui contient du contenu. De plus, c'est atomique, donc deux appendRow() lancés en même temps n'essaieront pas d'écrire dans la même colonne "dernière". En conclusion : c'est la bonne réponse ! (Du moins tant que vous n'avez pas besoin de l'indice de la dernière ligne après avoir écrit dedans, ce que l'OP n'a pas demandé.)

3 votes

@Jpsy Vous pourriez bénéficier d'une formation à la politesse. N'hésitez pas à remettre en question la validité d'une ancienne réponse ou question - après tout, ces réponses proviennent de l'offre Old Sheets, les choses pourraient avoir changé. Mais ce n'est pas le cas - et vous n'avez aucune preuve pour étayer votre déclaration incendiaire. Ce clip démontre clairement le problème avec appendRow() : il ne trouve pas la PREMIÈRE ligne vide. (La première ligne après la dernière ligne avec du contenu, oui - mais encore une fois, ce n'est pas ce qui était demandé.)

2voto

Richard Rasch Points 23

J'ai ajusté le code fourni par ghoti afin qu'il recherche une cellule vide. La comparaison des valeurs ne fonctionnait pas sur une colonne avec du texte (ou je n'ai pas réussi à comprendre comment le faire) donc j'ai utilisé isBlank(). Remarquez que la valeur est négée avec ! (devant la variable r) lors de la recherche vers l'avant car vous voulez augmenter i jusqu'à ce qu'une cellule vide soit trouvée. En remontant dans la feuille par dix, vous voulez arrêter de diminuer i lorsque vous trouvez une cellule qui n'est pas vide (! enlevé). Ensuite, redescendez dans la feuille d'un pour atteindre la première cellule vide.

function findRow_() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.setActiveSheet(ss.getSheetByName("DAT Tracking"));
  var r = ss.getRange('C:C');
  // Avancer par centaines
  for (var i = 2; !r.getCell(i,1).isBlank(); i += 100) { }
  // Reculer par dizaines
  for ( ; r.getCell(i,1).isBlank(); i -= 10) { }
  // Avancer par unités
  for ( ; !r.getCell(i,1).isBlank(); i++) { }
  return i;

2voto

HardScale Points 532

Juste mon avis, mais je fais cela tout le temps. J'écris simplement les données en HAUT de la feuille. C'est inversé par date (plus récent en haut), mais je peux toujours obtenir ce que je veux. Le code ci-dessous stocke les données qu'il récupère d'un site immobilier depuis trois ans.

var laFeuille = SpreadsheetApp.openById(zSheetId).getSheetByName('Feuille1');
laFeuille.insertRowBefore(1).getRange("A2:L2").setValues( [ zPriceData ] );

Ce morceau de la fonction du scraper insère une ligne au-dessus de la ligne #2 et écrit les données là. La première ligne est l'en-tête, donc je ne la touche pas. Je ne l'ai pas chronométré, mais le seul moment où j'ai un problème est lorsque le site change.

1voto

Thomas Points 541

En effet, la fonction getValues est une bonne option mais vous pouvez utiliser la fonction .length pour obtenir la dernière ligne.

 function getFirstEmptyRow() {
  var spr = SpreadsheetApp.getActiveSpreadsheet();
  var array = spr.getDataRange().getValues();
  ct = array.length + 1
  return (ct);
}

1 votes

Ne donne pas de résultats corrects si les données présentent des trous sur une ligne.

1voto

ghoti Points 14996

J'ai un problème similaire. En ce moment, c'est un tableau avec des centaines de lignes, et je m'attends à ce qu'il atteigne des milliers de lignes. (Je n'ai pas encore vérifié si une feuille de calcul Google gérera des dizaines de milliers de lignes, mais j'y arriverai finalement.)

Voici ce que je fais.

  1. Faire avancer à travers la colonne par centaines, s'arrêter lorsqu'on est sur une rangée vide.
  2. Reculer à travers la colonne par dizaines, en recherchant la première rangée non vide.
  3. Avancer à travers la colonne par unités, en recherchant la première rangée vide.
  4. Renvoyer le résultat.

Cela dépend bien sûr d'avoir un contenu contigu. On ne peut pas avoir de lignes vides aléatoires. Ou du moins, si vous en avez, les résultats seront sous-optimaux. Et vous pouvez ajuster les incréments si vous pensez que c'est important. Ceux-ci fonctionnent pour moi, et je trouve que la différence de durée entre des étapes de 50 et des étapes de 100 est négligeable.

function lastValueRow() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var r = ss.getRange('A1:A');
  // Faire avancer par centaines
  for (var i = 0; r.getCell(i,1).getValue() > 1; i += 100) { }
  // Reculer par dizaines
  for ( ; r.getCell(i,1).getValue() > 1; i -= 10) { }
  // Faire avancer par unités
  for ( ; r.getCell(i,1).getValue() == 0; i--) { }
  return i;
}

C'est beaucoup plus rapide que d'inspecter chaque cellule depuis le haut. Et si vous avez d'autres colonnes qui prolongent votre feuille de calcul, cela peut être plus rapide que d'inspecter chaque cellule depuis le bas, aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X