'我在下面找到了这段代码。它确实适用于单元格背景颜色,但是 在字体上不起作用。有人可以帮忙吗?
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;
};
答案 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")
但是请注意,如果范围中的值或格式发生更改,则不会重新评估此功能。
我认为您最好使用条件格式来根据单元格中的值格式化单元格,并使用相同的条件来计算类别。