You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Google Sheets自定义函数countColors支持indirect()与R1C1引用?

修改countColors()函数以支持INDIRECT(R1C1)引用

原函数无法兼容INDIRECT(R1C1)组合的区域引用,核心问题是未正确解析这类动态生成的区域格式。以下是修改方案:

修改后的函数代码

function countColors(targetRange, colorCell) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var count = 0;
  
  // 解析目标区域参数,转换为有效Range对象
  var range;
  if (typeof targetRange === 'string') {
    range = sheet.getRange(targetRange);
  } else if (targetRange instanceof Array) {
    var formula = SpreadsheetApp.getActiveRange().getFormula();
    var rangeMatch = formula.match(/countcolors\((.*?),(.*?)\)/i);
    if (rangeMatch) {
      var rangeStr = rangeMatch[1];
      // 处理INDIRECT组合的起止区域
      try {
        var [startRef, endRef] = rangeStr.split(':');
        var startCell = sheet.getRange(startRef);
        var endCell = sheet.getRange(endRef);
        range = sheet.getRange(startCell.getRow(), startCell.getColumn(), 
                               endCell.getRow() - startCell.getRow() + 1, 
                               endCell.getColumn() - startCell.getColumn() + 1);
      } catch(e) {
        range = sheet.getRange(rangeStr);
      }
    } else {
      throw new Error("无法解析目标区域");
    }
  } else {
    throw new Error("目标区域参数格式无效");
  }
  
  // 解析颜色单元格参数,转换为有效Range对象
  var colorRange;
  if (typeof colorCell === 'string') {
    colorRange = sheet.getRange(colorCell);
  } else if (colorCell instanceof Array) {
    var formula = SpreadsheetApp.getActiveRange().getFormula();
    var colorMatch = formula.match(/countcolors\((.*?),(.*?)\)/i);
    if (colorMatch) {
      colorRange = sheet.getRange(colorMatch[2]);
    } else {
      throw new Error("无法解析颜色单元格");
    }
  } else {
    throw new Error("颜色单元格参数格式无效");
  }
  
  // 统计同色单元格数量
  var targetColor = colorRange.getBackground();
  var allColors = range.getBackgrounds();
  for (var row of allColors) {
    for (var cellColor of row) {
      if (cellColor === targetColor) count++;
    }
  }
  
  return count;
}

关键修改说明

  • 新增动态区域解析:针对INDIRECT("R[0]C[-2]",false):INDIRECT("R[0]C[-1]",false)这类组合引用,通过分割起止单元格地址,转换为连续Range对象。
  • 兼容多格式参数:同时支持字符串格式的引用(INDIRECT返回值)和直接传入的区域数组(原生A1引用场景)。
  • 保留原有功能:不影响原A1格式区域引用的使用逻辑。

使用方式

直接在Y2单元格使用原公式即可:

=countcolors((INDIRECT("R[0]C[-2]",false)):(indirect("R[0]C[-1]",false)),(indirect("R[0]C[-2]",false)))

内容的提问来源于stack exchange,提问作者Matthew Hamlyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:27:32