谷歌工作表脚本根据多个单元格中的日期删除行

时间:2018-02-03 00:26:20

标签: google-apps-script google-sheets google-sheets-api

我正在开发一款可从电子表格中删除旧内容的应用。我找到了几个基于特定数据隐藏或删除工作表的帖子,但它总是在一个单元格中。我需要能够检查每行三个单元格的日期。

该表单由一个表单填充,该表单要求用户输入他们希望在我们的视频中运行公告的三个日期,并在我教授的HS处打印公告。我只想删除旧数据,发现无数(好吧,也许是6或8)脚本的例子做了类似的事情,所以我抓了一个并尝试扩展逻辑语句来检查C,D和E列(使用索引) , 当然)。

它可以工作,但删除的任何行的日期不是今天而不是所有三列中的日期。我还需要让它计算空的单元格,因为它符合旧条件。

所以我尝试了Cooper下面建议的脚本,这是一个很大的进步。它仍然跳过具有空值的行,并且在一种情况下删除了我不想删除的行 在显示的图像中,表单接受来自教师的输入,这些教师最多提交三个日期的公告内容。我已将表单格式化为红色显示旧日期,今天显示为绿色,未来日期显示为黄色。我想删除所有红色或空单元格的行。然而,一个绑定者会强迫他们为所有三个人选择一个日期,而不是允许不输入。但是让代码将空白单元格识别为合格是很好的。 [![每日公告数据表] [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);
}
&#13;
&#13;
&#13;

接下来,我想了解如何制作能够将每日公告输出到Doc或pdf的内容。

1 个答案:

答案 0 :(得分:1)

试试这个:

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);
}

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