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

时间:2019-08-19 14:54:43

标签: javascript google-apps-script delete-row

我想删除工作表中符合我的标准的所有行:

  • F列包含“是”
  • A列上的日期小于今天-= 15

我已经尝试过这段代码,但是公式不起作用:

function deleterows() {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var lastrowtraining = ss.getSheetByName("Training").getRange("D:D").getValues().filter(String).length
var training = ss.getSheetByName("Training").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;j<lastrowtraining+3;i++){
  var rowtraining = i+1;
  var date = training[i][0]
  var city = training[i][1]
  var trainingcomplete = training[i][5]

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

但我收到此错误:

TypeError: Cannot find function deleteRow in object "Date,City Code,Name,Email,Phone,Successfully completed training,Days since registration if not complete,Send reminder?,Acuity ID,Successfully doc
... (which is the content of the entire sheet)

2 个答案:

答案 0 :(得分:2)

deleteRow方法适用于工作表。不在工作表的数据值数组上。

尝试:

var trainingSheet = ss.getSheetByName("Training"); // insert this line
var training = trainingSheet.getRange(1,1,lastrowtraining+4,42).getValues(); // change this line

然后使用:trainingSheet.deleteRow(rowtraining)

而不是:training.deleteRow(rowtraining)


修改

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

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

因此最好像这样反向运行循环:

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

答案 1 :(得分:0)

感谢@ ADW,@ Chris G和@ lazy.lizard。

主要问题是我在培训中触发了deleteRow操作,而getValuesdeleteRow需要一张纸。

所以这一半解决了问题:

var training = trainingsheet.getRange(1,1,lastrowtraining+4,42).getValues(); // change this line

但是,(我不知道为什么)此代码仅在符合条件的第一行上起作用,因此在删除该行后,我向deleterowsnew()函数添加了一个触发器:

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

因此最终代码如下所示:

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

  }
}

谢谢大家的帮助,希望这对您将来有所帮助!