【问题标题】:Update to first cell in Google Sheet color change更新到 Google Sheet 颜色更改中的第一个单元格
【发布时间】:2014-11-13 21:48:01
【问题描述】:

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

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
}

【问题讨论】:

  • 对我来说很好,除了 setBackgroundColors() 已被弃用的抱怨。 (改用setBackgrounds()。)您是否有多个ColorOfCol 副本? 活动表中有数据吗?
  • 好的,除了我设置的触发器(对工作表使用 onChange 事件)似乎不再导致代码运行之外,它正在工作。如果我在代码编辑器中手动运行代码,或者按时间设置一个新的触发器(每分钟进行一次测试),那么这段代码就是我想要的。试图弄清楚为什么以前起作用的触发器现在不起作用。
  • 检查您是否正在使用任何需要身份验证的服务。 onChange 触发器匿名运行,这限制了它的功能。

标签: google-apps-script google-sheets


【解决方案1】:

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

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

还可以在 Apps 脚本控制台中正确查看执行记录。

希望有帮助!

【讨论】:

    【解决方案2】:

    正如我之前的评论中所述,只要您满足条件,代码就可以工作。但是,即使工作表中没有数据,第一次调用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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 2012-08-15
      相关资源
      最近更新 更多