日期过后一天删除行

Delete Rows a day after the date has passed

我在脚本编写方面还很陌生,我正在尝试编写一个脚本,该脚本在 L 列中的日期后一天删除一行。数据在 A133 到 L117 范围内。我从几个不同的 [sources][1] 获得了下面的代码,但它有几个问题。第一个是我在第 3 行收到错误消息“无法读取 Null 的 属性 'getRange',即使我已经描述了我希望它从中提取数据的数组。

第二个问题与以下代码有关 - 我不确定它是否正确,如果能帮助它满足我当前的需要,我将不胜感激。这是代码。

function DeleteOldEntries() {
var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet 1");
var values = sheet.getRange(2,1,5,12);

var currentDate = new Date();//today

for (i=lastrow;i>=3;i--) {
var tempDate = values[i-1][2];// arrays are 0 indexed so row1 = values[0] and col3 = [2]
if ((tempDate!=NaN) && (tempDate <= currentDate))
{
  sheet.deleteRow(i);
}//closes if
}//closes for loop
}//closes function

如有任何帮助,我们将不胜感激。

对于你的第一期:

The first being that I get the error message "cannot read property 'getRange' of Null, on line 3 even though I've describe the array I want it to pull data from.

此错误表示您的 sheet 变量不正确。

这可能意味着您的 sheet 名称不正确,或者没有有效的传播sheet。如果您在未附加到表格文件的脚本文件中 运行,则需要使用 SpreadsheetApp.openById()SpreadsheetApp.openByUrl() 代替 SpreadsheetApp.getActive()

附带说明一下,您也没有检索 values 中的任何值,而只是声明一个范围。

// var values = sheet.getRange(2,1,5,12);
var values = sheet.getRange(2,1,5,12).getValues();

第二期:

比较日期并不是那么简单。

一个可能的解决方案删除所有不是来自今天的行是将currentDate声明为一个字符串,其格式类似于您在日期列使用。例如,如果您 sheet 日期看起来像 (May-06 2022):

const values = sheet.getRange(2,1,5,12).getDisplayValues();

const currentDate = Utilities.formatDate(new Date(), `YOUR_TIMEZONE`, `MMM-dd YYY`)

然后您可以删除 sheet 中日期与当前日期不匹配的所有行,使用您编写的 for 循环:

  for (let i = lastrow; i > 2; i--) {
    if (values[i-1][2] !== currentDate) {
      sheet.deleteRow(i)
    }
  }

如果您要删除特别是 1 天前的日期,您将不得不使用日期比较,这可以通过几种方式完成。

这是一种解决方案:

const currentDate = new Date();

for (let i = lastrow; i > 2; i--) {
  if (currentDate.getDate()-1 === values[i-1][2].getDate()) {
    sheet.deleteRow(i)
  }
}

解决方案

日期字符串方法:

function DeleteOldEntries() {

  const sheet = SpreadsheetApp.getActive().getSheetByName("Sheet 1");
  const values = sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn()).getDisplayValues();

  const currentDate = Utilities.formatDate(new Date(), "YOUR_TIMEZONE", "m/d/yyyy");

  for (let i = values.length-1; i >= 0; i--) {
    if (values[i][11] !== currentDate) {
      sheet.deleteRow(i+2)
    }
  }

}

日期比较:(一天前)

function DeleteOldEntries() {

  const sheet = SpreadsheetApp.getActive().getSheetByName("Sheet 1");
  const values = sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();

  const currentDate = new Date();

  for (let i = values.length; i >= 0; i--) {
    if (currentDate.getDate()-1 === values[i][11].getDate()) {
      sheet.deleteRow(i+2);
    }
  }

}