1

Ich arbeite an einem einfachen E-Mail-Management-System mit Google Tabellen, Formularen und Apps Skripte, aber ich bin neu in Javascript/Google Apps Script und ich habe jetzt für dieses Problem eine Weile stecken.Wie entfernen Sie alle Zeilen, die einem Kriterium in Google Tabellen entsprechen, mit Google Apps Script?

So habe ich eine Tabelle mit den Kontakten, die Auflistung ihre Namen, E-Mail und die Gruppe, die wie folgt aussieht:

| Name | Email    | Group | 
|-------|-------------------|--------| 
| John | [email protected] | A  | 
| Bill | [email protected] | A  | 
| Janet | [email protected] | B  | 
| Mary | [email protected] | B  | 
| Mary | [email protected] | Delete | 
| Bill | [email protected] | Delete | 
| Janet | [email protected] | A  | 

Ich versuche, ein Skript zu schreiben, das programmatisch alle E-Mails findet, die mit "gekennzeichnet sind, Löschen "und entfernt alle Zeilen mit diesen E-Mails. In diesem Fall müsste ich alle Zeilen löschen, die [email protected] und [email protected] enthalten, und John und Janet behalten. Erwartete Ausgabe:

| Name | Email    | Group | 
|-------|-------------------|--------| 
| John | [email protected] | A  | 
| Janet | [email protected] | B  | 
| Janet | [email protected] | A  | 

Das Problem ist, dass ich nicht einen Weg finden kann mein Blatt auf diese Weise und mein Skript hält kopieren alles, einschließlich der Zeilen filtern würde ich entfernen möchte. Dies ist der Code, den ich bisher geschrieben:

function removeDelRows() { 

    var ss = SpreadsheetApp.getActiveSheet(); // Gets active sheet 
    var data = ss.getDataRange().getValues(); // Get values in active sheet 

    var toDelete = new Array(); 
    var newData = new Array(); 

    // Put in toDelete array all emails marked as "Delete" 
    for (var i = 0; i < data.length; i++) { 
     if (data[i][2] == "Delete") { 
      toDelete.push(data[i][1]); 
     } 
    } 
    // !BUGGY! 
    // Find all rows that contains emails to be deleted and remove them 
    for (var j = 0; j < data.length; j++) { 
     for (var k = 0; k < toDelete.length; k++) { 
      if(data[j][1] == toDelete[k]){} // Do nothing 
      else{ 
       newData.push(data[j]); // THIS CONDITION IS NOT BEHAVING AS EXPECTED; NEWDATA IS A COPY OF DATA 
      } 
     } 
    } 
    Logger.log(newData); // newData should contains only rows that do not match toDelete ones 

    // Delete everything else 
    sheet.clearContents(); 
    sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData); 
} 

Ich bin sicher, dass die Lösung ganz trivial ist, aber ich habe stundenlang meinen Kopf wurde hämmern und ich kann nicht herausfinden!

Antwort

0

Wie wäre es mit deleteRow()?

var ss = SpreadsheetApp.getActiveSheet(); // Gets active sheet 
    var data = ss.getDataRange().getValues(); // Get values in active sheet 

    nextLine: for(var i = data.length-1; i >=0; i--) { 
     if(data[i][2] !== "Delete") continue nextLine; 
     ss.deleteRow(i+1); 
    } 
+0

Vielen Dank SO VIEL! Ich habe deine Version ein wenig modifiziert und jetzt funktioniert es perfekt! –

+0

vergessen Sie nicht, es als beantwortet zu markieren, da es funktioniert. Klicken Sie auf das graue Häkchen – noogui

+0

Beachten Sie, dass diese Lösung einen API-Aufruf für jede Zeile enthält, die gelöscht wird. Dies ist möglicherweise nicht die beste Lösung, wenn Sie ein Blatt mit zehntausenden von Datensätzen haben. –

Verwandte Themen