0

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

基本上,如果条目的日期(第 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');
    }
  }
}
4

1 回答 1

1

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

其他一些评论:

  • 电子表格的行和列从 1 开始编号,而 Javascript 数组从 0 开始。这总是很棘手,因此最好尽可能避免在代码中使用数字。相反,使用变量。在此示例中,数组索引是通过从电子表格的列号中减去 1 来计算的。
  • 当使用getValue()or从电子表格中读取时,如果您检查调试器getValues(),包含日期的单元格将显示为 javascript 日期对象,例如 "1/1/2013 16:54:00" is 。(new Date(1357077240000))因此,您无需new Date(...)在代码中乱七八糟。
  • Javascript 中的AND运算符是&&. (OR||。)
  • setBackgroundColor()已弃用,请setBackground(color)改用。如果您有一系列颜色要设置(如您所做的那样),您的脚本将通过setBackgrounds()只使用一次来提高效率,它接受一个二维颜色数组。
  • 通过重新安排各种 if 语句可以提高效率。(这个想法是为了减少计算投资。在像许多谷歌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);
}
于 2013-08-20T15:49:03.407 回答