Google Script - 比较日期是否比今天更早的功能

时间:2017-08-01 09:03:22

标签: google-apps-script google-sheets date-comparison

一列中有日期,如果更改其他列的状态,则会自动更新。如果从" Open"到"进展中"它确定了今天的日期。

我需要一个自动执行的功能""如果日期比今天早。

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

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

2 个答案:

答案 0 :(得分:0)

此脚本仅在此时由用户提示时才起作用。

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

或者以onEdit(e)启动该功能,当工作表中的任何内容发生变化时,该功能会自动触发脚本。但是,这可能会减慢在工作表中的工作速度,请参阅here

我不确定你是说你的脚本没有正常工作,也没有被触发。如果您希望我查看您的脚本,请将链接添加到Google工作表。

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

答案 1 :(得分:0)

您实际上不需要解析日期来比较它们,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);
    }