it-swarm.com.de

Zeilen in Google Sheets mit Google Apps Script löschen

Beim Versuch, Zeilen mit einem bestimmten Wert mithilfe von Google Script zu löschen, ist der seltsamste Fehler aufgetreten.

Hier ist mein 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]);
  }

}

Der von mir geschriebene Code nimmt die Zeilennummern auf, die gelöscht werden sollen, aber nicht alle diese Zeilen werden bei meinem ersten Versuch gelöscht. Ich sollte mein Skript mehrmals ausführen, damit diese Zeilen gelöscht werden.

Wenn mein Code einen Fehler aufweist, sollte er angezeigt werden und wenn die Logik falsch ist, müssen falsche Zeilen gelöscht werden. Ich stoße auf keines dieser Szenarien und sollte diese Funktion nur mehrmals ausführen.

Fehlt mir hier etwas?

4
Bharath Sankar

Wenn eine Zeile aus einem Arbeitsblatt gelöscht wird, werden die Zeilen darunter neu nummeriert, auch wenn das Skript weiterhin ausgeführt wird. Wenn das Skript anschließend versucht, diese Zeilen ebenfalls zu löschen, ist das Ergebnis nicht vorhersehbar. Aus diesem Grund sollte beim Löschen von Zeilen von unten nach oben vorgegangen werden. In Ihrem Fall wie folgt:

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

verweisen Sie auf die von Google Team vorgeschlagene Sperrfunktion:

  var lock = LockService.getScriptLock();
  lock.waitLock(30000); // lock 30 seconds
  //do whatever you want here
  lock.releaseLock();

Auf diese Weise erhalten Sie Ihre Löschauftragsarbeit einmal nach dem anderen! Der System-Thread wird erst dann mit anderen Jobs fortfahren, wenn 30 Sekunden vergangen sind oder die Sperre aufgehoben wurde.

google dev-document: https://developers.google.com/apps-script/reference/lock/lock

1
Toma

inkrementiere i nur, wenn du keine Zeile gelöscht hast

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

Dies ist ein Skript, das ich verwendet habe, um alles außer bestimmten Werten zu löschen, es kann jedoch einfach geändert werden, um bestimmte Zeichenfolgen beizubehalten, und es wird viel schneller ausgeführt, als alle Datenfilter in einer Schleife zu durchlaufen und die Werte zu löschen, die Sie entfernen möchten, und Massenlöschungen. Meine Daten hatten ungefähr 10000 Zeilen, also hätte die Schleife ewig gedauert.

function DeleteCertainRows(){

  columnCopy("D","Z","YourSheetName");//Copy from your target column in this case D to another column in this case Z

  replaceInSheet("Z","YourSheetName","keep String 1","keep");//find and replace the value with what you want to keep
  replaceInSheet("Z","YourSheetName","keep String 2","keep");//Can repeat for additional values

  DeleteValueInColumn("Z","YourSheet","keep");//filters and deletes all other values Column is case sensitive and cant go past Z

};

function replaceInSheet(repColumn,sheetname, to_replace, replace_with) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname);

  var values = sheet.getRange(repColumn+'1:'+repColumn+sheet.getMaxRows());

  var textFinder = values.createTextFinder(to_replace); 
  var replaceall = textFinder.replaceAllWith(replace_with);

};

function columnCopy(copyfrm,copyto,sheetname){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname);
    var copyrange = sheet.getRange(copyfrm+'1:'+copyfrm+sheet.getMaxRows());
    var pasterange = sheet.getRange(copyto+'1:'+copyto+sheet.getMaxRows());

  copyrange.copyTo(pasterange);

};

function DeleteValueInColumn(colStr, sheetname, deleteval){
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname);
  var filterRange=sheet.getDataRange();
  var myFilter = filterRange.createFilter();
  var CriteriaBuild = SpreadsheetApp.newFilterCriteria();
  var Criteria = CriteriaBuild.whenTextDoesNotContain(deleteval);//change to whenTextContains to delete your string value instead of everything else
  var myCriteria = Criteria.build();

  var str = colStr;
  var myCol = parseInt(str.charCodeAt(0) - 64);
  Logger.log(myCol);

  myFilter.setColumnFilterCriteria(myCol, myCriteria);

  var deleterange=sheet.getRange('2:'+sheet.getLastRow());
  sheet.deleteRows(deleterange.getRow(), deleterange.getNumRows());

  myFilter.remove();


};

0
kylelove41

Um leere Zeilen aus einem einzelnen benannten Blatt zu löschen, wird vorausgesetzt, Spalte 1 enthält Daten in gültigen Zeilen. Suchen und löschen Sie von der höchsten zur niedrigsten Zeilennummer.

// Deletes any row whose first column is blank
// WARNING: Assumes any valid row has data in column 1
function deleteBlankRows() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = doc.getSheetByName("Sheet3");
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow();

  for (var i = lastRow; i > 0; i--) {
    var range = sheet.getRange(i,1); 
    var data = range.getValue();
    if (data == '') {
      sheet.deleteRow(i);
    }
  }
}
0

Kopieren Sie das Einfügen von: https://Gist.github.com/dDondero/285f8fd557c07e07af0e

Anstatt die Zeilen zweimal zu durchlaufen, können Sie zählen, wie viele Zeilen gelöscht wurden, um den richtigen Index für die Zeile zu berechnen, die Sie als Nächstes löschen werden.

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

So sollte es also aussehen?

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

Sie können die Zeilen einfach löschen, indem Sie die letzte Zeile mit der Funktion deleteRows wie folgt ändern:

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