【问题标题】:google sheets script to remove rows based on dates in multiple cells谷歌表格脚本根据多个单元格中的日期删除行
【发布时间】:2018-02-03 00:26:19
【问题描述】:

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

该表格由一个表单填充,该表单要求用户输入他们希望公告在我们的视频中运行的三个日期,并在我任教的 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 的东西。

【问题讨论】:

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


    【解决方案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);
    }
    

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

    【讨论】:

    • 谢谢。这将删除其中包含先前日期的任何行。我做过一些 ActionScript 编程,所以 Javascript 看起来很熟悉。我知道循环应该从底部开始——我不知道为什么我找到的例子是相反的。
    • 但是:您使用的 if 语句包括 (vA[i][2]).valueOf()。我知道 i 是循环的当前值,指的是一行。 [2] 是我理解的第三列,从零开始索引。如果一个单元格是空白的,我认为这会导致少于今天。
    • 我想到让每个通过
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多