【发布时间】:2021-02-01 19:03:24
【问题描述】:
我有两个函数在午夜时在 Google 表格上的触发器上运行。其中一个 Delete60() 根据 A 列中的时间戳在 60 天后删除所有行。另一个 Delete30() 如果 D 列中的值为“书籍”,则应该在 30 天后提前删除行。
出于某种原因,Delete60() 函数的工作方式与预期完全一致,因此在午夜过后,它会删除所有 60 天前的行。但是Delete30() 函数似乎在一天之后运行 - 它在大致相同的时间(就在午夜之后)运行并根据 D 列正确删除,但只有 31 天前的行。任何 30 天前的东西都会留下来。我错过了什么吗?除了天数和对 D 列值的额外检查之外,代码似乎相同。额外检查是否会以某种方式影响时间?
function Delete60() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Request Info");//applies to active requests only
var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();
var values = datarange.getValues();// get all data in a 2D array
var currentDate = new Date();//today
var monthOld = Date.now() + -60*24*3600*1000;
for (i=lastrow;i>=1;i--) {
var tempDate = values[i-1][0];// arrays are 0 indexed so row1 = values[0] and col1 = [0]
if ((tempDate!="") && (tempDate <= (monthOld)))
{
sheet.deleteRow(i);
}
}
}
function Delete30() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Request Info");//applies to active requests only
var datarange = sheet.getDataRange();
var lastrow = datarange.getLastRow();
var values = datarange.getValues();// get all data in a 2D array
var currentDate = new Date();//today
var monthOld = Date.now() + -30*24*3600*1000;
for (i=lastrow;i>=1;i--) {
var tempDate = values[i-1][0];// arrays are 0 indexed so row1 = values[0] and col1 = [0]
var bookCheck = values[i-1][3];// values in column D
if ((tempDate!="") && (tempDate <= (monthOld)) && bookCheck=="Books")
{
sheet.deleteRow(i);
}
}
}
【问题讨论】:
-
你算过一个月的天数吗?有些月份有 31 天,你把它误认为是 30 天吗?或者,当您说午夜时,两个触发器到底是什么时候运行的?
-
是的,例如昨晚 Delete60() 函数删除了 8 月 19 日(60 天前)之前的所有内容,但从 9 月 18 日(30 天前)仍然有几个“书籍”条目。自从我启动脚本以来,我一直在跟踪它和相同的行为。两个触发器都是时间驱动的,并设置为在午夜到凌晨 1 点运行。昨晚 Delete30() 在 12:18:44 AM 运行,Delete60() 在 12:19:51 AM 运行。
-
也许它们不是“书籍”?检查 D 列中字符串末尾的空格?此外,如果它在上午 12:18:44 运行,则仍然不考虑在 12:18:4
3AM 的第 30 天(零设置时间日期也是如此)。
标签: javascript date datetime google-apps-script google-sheets