【问题标题】:Google Script to delete row if date in certain cell is smaller than current date如果某些单元格中的日期小于当前日期,Google 脚本将删除行
【发布时间】:2016-03-23 12:56:49
【问题描述】:

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

文件如下所示:

这是我到目前为止写的:

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

好像不行,请帮忙。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    这里有些地方是错误的或次优的。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多