web-dev-qa-db-fra.com

Suppression de lignes dans des feuilles Google à l'aide du script Google Apps

J'ai rencontré l'erreur la plus étrange en essayant de supprimer des lignes qui correspondent à une valeur spécifique à l'aide de Google Script.

Voici mon code:

function myFunction() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = doc.getSheetByName("file.csv");

  var values = sheet.getRange("N2:N").getValues();

  var row_del = new Array();

  for(var i=0;i<values.length;i++)
  {
    if(values[i] == 'del'){
      row_del.Push(i+2); // This line was added for debugging purposes.
     // sheet.deleteRow(i+2) was the line that was in this condition
     // (i+2) is used because row 1 has headers and the range starts from 0.
    }
  }

//  Logger.log(row_del);
//  GmailApp.sendEmail("my_email_address", "subject", row_del)

  for (var i = 0; i < row_del.length; i++)
  {
    sheet.deleteRow(row_del[i]);
  }

}

Le code que j'ai écrit reprend les numéros de ligne à supprimer, mais toutes ces lignes ne le sont pas lors de mon premier essai. Je devrais exécuter mon script plusieurs fois pour que ces lignes soient supprimées. 

Si mon code contient une erreur, il devrait apparaître et si la logique est incorrecte, des lignes incorrectes doivent être supprimées. Je ne rencontre aucun de ces scénarios et je devrais exécuter cette fonction plusieurs fois.

Y a-t-il quelque chose qui me manque ici? 

4
Bharath Sankar

Lorsqu'une ligne est supprimée d'une feuille, les lignes situées en dessous sont renumérotées même si le script continue de s'exécuter. Si le script tente ensuite de supprimer également ces lignes, le résultat est imprévisible. Pour cette raison, lors de la suppression de lignes, il convient de procéder de bas en haut. Dans votre cas, comme si:

for (var i = row_del.length - 1; i>=0; i--) {
  sheet.deleteRow(row_del[i]); 
}
8
user3717023

incrémenter i uniquement si vous n'avez pas supprimé une ligne

function del_F_rows(){
 var i=1;
 while(!sht_balanceHistory.getRange(i,1).isBlank()){
  if(sht_balanceHistory.getRange(i,3).getValue()=="F")
     sht_balanceHistory.deleteRow(i);
  else
     i=i+1;
    }
}
0
amr osama

Copier coller de: https://Gist.github.com/dDondero/285f8fd557c07e07af0e

Au lieu de parcourir les lignes deux fois, vous pouvez compter le nombre de lignes supprimées pour calculer l’index correct pour la ligne à supprimer par la suite. 

function deleteRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  var rowsDeleted = 0;
  for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (row[0] == 'delete' || row[0] == '') { // This searches all cells in columns A (change to row[1] for columns B and so on) and deletes row if cell is empty or has value 'delete'.
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++;
    }
  }
};
0
tomstar

Alors, est-ce que cela devrait ressembler? 

function myFunction() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = doc.getSheetByName("Sheet1");

  var values = sheet.getRange("A:A").getValues();

  var row_del = new Array();

  for(var i=0;i<values.length;i++)
  {
    if(values[i] == 'N'){
      row_del.Push(i+2); // This line was added for debugging purposes.
     // sheet.deleteRow(i+2) was the line that was in this condition
     // (i+2) is used because row 1 has headers and the range starts from 0.
    }
  }

//  Logger.log(row_del);
//  GmailApp.sendEmail("my_email_address", "subject", row_del)

  for (var i = row_del.length - 1; i>=0; i--) { sheet.deleteRow(row_del[i]); }

}

0
DavidJ101

Vous pouvez simplement supprimer les lignes, modifier la dernière ligne en utilisant la fonction deleteRows comme ceci:

var maxRows = newsheet.getMaxRows(); 
var lastRow = newsheet.getLastRow();
if (maxRows-lastRow != 0)
{
  newsheet.deleteRows(lastRow+1, maxRows-lastRow);
}
0
Diana Shivakumar