【问题标题】:Count the cells with same color in google spreadsheet计算谷歌电子表格中相同颜色的单元格
【发布时间】:2013-01-16 18:43:54
【问题描述】:

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

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

【问题讨论】:

标签: javascript google-apps-script google-sheets


【解决方案1】:

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

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

  1. 通过插件面板安装 Power Tools(插件 -> 获取插件)
  2. 从 Power Tools 侧边栏中单击 Σ 按钮,然后在该菜单中单击“按颜色求和”菜单项
  3. 选择带有您要搜索的颜色标记的“图案单元格”
  4. 为要计数的单元格选择“源范围”
  5. 使用函数应设置为“COUNTA”
  6. 按“插入函数”即可完成 :)

【讨论】:

  • 完美运行...谢谢! :)
  • 我在放置所有范围时出现“请选择一个包含数据的范围并重试”,如何解决?
  • 请注意,该工具的价格约为 90 美元
  • @tim99 哇...相当昂贵。我写答案时它仍然是免费的:(
【解决方案2】:
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);
 }

【讨论】:

    【解决方案3】:

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

    /**
    * @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)
    

    【讨论】:

    • 上述函数有几个问题:正则表达式在参数中被空格打破,函数的参数从未使用过,“values”变量从未使用过。
    【解决方案4】:

    这是一个工作版本:

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

    【讨论】:

    • Michael 的版本更通用,因为它在每一行和每一列中迭代(如果你有多个列......)我认为你的例子是你的真实用例。
    • 好的,这是迈克尔的版本?因为我有很多列要数。谢谢你的答案。
    • Michael 的版本是 Michael 发布的版本
    【解决方案5】:

    以前的函数对我不起作用,所以我制作了另一个函数,它使用与上述答案之一相同的逻辑:解析单元格中的公式以查找要检查的引用单元格范围,然后查看对于彩色细胞。 您可以在这里找到详细说明: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 : "" ;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 2017-09-11
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      相关资源
      最近更新 更多