Google 脚本 - 比较日期是否早于今天的函数

Google Script - function comparing if date is older than today

一列中有日期,如果其他列的状态发生变化,日期会自动更新。如果从 "Open" 更改为 "In progress",则设置今天的日期。

我需要一个自动执行 "something" 的功能,以防日期早于今天。

到目前为止有这段代码,但它不起作用,我不知道为什么。 谢谢

function backgroundformate() {
  var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
  var lastRow = odpovediSheet.getLastRow();
  var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues();
  var day = 24*3600*1000
  var today = parseInt((new Date().setHours(0,0,0,0))/day);

  for (var i=1; i < columnH.length; i++) {
    var dataday = parseInt(new Date(columnH[i][8]).getTime()/day);
    if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")}
    else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")}
  }
}

此时只有在用户提示时此脚本才会起作用。

您有两个选择,要么在其上放置一个触发器,让脚本 运行 例如每 5 分钟一次,请参阅 here

或者将函数作为 onEdit(e) 启动,当 sheet 中的任何内容发生更改时自动触发脚本。但是,这可能会减慢 sheet 中的工作速度,请参阅 here

我不确定您是说您的脚本没有正常工作还是没有被触发。如果你想让我看你的脚本,请在 google sheet 中添加 link。

function backgroundformate() {
  var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
  var lastRow = odpovediSheet.getLastRow();
  var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues();
  var day = 24*3600*1000
  var today = parseInt((new Date().setHours(0,0,0,0))/day);

  for (var i=1; i < columnH.length; i++) {
    var value = columnH[i][8].getValue();
    var dataday = parseInt(value/day);
    if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")}
    else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")}
  }
}

您实际上不需要解析日期来比较它们,JavaScript 本机就可以做到这一点。 这是您的工作代码:

function backgroundformate() {
  var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var lastRow = odpovediSheet.getLastRow();
  var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow(), 1).getValues();
  var today = new Date(new Date().setHours(23,59,59,0,0));// I set the hour to near midnight so you can get the right result today until 23:59:59 

  for (var i=1; i < columnH.length; i++) {
    var dataday =columnH[i][0];
    if (dataday < today) {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("red")}
    else {odpovediSheet.getRange(i+1, 8, lastRow, 1).setBackground("yellow")}
  }
}

此外,您在这段代码中确实犯了一个错误:

var dataday = parseInt(new Date(columnH[i][8]).getTime()/day);

您要查找的值位于索引 0 处,因为您在定义范围时仅从该列获取数据。 代码应该是

var dataday = parseInt(new Date(columnH[i][0]).getTime()/day);

但无论如何,解析是没有必要的。

也就是说,在循环中调用 ss 服务不是好的做法,您可以使用数组和单个 SS 调用更有效地做到这一点。 代码是这样的,请尝试比较执行速度

  function backgroundformate() {
      var odpovediSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Odpovědi formuláře");
      SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
      var columnH = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).getValues();
      var columnHBG = odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).getBackgrounds();
      var today = new Date(new Date().setHours(23,59,59,0,0));

      for (var i=0; i < columnH.length; i++) {
        var dataday =columnH[i][0];
        if (dataday < today) {
          columnHBG[i][0]='#F00';
        }else{
          columnHBG[i][0]='#FF0';
        }
      }
      odpovediSheet.getRange(2, 8, odpovediSheet.getLastRow()-1, 1).setBackgrounds(columnHBG);
    }