首页 文章

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

提问于
浏览
0

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

该表格填写一个表格,要求用户输入三个日期,他们希望在我们的视频中播放公告,并在我教授的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);
}

接下来,我想弄清楚如何制作能够将每日公告输出到Doc或pdf的内容 .

1 回答

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

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

相关问题