【问题标题】:Google Sheets script deleting rows based on a timestamp and column value. Why is one working and not the other?Google 表格脚本根据时间戳和列值删除行。为什么一个工作而不是另一个?
【发布时间】: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:43 AM 的第 30 天(零设置时间日期也是如此)。

标签: javascript date datetime google-apps-script google-sheets


【解决方案1】:

试试这个:

function Delete60() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("Request Info");
  var rg=sh.getDataRange();
  var values=rg.getValues();
  var cd=new Date();
  var mold=new Date(cd.getFullYear(),cd.getMonth(),cd.getDate()-60).getTime();
  var d=0;
  values.forEach(function(r,i){if(new Date(values[i][0]).getTime()<=mold){sh.deleteRow(i+1-d++)}});
}

function Delete30() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("Request Info");
  var rg=sh.getDataRange();
  var values=rg.getValues();
  var cd=new Date();
  var mold=new Date(cd.getFullYear(),cd.getMonth(),cd.getDate()-30).getTime();
  var d=0;
  values.forEach(function(r,i){if(new Date(values[i][0]).getTime()<=mold){sh.deleteRow(i+1-d++)}});
}

function Delete30Equal2Books() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("Request Info");
  var rg=sh.getDataRange();
  var values=rg.getValues();
  var cd=new Date();
  var mold=new Date(cd.getFullYear(),cd.getMonth(),cd.getDate()-30).getTime();
  var d=0;
  values.forEach(function(r,i){if(r[3]=="Books"){sh.deleteRow(i+1-d++)}});
}

【讨论】:

  • 太好了,我怎样才能让 Delete30() 函数只在 D 列中的值正好是“Books”时才删除?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多