为了账号安全,请及时绑定邮箱和手机立即绑定

根据相邻行中存在的日期删除行

根据相邻行中存在的日期删除行

繁花不似锦 2022-10-27 15:10:28
我在工作表的第五列中有日期。function deleteOldData() {  var ss = SpreadsheetApp.getActiveSpreadsheet();  var sheet = ss.getSheetByName("Sheet1");  var datarange = sheet.getDataRange();  var lastrow = datarange.getLastRow();  var values = datarange.getValues();  var currentDate = new Date();  var daysago = new Date().setDate(currentDate.getDate() - 5);  daysago = new Date(Date.parse(daysago))  Logger.log(daysago)  for (i=lastrow;i>=2;i--) {var tempdate = sheet.getRange(i, 5).getValue();if(tempdate < daysago)  {      sheet.deleteRows(2, i);      break;    }  }}我正在使用此代码删除从今天开始日期少于 5 天的行。它应该只删除那些从今天开始日期少于 5 天的行,但它正在删除所有行,除了我在代码中省略的标题。我的工作表中的日期如下所示:7/1/2020 18:28:05
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

回答:

您需要使用deleteRow()而不是deleteRows().

更多信息:

根据文档

deleteRows(rowPosition, howMany)

删除从给定行位置开始的多行。

var ss = SpreadsheetApp.getActiveSpreadsheet();

var sheet = ss.getSheets()[0];

// Rows start at "1" - this deletes the first two rows

sheet.deleteRows(1, 2);

因此,当您打电话时,sheet.deleteRows(2, i);您将删除多行,从第 2 行开始,然后再完成i行 - 这可能高达lastrow.

代码修改:

您也不需要使用break关键字 - 一旦第一次满足条件,这将停止整个循环if,而不是继续删除日期超过五天的所有行。

我还清理了一些功能:

  • 由于您已经从工作表中获取数据并将其存储在 中values,因此您无需再次获取数据tempdate- 您可以直接从values数组中分配它。

  • 为了使日期比较更精确,可以从日期对象中提取确切的时间戳,而不是使用诸如此类的东西getDate() - 5

function deleteOldData() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = ss.getSheetByName("Sheet1");

  var datarange = sheet.getDataRange();

  var lastrow = datarange.getLastRow();

  var values = datarange.getValues();

  

  var currentDate = new Date().getTime();

  var daysago = (new Date().getTime() - 432000000);

    

  for (var i = lastrow; i > 1; i--) {

    var tempdate = values[i - 1][4];

 

    if((new Date(tempdate).getTime()) < daysago)  {

      sheet.deleteRow(i);

    }

  }

}


查看完整回答
反对 回复 2022-10-27
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信