2016-03-22 4 views
1

Ich möchte ein Google Skript, das einmal täglich in meiner Tabelle prüft und die Werte in ein anderes Blatt kopiert und dann alle Zeilen löscht, wenn das Datum in dieser Zelle ist ist kleiner als der Strom.Google Script zum Löschen von Zeilen, wenn das Datum in einer bestimmten Zelle kleiner ist als das aktuelle Datum

Die Datei sieht wie folgt aus: enter image description here

Und das ist, was ich bisher geschrieben:

function DeleteIfDateIsToSmall(event) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = event.source.getActiveSheet(); 
    var r = event.source.getActiveRange(); 
    var today = new Date(); 
    var today2 = Utilities.formatDate(today,'GMT+0200','dd.MM.yyyy'); 
    var startRow = 2; // First row of data to process 
    var numRows = sheet.getLastRow()-1 

    for (var i=2; i < numRows; i++) { 
    var DateCell = s.getRange(i, 13); 
    var sheetDate = DateCell.getValue() 
    var sheetDate2 = Utilities.formatDate(sheetDate,'GMT+0200','dd.MM.yyyy'); 
    var row = i; 
    var numColumns = s.getLastColumn(); 
    var targetSheet = ss.getSheetByName("Ended or Deleted"); 
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 

    if (s.getName() == "Start" && sheetDate != 0 && sheetDate != "" && today2.valueOf() > sheetDate2.valueOf()){ 
     s.getRange(row, 1, 1, numColumns).moveTo(target); 
     s.deleteRow(row); 
    } 
    } 
} 

Es ist nicht zu funktionieren scheint, bitte helfen Sie.

Antwort

0

Ein paar Dinge sind falsch oder suboptimal hier.

  1. Für einen zeitgesteuerten Trigger hat event object keine Bereichs-/Quellendaten; es hat nur Zeitdaten. Sie müssen ein Blatt nach Namen auswählen (oder durchlaufen Sie alle von getSheets erhaltenen Blätter, wenn dies das ist, was Sie wollen).
  2. Utilities.formatDate gibt eine Zeichenfolge zurück, die nicht der beste Weg zum Vergleichen von Daten ist; Auf jeden Fall scheint es sinnlos, valueOf anzurufen.
  3. Anstatt getValue in einer Schleife zu verwenden, ist es effizienter, Werte vor dem Eintritt in die Schleife zu erhalten, mit getValues. Es gibt einige andere Dinge, die Sie in der Schleife tun, die draußen sein sollte.
  4. Das Löschen von Zeilen beim Verschieben von oben nach unten in einem Blatt ist schwierig, da sich Zeilen verschieben und ihre Indizierung durcheinander bringen. Aus diesem Grund sammle ich die zu löschenden Zeilen in einem Array und lösche sie dann in der Reihenfolge von unten nach oben.

function DeleteIfDateIsTooSmall() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = ss.getSheetByName("Start"); 
    var numColumns = s.getLastColumn(); 
    var targetSheet = ss.getSheetByName("Ended or Deleted"); 
    var today = new Date(); 
    var dates = s.getRange(2, 13, s.getLastRow()-1, 1).getValues(); 
    var rowsToDelete = []; 
    for (var i = 0; i < dates.length; i++) { 
    if (dates[i][0] && dates[i][0] < today) { 
     var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
     s.getRange(i + 2, 1, 1, numColumns).moveTo(target); 
     rowsToDelete.push(i + 2); 
    } 
    } 
    for (i = rowsToDelete.length - 1; i >= 0; i--) { 
    s.deleteRow(rowsToDelete[i]); 
    } 
} 
Verwandte Themen