5

我有一个电子表格,我想根据日期有条件地格式化。如果日期是 7 天,我希望单元格变成红色,如果日期是 14 天,我希望它变成绿色,等等。

我想,这样做的第一步是创建一个简单的条件格式脚本,如果日期是今天,它将被突出显示。但是我的代码不起作用:(

function formatting() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); // get the sheet
  var columnF = sheet.getRange(2, 6, sheet.getLastRow()-1, 1); // get all the rows
  var fValues = columnF.getValues(); // get the values
  var today = Utilities.formatDate(new Date(), "GMT", "MM/dd/yyyy"); // get today's date
  for (var i = 0; i < fValues.length; i++) { // repeat loop
    if (fValues[i][0] == today) { // if the date in the cell is today's date...
      sheet.getRange(i + 2, 6, 1, 1).setBackgroundColor('green'); // ...turn that cell green
    }
  }
}

我究竟做错了什么?

谢谢!

4

3 回答 3

5

您不应该将日期转换为字符串,您可以像在 Srik 的回答中那样以天、月和年来解析日期,或者您也可以使用它们的原生值比较日期,如下所示,计算其他日期变得更容易......我创建了一些变量来简化数学:

day= 一天中的毫秒数

today= 今天 00:00 的日期(以天为单位)

function formatting() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); // get the sheet
  var columnF = sheet.getRange(2, 6, sheet.getLastRow()-1, 1).setBackgroundColor('white'); // get all the rows and clear colors
  var fValues = columnF.getValues(); // get the values
  var day = 24*3600*1000
  var today = parseInt((new Date().setHours(0,0,0,0))/day); // get date today
  for (var i = 0; i < fValues.length; i++) { // repeat loop
    var dataday = parseInt(fValues[i][0].getTime()/day)
    Logger.log(dataday+' = '+today)
    if (dataday == today-7) {sheet.getRange(i + 2, 6, 1, 1).setBackgroundColor('red')}
    else if (dataday == today-14){sheet.getRange(i + 2, 6, 1, 1).setBackgroundColor('green')}
    else if (dataday == today-21){sheet.getRange(i + 2, 6, 1, 1).setBackgroundColor('blue')}
  }
}

此处提供测试表

于 2013-01-16T07:08:39.883 回答
3

您不能直接比较 Date 对象。您需要按日期、月份和年份进行比较。尝试类似的东西

function formatting() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); // get the sheet
  var columnF = sheet.getRange(2, 6, sheet.getLastRow()-1, 1); // get all the rows
  var fValues = columnF.getValues(); // get the values
  var today = new Date(); 
  for (var i = 0; i < fValues.length; i++) { // repeat loop
    var fDate = new Date(fValues[i][0]);
    if (fDate.getDate() == today.getDate() && 
        fDate.getMonth() == today.getMonth() && 
        fDate.getFullYear() == today.getFullYear()) { // if the date in the cell is today's date...
      sheet.getRange(i + 2, 6, 1, 1).setBackgroundColor('green'); // ...turn that cell green
    }
  }
}
于 2013-01-16T05:12:48.157 回答
0

我会在 Serge 的帖子中补充说,在第 8 行中,最好不要使用 getDate() 调用。这是因为如果您在工作表本身中复制/粘贴了值,则 fValues 数组中的条目不一定是日期。

于 2016-08-20T21:26:36.103 回答