23

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

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; 
  }
 }  
4

5 回答 5

23

如果您不想使用Google Sheets Power Tools手动编码,则简单的解决方案:

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

  1. 通过附加组件面板安装 Power Tools(附加组件 -> 获取附加组件)
  2. 在 Power Tools 侧边栏中单击 Σ 按钮,然后在该菜单中单击“按颜色求和”菜单项
  3. 选择带有您要搜索的颜色标记的“图案单元格”
  4. 为要计数的单元格选择“源范围”
  5. 使用函数应设置为“COUNTA”
  6. 按“插入功能”,你就完成了:)
于 2015-05-16T12:06:54.963 回答
11
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);
 }
于 2013-01-16T19:28:28.437 回答
9

您可以使用此工作脚本:

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

然后在你的谷歌表格中调用这个函数:

=countColoredCells(D5:D123,Z11)
于 2019-11-11T09:06:33.977 回答
1

这是一个工作版本:

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);
 }  
于 2013-01-16T19:30:01.853 回答
1

以前的函数对我不起作用,所以我制作了另一个函数,它使用与上述答案之一相同的逻辑:解析单元格中的公式以查找要检查的单元格的引用范围,而不是查找彩色细胞。您可以在此处找到详细说明:Google Script count coloured with reference,但代码如下:

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 : "" ;
}
于 2020-05-29T08:10:10.927 回答