如何根据单元格上的字体颜色对单元格进行计数?

时间:2018-06-22 14:58:06

标签: google-apps-script google-sheets

'我在下面找到了这段代码。它确实适用于单元格背景颜色,但是 在字体上不起作用。有人可以帮忙吗?

    function sumColoredCells(sumRange,colorRef) {
    var activeRg = SpreadsheetApp.getActiveRange();
     var activeSht = SpreadsheetApp.getActiveSheet();
     var activeformula = activeRg.getFormula();
    var countRangeAddress = activeformula.match(/\((.*)\,/).pop().trim();
   var backGrounds = activeSht.getRange(countRangeAddress).getBackgrounds();
  var sumValues = activeSht.getRange(countRangeAddress).getValues(); 
   var colorRefAddress = activeformula.match(/\,(.*)\)/).pop().trim();
  var BackGround = activeSht.getRange(colorRefAddress).getBackground();
 var totalValue = 0;
 for (var i = 0; i < backGrounds.length; i++)
 for (var k = 0; k < backGrounds[i].length; k++)
 if ( backGrounds[i][k] == BackGround )
    if ((typeof sumValues[i][k]) == 'number')
      totalValue = totalValue + (sumValues[i][k]);
  return totalValue;
 };

2 个答案:

答案 0 :(得分:1)

您可以使用以下脚本:

/**
* @param {range} countRange Range to be evaluated
* @param {range} colorRef Cell with font color to be searched for in countRange
* @return {number}
* @customfunction
*/
function countFontColoredCells(countFontRange,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.getFontColors();
  var values = range.getValues();

  var colorCellA1Notation = formula.match(/\,(.*)\)/).pop();
  var colorCell = activeSheet.getRange(colorCellA1Notation);
  var color = colorCell.getFontColor();

  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表格中调用此功能:

=countFontColoredCells(C9:C127,Z20)

答案 1 :(得分:0)

您的函数有很多问题-特别是,它采用了一个从未使用过的范围参数,而是该函数在活动表中的活动范围上运行。我不遵循正则表达式试图达到的目的,这似乎是遍历某些单元格不必要的复杂方法。

如果要在电子表格单元格中使用该函数,则这种类型的操作会出现问题,因为如果传入范围,则只能访问值而不是范围中的实际单元格,并且格式信息不可用。

您可以编写一个将范围作为字符串的函数,并使用该字符串从工作表中获取范围:

   function ColourCounter(rangeString, colourToFind) {

      var range = SpreadsheetApp.getActiveSheet().getRange(rangeString);
      var colourMap = {};

      for (var r=1; r<=range.getNumRows(); r++) {
        for (var c=1; c<=range.getNumColumns(); c++) {

          var cell = range.getCell(r, c);

          var colour = cell.getFontColor();

          if (colourMap[colour] == undefined) {
            colourMap[colour] = 1;
          } else {
            colourMap[colour] = colourMap[colour] + 1;
          }
        }
      }
      return colourMap[colourToFind] ? colourMap[colourToFind] : 0;
    }

然后您可以从工作表中调用它

=ColourCounter("A1:C3", "#ff0000")

但是请注意,如果范围中的值或格式发生更改,则不会重新评估此功能。

我认为您最好使用条件格式来根据单元格中的值格式化单元格,并使用相同的条件来计算类别。