2016-06-20 16 views
2

Ich habe den seltsamsten Fehler beim Versuch gefunden, Zeilen zu löschen, die mit Google Script einem bestimmten Wert entsprechen.Löschen von Zeilen in Google Tabellen mit Google Apps Script

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 Code, den ich geschrieben habe, nimmt die Zeilennummern auf, die gelöscht werden sollen, aber nicht alle diese Zeilen in meinem ersten Versuch gelöscht. Ich sollte mein Skript mehrmals ausführen, damit diese Zeilen gelöscht werden.

Wenn mein Code einen Fehler hat, sollte es angezeigt werden und wenn die Logik falsch ist, müssen falsche Zeilen gelöscht werden. Ich treffe keines dieser Szenarien und ich sollte diese Funktion einfach mehrmals ausführen.

Gibt es etwas, das ich hier vermisse?

+1

von unten Löschen nicht löschen Versuchen up: 'for (var i = row_del.length - 1; i> = 0; i--) { sheet.deleteRow (row_del [i]); } ' –

+0

Das hat funktioniert .. Vielen Dank Suppe. Kannst du mir bitte sagen, warum mein Code nicht funktioniert hat? Ist deine Logik nicht die gleiche wie meine? –

+0

können Sie sheet.deleteRows (1, 2); sowie alle Zeilen gleichzeitig löschen –

Antwort

3

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

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

Vielen Dank .. Ich verstehe das jetzt .. –

0

Also, sollte das so 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

Schritt i nur, wenn Sie eine Zeile

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; 
    } 
} 
Verwandte Themen