我从询问的“基于日期删除单元格”问题中获得了此脚本。它删除实际行,从而删除所有格式和变量。有没有办法让它只是删除值?
这是代码:
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Field1");
var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();
var values = datarange.getValues();// get all data in a 2D array
var currentDate = new Date();
var oneweekago = new Date();
oneweekago.setDate(currentDate.getDate() - 1);
for (i=lastrow;i>=2;i--) {
var tempdate = values[i-1][0];// arrays are 0 indexed so row1 = values[0]
and col3 = [2]
if(tempdate < oneweekago)
{
sheet.deleteRow(i);
}
}
}
答案 0 :(得分:0)
您要查找的是.clearContent()而不是deleteRow。这只会清除单元格的内容,而所有格式保持不变。这是Class Range documentation,在查看工作表中特定范围的功能时非常有用。
现在要使它按您想要的方式工作,您将必须使用2个for语句,一个用于获取行号(i),另一个用于获取列号(j),然后您可以在.getRange中使用来运行.clearContent()。
function clearOldRecords() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Field1");
var dataRange = sheet.getDataRange();
var lastRow = dataRange.getLastRow();
var data = dataRange.getValues();
var currentDate = new Date();
var oneWeekAgo = new Date();
oneWeekAgo.setDate(currentDate.getDate() - 7);
for (var i = 0; i < data.length; i++) {
for (var j = 0; j < data[i].length; j++) {
var tempDate= data[i][0]; //column number is indexed from 0, change accordingly to your data
//if start date column is older than 7 days, clear the content of the row
if (tempDate!= "" && tempDate < oneWeekAgo) {
sheet.getRange(i+1,j+1).clearContent();
}
}
}
}
因此,为了进一步解释,这些是我对脚本进行的显着更改。
日期减去要在几天内计算出来,因此执行-1只会比日期少1天。您需要一个星期,所以我将其更改为-7:
oneWeekAgo.setDate(currentDate.getDate() - 7);
该脚本也不再扫描工作表的最后一行,如果工作表很大,这可能会影响性能,但是在您的正常日常工作表中,这应该不是问题。
正如您在下面看到的,for循环for i获取所有行号,并且for循环j可以用作列号,如您在尝试清除内容时在getRange()中看到的那样:>
sheet.getRange(i+1,j+1).clearContent();
注意::如果未按日期对数据进行排序,这可能会在数据中留下很大的空白,您可以添加类似的内容对其进行排序(将其放入FOR循环之外):>
sheet.getRange('A1:Z').sort({column: 2, ascending: false}) //change column number accordingly, this is NOT indexed from 0