更新到Google Sheet颜色更改中的第一个单元格

时间:2014-11-13 21:48:01

标签: google-apps-script google-sheets

前几天我发布了关于获取谷歌工作表以将单元格的背景颜色更改为红色的情况,如果该行中的任何单元格具有红色背景。我现在试图检查黄色,橙色和红色,并相应地更改第一个单元格(每个颜色取代下一个,所以黄色只有在没有橙色或红色单元格的情况下)。

Serge insas提供的代码完美无缺:

  function MakeRed(){
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = book.getActiveSheet();
  var first_column = "B";
  var first_row = 1;
  var last_row = sheet.getLastRow();
  var last_column = sheet.getLastColumn();
  var active_row = 1;
  var range_input = sheet.getRange(1,1,last_row,last_column);
  var range_output = sheet.getRange("A1");
  var cell_colors = range_input.getBackgroundColors();
  var color = "#ff0000";

  for(var r = 0; r < cell_colors.length; r++) {
    var rowWoColA = cell_colors[r].slice(1);
    if(rowWoColA.indexOf(color)>-1) {
      cell_colors[r][0]=color;
    } else {
      cell_colors[r][0]="#ffffff";
    }
  }
  range_input.setBackgroundColors(cell_colors);// update sheet colors
}

我将代码修改为我认为适用于此版本的代码,但我什么也没得到(奇怪的是,Google表格中的执行记录仍为空白?)

  function ColorOfCol(){
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = book.getActiveSheet();
  var first_column = "B";
  var first_row = 1;
  var last_row = sheet.getLastRow();
  var last_column = sheet.getLastColumn();
  var active_row = 1;
  var range_input = sheet.getRange(1,1,last_row,last_column);
  var range_output = sheet.getRange("A1");
  var cell_colors = range_input.getBackgroundColors();
  var color1 = "#ffff00";
  var color2 = "#ff9900";
  var color3 = "#ff0000";

  for(var r = 0; r < cell_colors.length; r++) {
    var rowWoColA = cell_colors[r].slice(1);
    if(rowWoColA.indexOf(color1)>-1) {
      cell_colors[r][0]=color1;
    } else if(rowWoColA.indexOf(color2)>-1) {
      cell_colors[r][0]=color2;
    } else if(rowWoColA.indexOf(color3)>-1) {
      cell_colors[r][0]=color3;      
    } else {
      cell_colors[r][0]="#ffffff";
    }
  }
  range_input.setBackgroundColors(cell_colors);// update sheet colors
}

2 个答案:

答案 0 :(得分:0)

这里添加的代码对我来说非常合适。但请确保您没有在空Google表格上测试此代码,因为下面的代码会根据单元格中的文本值返回值,而不是基于背景颜色。

var last_row = sheet.getLastRow();
 var last_column = sheet.getLastColumn();

还能够正确查看Apps脚本控制台中的执行脚本。

希望有所帮助!

答案 1 :(得分:0)

如我之前的评论中所述,只要您符合条件,代码就会起作用。即使表格中没有数据,第一次调用SpreadsheetApp.getActiveSpreadsheet() 也会导致执行记录中的条目。你认为某些事情很奇怪。

验证预期条件是一种很好的做法,如果用户不满足,则提醒用户注意重要的条件。在您的情况下,如果电子表格中没有数据,那么您将不会读取任何颜色 - 这将是悲伤的。您可以检查条件并抛出错误,例如:

if (cell_colors.length == 0) throw new Error( 'No data in sheet' );

很酷的事情 - 使用getDataRange()可以避免这种情况,因为它总是返回一个范围,即使工作表是空的,在这种情况下它只是A1。无论如何,唯一要检查的行将是那些包含数据的行 - 因此您仍然可以看到在A列中没有预期颜色的行。

这是您功能的更紧凑版本:

function ColorOfCol(){
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = book.getActiveSheet();
  var range_input = sheet.getDataRange();
  var cell_colors = range_input.getBackgrounds();
  if (cell_colors.length == 0) throw new Error( 'No data in sheet' );

  // List of colors in priority order, default at end.
  var color = ["#ffff00","#ff9900","#ff0000","#ffffff"];

  for (var r = 0; r < cell_colors.length; r++) {
    // check for all colors EXCEPT our default, the last in color[]
    for (var b=0; b<color.length-1; b++) {
      // -1 means not found, but 0 means found in first column, which we don't care about
      if (cell_colors[r].indexOf(color[b])>0) {
        // found this color, stop searching, with 'b' == found color
        break;
      }
    }
    // 'b' will contain the color index. If none found, it will be the last color, our default.
    cell_colors[r][0]=color[b];
  }
  range_input.setBackgrounds(cell_colors);// update sheet colors
}