我想删除工作表中符合我的标准的所有行:
我已经尝试过这段代码,但是公式不起作用:
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)
答案 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
操作,而getValues
和deleteRow
需要一张纸。
所以这一半解决了问题:
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()}
}
}
谢谢大家的帮助,希望这对您将来有所帮助!