Google apps script 如何根据谷歌表格上的字体颜色计算单元格数?

Google apps script 如何根据谷歌表格上的字体颜色计算单元格数?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,“我在下面找到了这段代码。它对单元格背景色有效,但 对字体不起作用。有人能帮忙吗 function sumColoredCells(sumRange,colorRef) { var activeRg = SpreadsheetApp.getActiveRange(); var activeSht = SpreadsheetApp.getActiveSheet(); var activeformula = activeRg.getFormula(); v

“我在下面找到了这段代码。它对单元格背景色有效,但 对字体不起作用。有人能帮忙吗

    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;
 };
函数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;
对于(变量i=0;i
您的函数有很多问题-特别是,它使用了一个从未使用过的范围参数,而函数是在活动工作表中的活动范围内操作的。我不明白正则表达式想要实现什么,而且它似乎是一种不必要的复杂的迭代方式

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

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

   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;
    }
但是,请注意,如果范围中的值或格式发生更改,则不会重新计算此函数


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

您可以使用以下脚本:

/**
* @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;
};

@艾丹非常感谢你的帮助,这家伙工作正常。这个函数工作得很好,但它也可以计算空白单元格。由于单元格的默认属性为黑色,因此即使单元格为空白,函数也会对其进行计数。在这种情况下能做些什么吗?你说它不起作用是什么意思?提供您看到的屏幕截图,并描述您想要看到的内容。看起来您刚刚在这里发布了其他人的代码片段,并询问为什么它不能满足您的需要。
/**
* @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;
};
=countFontColoredCells(C9:C127,Z20)