Javascript 如果日期早于今天,如何删除行-15天

Javascript 如果日期早于今天,如何删除行-15天,javascript,google-apps-script,delete-row,Javascript,Google Apps Script,Delete Row,我想删除符合我的条件的工作表的所有行,即: F列包含“是” 列A上的日期是,deleteRow方法在工作表上工作。不在工作表的数据值数组中 尝试: 然后使用:trainingSheet.deleteRow(rowtraining) 而不是:training.deleteRow(rowtraining) 编辑 删除行时,最好从底部向上移动。向下移动会导致这个问题:假设您必须删除第5行和第6行 删除第5行后,所有较低的行都已上移。因此,当您删除第6行时,这实际上是向上移动的原始第7行 因此,最好

我想删除符合我的条件的工作表的所有行,即:

  • F列包含“是”

  • 列A上的日期是,
    deleteRow
    方法在工作表上工作。不在工作表的数据值数组中

    尝试:

    然后使用:
    trainingSheet.deleteRow(rowtraining)

    而不是:
    training.deleteRow(rowtraining)


    编辑

    删除行时,最好从底部向上移动。向下移动会导致这个问题:假设您必须删除第5行和第6行

    删除第5行后,所有较低的行都已上移。因此,当您删除第6行时,这实际上是向上移动的原始第7行

    因此,最好反向运行循环,如下所示:

    for (var i = lastrowtraining + 2; i >= 0; i--){
    

    deleteRow
    方法在工作表上工作。不在工作表的数据值数组中

    尝试:

    然后使用:
    trainingSheet.deleteRow(rowtraining)

    而不是:
    training.deleteRow(rowtraining)


    编辑

    删除行时,最好从底部向上移动。向下移动会导致这个问题:假设您必须删除第5行和第6行

    删除第5行后,所有较低的行都已上移。因此,当您删除第6行时,这实际上是向上移动的原始第7行

    因此,最好反向运行循环,如下所示:

    for (var i = lastrowtraining + 2; i >= 0; i--){
    

    谢谢@ADW、@chrisg和@lazy.lizard

    主要问题是我在培训中触发了动作
    deleteRow
    ,这是一个
    getValues
    an
    deleteRow
    需要一张工作表

    所以这一半解决了问题:

    var training = trainingsheet.getRange(1,1,lastrowtraining+4,42).getValues(); // change this line
    
    但是,(我已经不知道为什么)这段代码只适用于符合条件的第一行,因此我在删除该行后向
    deleterowsnew()
    函数添加了一个触发器:

    if(trainingcomplete =='YES' && date <= todayminus15) {trainingsheet.deleteRow(rowtraining);deleterowsnew()}
    

    if(trainingcomplete==“YES”和&date谢谢@ADW、@Chris G和@lazy.lizard

    主要问题是我在培训中触发了动作
    deleteRow
    ,这是一个
    getValues
    an
    deleteRow
    需要一张工作表

    所以这一半解决了问题:

    var training = trainingsheet.getRange(1,1,lastrowtraining+4,42).getValues(); // change this line
    
    但是,(我已经不知道为什么)这段代码只适用于符合条件的第一行,因此我在删除该行后向
    deleterowsnew()
    函数添加了一个触发器:

    if(trainingcomplete =='YES' && date <= todayminus15) {trainingsheet.deleteRow(rowtraining);deleterowsnew()}
    

    如果(trainingcomplete=='YES'&&date
    getValues()
    返回一个包含值的二维数组,则不能对该数组调用
    deleteRow()
    。但由于它是一个数组,因此可以对其调用数组函数,如
    .filter()
    :看起来你指的地方不对。
    var training
    getRange()
    的结果,我想你必须参考
    ss.deleteRow()
    @lazy.lizard我不这么认为,我需要指定工作表somehow@ChrisG那么我如何删除它?如果要更改工作表,需要调用
    deleteRow()
    在工作表本身上。
    getValues()
    返回一个包含值的二维数组,您不能在该数组上调用
    deleteRow()
    。但由于它是一个数组,您可以在其上调用数组函数,如
    .filter()
    :看起来您引用了错误的位置。
    var training
    getRange()的结果
    ,我想您必须参考
    ss.deleteRow()
    @lazy.lizard我不这么认为,我需要指定工作表somehow@ChrisG那么我如何删除它?如果要更改工作表,需要调用
    deleteRow()
    在工作表本身上。感谢您的快速回复。@ADW我已经添加了此选项并修改了行,它可以工作……但只删除符合条件的第一行。您知道为什么吗?Did
    deleterowsnew()
    解决问题?我意识到可能还有另一个问题。所以编辑了上面的回答。感谢您的快速回复。@ADW我添加了这个并修改了行,它可以工作……但是只删除符合条件的第一行。您知道为什么吗?是否
    删除行新()
    解决问题?我意识到可能还有另一个问题。因此编辑了上面的回答。您应该将
    todaymens15
    date
    转换为时间戳,使用
    date.parse()
    为它们。请记住毫秒-它们可能不在
    日期中出现。您应该将
    今天的minus15
    日期
    转换为时间戳,使用
    日期.parse()
    为它们。请记住毫秒-它们可能不在
    日期中出现。
    
    function deleterowsnew() {
    
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var lastrowtraining = ss.getSheetByName("Training").getRange("D:D").getValues().filter(String).length
      var trainingsheet = ss.getSheetByName("Training")
      var training = trainingsheet.getRange(1,1,lastrowtraining+4,42).getValues()  
    
    
      //Here I define TODAY - 15  
      var today = new Date(new Date().setHours(23,59,59,0,0))
      var todayminus15 = new Date(today.setDate(today.getDate()-15))
    
      // Here I define the columns:
      for(i=0;i<lastrowtraining+3;i++){
        var rowtraining = i+1;
        var date = training[i][0]
        var city = training[i][1]
        var trainingcomplete = training[i][5]
    
        //I define here the condition and after it's completed and trigger the action again to be completed if another row matches the criteria
        if(trainingcomplete =='YES' && date <= todayminus15) {trainingsheet.deleteRow(rowtraining);deleterowsnew()}
    
      }
    }