google 工作表脚本,用于根据多个单元格中的日期删除行

google sheets script to remove rows based on dates in multiple cells

我正在开发一个应用程序来删除传播中的旧内容sheet。我发现有几篇文章根据特定数据隐藏或删除 sheets,但它总是在一个单元格中。我需要一些东西来检查每行三个单元格中的日期。

sheet 由一个表格填充,该表格要求用户输入三个日期,他们希望在我们的视频和印刷版公告中向 运行 发布公告,我所在的 HS 在那里任教。我只是想删除旧数据,发现了无数(好吧,可能有 6 或 8 个)执行类似操作的脚本示例,所以我抓起一个并尝试扩展逻辑语句以检查 C、D 和 E 列(使用索引, 当然)。

它有效,但会删除所有日期不是今天的行,而不是所有三列中的日期。我还需要让它将空的单元格计数为符合条件的旧单元格。

所以我尝试了 Cooper 下面建议的脚本,这是一个很大的进步。它仍在跳过具有空值的行,并且在一种情况下删除了我不想删除的行 在显示的图像中,表单接受教师的输入,教师最多提交三个日期的公告内容。我已将 sheet 格式化为以红色显示旧日期,以绿色显示今天,以黄色显示未来日期。我想删除包含所有红色或空单元格的行。然而,创可贴将迫使他们为所有三个人选择一个日期,而不是允许不参加。但是让代码将空白单元格识别为合格的会很好。 [![每日公告数据Sheet][1]][1]

这是最终起作用的方法。我确信有一些更流畅的方法可以做到这一点,但实际上我的编程能力有所提高,首先通过日志解决问题,然后在我有证据证明我所做的工作有效后继续。

/*
Here is the thinking:
I need to have a script that is run from Add-ons that checks each cell of a range
for dates. It can be done through conditional formatting bg colors, but that is 
redundant. 

The first thing is to create the functions that find and return row numbers that have all 
old dates. In the initial build these can be returned to the log (Logger.log()) inside 
of a for(loop).
'*/

function readRows() {
  var sh=SpreadsheetApp.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var rowsDeleted=0;
  var today=new Date().valueOf();
  //cycle through rows. In each row check column values for date. if date is old, add 1 to oldCount
  for(var i=vA.length-1;i>=0;i--) {
    var oldCount=0;
    if(new Date(vA[i][2]).valueOf()<today) {
    oldCount++;
    }
    if(new Date(vA[i][3]).valueOf()<today) {
    oldCount++;
    }
    if(new Date(vA[i][4]).valueOf()<today) {
    oldCount++;
    }
    if(oldCount>2) {
      sh.deleteRow(i+1);
      rowsDeleted++;
    }
  }

  Logger.log(rowsDeleted);
}

接下来我想弄清楚如何制作将每日公告输出到 Doc 或 pdf 的东西。

试试这个:

function readRows() {
  var sh=SpreadsheetApp.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var rowsDeleted=0;
  var today=new Date().valueOf();
  for(var i=vA.length-1;i>=0;i--) {
    if ((new Date(vA[i][2]).valueOf()<today)||(new Date(vA[i][3]).valueOf()<today)||(new Date(vA[i][4]).valueOf()<today) ){
      sh.deleteRow(i+1);
      rowsDeleted++;
    }
  }
  Logger.log(rowsDeleted);
}

我不完全确定你想要什么,但这可能会有所帮助。当你删除行时,你应该从底部开始。