使用Google电子表格中的其他单元格进行条件格式设置

时间:2013-08-07 20:41:56

标签: google-apps-script google-sheets

我正在尝试生成一个脚本,根据行中其他单元格的内容更改单元格颜色。

基本上,如果条目的日期(第1列)超过前两天且单元格小于1的数字,我想将单元格(第6列)更改为红色。 但如果第三列(第5列)更改为Y,则将单元格格式化为绿色。

我遇到了第5行的getRange返回null的问题,但是想检查我是否正确地执行了此操作。 谢谢!

function formatting() {
  var now  = new Date().getTime();
  var twoDaysInMilliseconds = 172800000;

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Enquiry Tracking');
  var columnBooked = sheet.getRange(2, 5, sheet.getLastRow()-1, 1);
  var bValues = columnBooked.getValues();

  for (var i = 0; i < bValues.length; i++) {
    var columnFU = sheet.getRange(i + 2, 6, 1, 1);
    if (bValues[i][0] != 'y')  {
      var rowdate = new Date(sheet.getRange(i + 2, 1, 1, 1).getValue()).getTime();

      if (now - rowdate > twoDaysInMilliseconds) AND (columnFU.getValue() < 1)
      { 
         columnFU.setBackgroundColor('red');
      }

    }
    else {
      columnFU.setBackgroundColor('green');
    }
  }
}

1 个答案:

答案 0 :(得分:1)

你正在走上正轨。您使用.getRange()获得的错误可能是由于行或列的值无效。为避免此类问题,您可以依赖.getDataRange().getValues()将整个电子表格的内容读入数组。完成后,您可以访问结果数组中任何列的值。

其他一些评论:

  • 电子表格行&amp;列开始编号为1,而Javascript数组从0开始。这总是很棘手,所以最好尽量避免在代码中使用数字。相反,使用变量。在此示例中,通过从电子表格列号中减去1来计算数组索引。
  • 使用getValue()getValues()从电子表格中读取时,包含日期的单元格显示为javascript日期对象,例如如果检查调试器,“1/1/2013 16:54:00”为(new Date(1357077240000))。因此,您无需在代码中使用new Date(...)
  • Javascript中的AND运算符为&&。 (OR||。)
  • setBackgroundColor()已被弃用,请改用setBackground(color)。如果您要设置一系列颜色(就像您一样),只需使用setBackgrounds()一次即可接受二维颜色数组,从而提高脚本效率。
  • 通过重新安排各种if语句,可以提高效率。 (这个想法是为了减少计算投资。在像许多Google API调用一样运行速度慢的情况下,这种想法可以使脚本免于超时。在这个例子中,.getTime()函数很快,所以它不是真的有必要重构代码。)

更新了代码

function formatting() {
  var now  = new Date().getTime();
  var twoDaysInMilliseconds = 2 * 24 * 60 * 60 * 1000; //172800000;
  var headers = 1; // # rows of headers to skip

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Enquiry Tracking');
  var data = sheet.getDataRange().getValues().splice(headers); // all data, skipping headers
  var colBooked = 5-1;  // Column numbers -1 to map to 0-based array
  var colDate = 1-1;
  var colFU = 6-1;
  var colors = [];

  for (var row = 0; row < data.length; row++) {
    colors[row] = ['transparent']; // default - no color
    if (data[row][colBooked] === 'y')  {
      colors[row][0] = 'LawnGreen';
    }
    else {
      if (data[row][colFU] < 1) {
        var rowdate = (data[row][colDate]).getTime();

        if (now - rowdate > twoDaysInMilliseconds)
        { 
           colors[row][0] = 'Tomato';
        }
      }
    }
  }
  // Set the colors for all data cells in ColFU
  sheet.getRange(1+headers,colFU+1,colors.length,colors[0].length).setBackgrounds(colors);
}