如果某个单元格中的日期小于当前日期,则Google脚本会删除行

时间:2016-03-22 13:30:56

标签: google-apps-script google-sheets

我想要一个Google脚本,它每天在我的电子表格上检查一次并将值复制到另一张表,如果该单元格中的日期小于当前行,则删除所有行。

该文件如下所示: enter image description here

这就是我到目前为止写的:

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); 
    }
  }
}

它似乎无法运作,请帮忙。

1 个答案:

答案 0 :(得分:0)

这里有一些错误或次优。

  1. 对于定时触发器,event object没有任何范围/源数据;它只有时间数据。您需要按名称选择工作表(或循环浏览getSheets获得的所有工作表(如果这是您想要的)。
  2. Utilities.formatDate返回一个字符串,这不是比较日期的最佳方式;无论如何,在它上面调用valueOf似乎毫无意义。
  3. 不是在循环中使用getValue,而是在使用getValues进入循环之前获取值更有效。你应该在循环中做一些其他的事情。
  4. 在工作表中从上到下移动时删除行很棘手,因为行会移动,搞乱他们的索引。出于这个原因,我收集了要在数组中删除的行,然后按从下到上的顺序删除它们。
  5. 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]);
      }
    }