在谷歌电子表格中计算相同颜色的单元格

Count the cells with same color in google spreadsheet

本文关键字:颜色 单元格 计算 谷歌 电子表格      更新时间:2023-09-26

我试图计算具有相同背景颜色的单元格的数量,并将结果放在谷歌应用程序脚本中脚本的其他单元格中,但我不能这样做。我有下一个脚本,但不工作,我不知道这是问题:

function countbackgrounds() {
 var book = SpreadsheetApp.getActiveSpreadsheet();
 var range_input = book.getRange("B3:B4");
 var range_output = book.getRange("B6");
 var cell_colors = range_input.getBackgroundColors()[0];
 var color = "#58FA58";
 var count = 0;
 for( var i in cell_colors )
  if( cell_colors[i] == color ){
    range_output.setValue(++count);
  }
  else {
    return count; 
  }
 }  

如果您不想使用Google Sheets Power Tools手动编写代码,这是一个简单的解决方案:

注意:虽然这个工具在写这个答案的时候是免费的,但现在它是每年43.20美元或终身许可证89.95美元!

  1. 通过附加组件面板安装电动工具(Add-ons ->获得附加组件)
  2. 在电源工具侧边栏中单击Σ按钮,并在该菜单中单击"按颜色求和";菜单项
  3. 选择"模式单元格";使用您想要搜索
  4. 的颜色标记
  5. 选择"源范围"要计数的单元格
  6. 使用功能应设置为"COUNTA"
  7. 按"插入功能"键;然后你就完成了:)
function countbackgrounds() {
 var book = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = book.getActiveSheet();
 var range_input = sheet.getRange("B3:B4");
 var range_output = sheet.getRange("B6");
 var cell_colors = range_input.getBackgroundColors();
 var color = "#58FA58";
 var count = 0;
 for(var r = 0; r < cell_colors.length; r++) {
   for(var c = 0; c < cell_colors[0].length; c++) {
     if(cell_colors[r][c] == color) {
       count = count + 1;
     }
   }
 }
    range_output.setValue(count);
 }

你可以使用这个工作脚本:

/**
* @param {range} countRange Range to be evaluated
* @param {range} colorRef Cell with background color to be searched for in countRange
* @return {number}
* @customfunction
*/
function countColoredCells(countRange,colorRef) {
  var activeRange = SpreadsheetApp.getActiveRange();
  var activeSheet = activeRange.getSheet();
  var formula = activeRange.getFormula();
  var rangeA1Notation = formula.match(/'((.*)',/).pop();
  var range = activeSheet.getRange(rangeA1Notation);
  var bg = range.getBackgrounds();
  var values = range.getValues();
  var colorCellA1Notation = formula.match(/',(.*)')/).pop();
  var colorCell = activeSheet.getRange(colorCellA1Notation);
  var color = colorCell.getBackground();
  var count = 0;
  for(var i=0;i<bg.length;i++)
    for(var j=0;j<bg[0].length;j++)
      if( bg[i][j] == color )
        count=count+1;
  return count;
};

然后在google表格中调用这个函数:

=countColoredCells(D5:D123,Z11)

这是一个工作版本:

function countbackgrounds() {
 var book = SpreadsheetApp.getActiveSpreadsheet();
 var range_input = book.getRange("B3:B4");
 var range_output = book.getRange("B6");
 var cell_colors = range_input.getBackgroundColors();
 var color = "#58FA58";
 var count = 0;
 for( var i in cell_colors ){
 Logger.log(cell_colors[i][0])
  if( cell_colors[i][0] == color ){ ++count }
  }
range_output.setValue(count);
 }  

前面的函数对我不起作用,所以我制作了另一个函数,使用上面的答案之一的相同逻辑:解析单元格中的公式以查找要检查的单元格的引用范围,然后寻找彩色单元格。你可以在这里找到一个详细的描述:谷歌脚本计数与参考颜色,但代码如下:

function countColoured(reference) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var args = formula.match(/='w+'((.*)')/i)[1].split('!');
  try {
    if (args.length == 1) {
      var range = sheet.getRange(args[0]);
    }
    else {
      sheet = ss.getSheetByName(args[0].replace(/'/g, ''));
      range = sheet.getRange(args[1]);
    }
  }
  catch(e) {
    throw new Error(args.join('!') + ' is not a valid range');
  }
  var c = 0;
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 1; i <= numRows; i++) {
    for (var j = 1; j <= numCols; j++) {
      c = c + ( range.getCell(i,j).getBackground() == "#ffffff" ? 0 : 1 );
    }
  }
  return c > 0 ? c : "" ;
}