Google Sheets中ArrayFormula多IF规则匹配返回全部结果问题
问题
在Google Sheets中需创建公式,基于rules工作表的规则评估主工作表每一行,返回所有符合规则的结果(而非仅首个匹配项)。每条规则需满足全部条件时,返回rules!G3:G对应的结果。
Rules工作表结构
| Rule ID | Account Condition | Description Contains | Category Condition | Min Amount | Max Amount | Result |
|---|---|---|---|---|---|---|
| 2 | Account1 | 任意 | 任意 | 任意 | 任意 | Test1 |
| 1 | 任意 | Rent | 任意 | 500 | 2200 | Rent |
| 3 | Account2 | Entertainment | 任意 | 任意 | 任意 | Test2 |
| 4 | Account2 | Utilities | 任意 | 任意 | 任意 | Test3 |
主工作表结构
| UniqueID | Date | Account | Description | Category | Amount | AccountKey |
|---|---|---|---|---|---|---|
| ID1 | 2024/1/1 | Account1 | 房租支付 | Rent | -1500 | Account1 |
| ID2 | 2024/1/2 | Account2 | 其他支付 | Other | -100 | Account2 |
| ID3 | 2024/1/3 | Account1 | 其他支付 | Another Category | -200 | Account1 |
| ID4 | 2024/1/4 | Account2 | 其他支付 | Different Category | -300 | Account2 |
| ID5 | 2024/1/5 | Account2 | 娱乐服务 | Yet Another Category | -400 | Account2 |
| ID6 | 2024/1/5 | Account2 | 城市公用事业费 | Yet Another Category | -401 | Account2 |
期望输出
| Result |
|---|
| Rent |
| Test2 |
| Test1 |
| Test2 |
| Test2 |
额外需求
公式需支持模糊匹配:检查主表Description是否包含rules表Description Contains列的关键词(非完全匹配)。
解决方案
1. 单列返回所有匹配结果(每个结果占一行)
在主表空白列(如H2)输入以下公式,自动生成所有匹配结果:
=TOCOL(MAP(A2:A7, LAMBDA(id, FILTER(rules!G$3:G, (rules!B$3:B="任意")+(rules!B$3:B=XLOOKUP(id, A:A, C:C))>0, (rules!C$3:C="任意")+ISNUMBER(SEARCH(rules!C$3:C, XLOOKUP(id, A:A, D:D)))>0, (rules!D$3:D="任意")+(rules!D$3:D=XLOOKUP(id, A:A, E:E))>0, (rules!E$3:E="任意")+(ABS(XLOOKUP(id, A:A, F:F))>=rules!E$3:E)>0, (rules!F$3:F="任意")+(ABS(XLOOKUP(id, A:A, F:F))<=rules!F$3:F)>0 ) )), 3)
2. 同一单元格拼接多个结果(逗号分隔)
若希望主表每行的所有匹配结果在同一单元格,使用此公式:
=ARRAYFORMULA(IF(A2:A="", "", TEXTJOIN(", ", TRUE, FILTER(rules!G$3:G, (rules!B$3:B="任意")+(rules!B$3:B=C2:C)>0, (rules!C$3:C="任意")+ISNUMBER(SEARCH(rules!C$3:C, D2:D))>0, (rules!D$3:D="任意")+(rules!D$3:D=E2:E)>0, (rules!E$3:E="任意")+(ABS(F2:F)>=rules!E$3:E)>0, (rules!F$3:F="任意")+(ABS(F2:F)<=rules!F$3:F)>0 ) ) ))
公式关键逻辑
FILTER:核心筛选函数,逐条验证规则条件:(条件A)+(条件B)>0:实现逻辑或,满足任意一个条件即通过(处理"任意"规则)ISNUMBER(SEARCH(...)):实现模糊匹配,检测主表描述是否包含规则中的关键词ABS(金额):将负数金额转为绝对值,匹配规则中的Min/Max范围
MAP+TOCOL:遍历主表每行,收集所有匹配结果并展平为单列TEXTJOIN:将同一行的多个匹配结果用指定分隔符拼接
内容的提问来源于stack exchange,提问作者Charles Lehnen
相关产品推荐
相关产品推荐

