Google Sheets自定义函数需求:实现条件计数的参数化调用
Google Sheets 多条件动态统计方案
一、直接改公式(最快上手)
不用搞复杂的宏或函数,直接把硬编码的条件换成单元格引用就行:
- 在Sheet2的C1、C2、C3分别输入
m003、m001、P165,D1输入1(对应原公式里B列的条件) - 把原公式改成下面这样,用
&把通配符和单元格内容拼起来:
=(COUNTIFS('Sheet 1'!A:A;"*"&C1&"*";'Sheet 1'!A:A;"*"&C2&"*";'Sheet 1'!A:A;"*"&C3&"*";'Sheet 1'!B:B;D1))/(COUNTIFS('Sheet 1'!A:A;"*"&C2&"*";'Sheet 1'!A:A;"*"&C3&"*"))
之后只要修改C1-C3、D1的内容,公式会自动更新计算结果。
二、自定义函数(灵活适配多条件)
如果需要随时加/减A列的筛选条件,可以写个自定义函数:
- 打开Google Sheets的「工具」→「脚本编辑器」,粘贴下面的代码:
function DYNAMICCOUNT(criteriaArray, bColumnCriteria, dataSheetName) { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dataSheetName || 'Sheet 1'); const data = sheet.getDataRange().getValues(); let numerator = 0; let denominator = 0; const partialCriteria = criteriaArray.slice(1); // 去掉第一个A列条件,用于分母统计 for (let row of data) { const aCell = row[0].toString(); const bCell = row[1]; const meetsAllACriteria = criteriaArray.every(crit => aCell.includes(crit)); const meetsPartialACriteria = partialCriteria.every(crit => aCell.includes(crit)); if (meetsAllACriteria && bCell === bColumnCriteria) numerator++; if (meetsPartialACriteria) denominator++; } return denominator === 0 ? 0 : numerator / denominator; }
- 回到Sheet2,在任意单元格输入调用公式,比如:
=DYNAMICCOUNT(C1:C3, D1, "Sheet 1")
C1:C3是你要筛选的A列条件列表(比如m003、m001、P165)D1是B列的条件(比如1)- 第三个参数是数据工作表名称,可选,默认是Sheet1
如果分母为0,函数会返回0,避免出现错误值。
三、宏按钮(适合纯点击操作)
要是不想碰公式,整个按钮点一下就计算:
- 同样打开脚本编辑器,粘贴这段宏代码:
function runDynamicCount() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const inputSheet = ss.getSheetByName('Sheet 2'); const dataSheet = ss.getSheetByName('Sheet 1'); // 条件存在Sheet2的C1、C2、C3、D1,可根据自己需求改单元格位置 const criteria1 = inputSheet.getRange('C1').getValue(); const criteria2 = inputSheet.getRange('C2').getValue(); const criteria3 = inputSheet.getRange('C3').getValue(); const bCriteria = inputSheet.getRange('D1').getValue(); const data = dataSheet.getDataRange().getValues(); let numerator = 0; let denominator = 0; for (let row of data) { const aCell = row[0].toString(); const bCell = row[1]; const hasAll = aCell.includes(criteria1) && aCell.includes(criteria2) && aCell.includes(criteria3); const hasPartial = aCell.includes(criteria2) && aCell.includes(criteria3); if (hasAll && bCell === bCriteria) numerator++; if (hasPartial) denominator++; } // 结果输出到Sheet2的E1单元格,可自行修改位置 inputSheet.getRange('E1').setValue(denominator === 0 ? 0 : numerator / denominator); }
- 回到Sheet2,点击「插入」→「绘图」,画个按钮(比如矩形加文字“计算”),右键这个按钮→「分配脚本」,输入
runDynamicCount。
之后只要在C1-C3、D1输入条件,点按钮就能自动把结果放到E1。
内容的提问来源于stack exchange,提问作者Foxinetra
相关产品推荐
相关产品推荐

