Google Sheets跨工作表关联查询异常求助:公式匹配失效
问题出在哪?我帮你捋清楚
你的公式核心问题是完全没实现「通过TITLE-ID关联两个表」的逻辑,具体踩了两个大坑:
- 你用
{to_text(Catalog!B:J),to_text('Report_Nov 2017'!A:J)}把两个表的列横向拼在一起,这种操作是把两个表的第1行配第1行、第2行配第2行,跟TITLE-ID半毛钱关系都没有!所以结果里的Catalog数据和Report数据根本没对应上,自然会乱取Catalog的前25条。 - 条件里的
Col15 MATCHES '"&textjoin("|", TRUE, Catalog!J2:J)&"'逻辑搞反了,而且列索引可能也错了:你要的是「Report里的TITLE-ID在Catalog里有对应,且Catalog的STATUS不是Retired」,但你现在写的是找Col15(不知道是哪列)匹配Catalog的TITLE-ID,完全搞反了关联方向。另外,Catalog的B-J是9列,所以Report的A-J是第10到19列,如果Report的TITLE-ID是A列,那它是Col10,不是Col15,这也会导致筛选全错。
怎么改?给你两种靠谱方案
根据你的需求(结果条目数和Report_Nov_2017一致,只取匹配且非Retired的数),推荐两种实用方案:
方案1:用QUERY的JOIN逻辑(像写SQL一样关联)
如果你的Google Sheets支持QUERY里的JOIN语法,这个方案最清晰,类似数据库的内连接:
=QUERY( {Catalog!B:J, 'Report_Nov 2017'!A:M}, "SELECT Col1, Col3, Col4, Col9, Col16, Col17, Col18, Col19 WHERE Col4 != 'Retired' AND Col9 = Col15", // 这里Col9是Catalog的TITLE-ID(J列),Col15是Report的TITLE-ID,你要根据实际列调整! 1 )
要是JOIN语法用不了,换个筛选逻辑,只保留Report里存在的Catalog条目:
=ARRAYFORMULA( QUERY( { to_text(Catalog!B:B), to_text(Catalog!D:D), to_text(Catalog!E:E), to_text(Catalog!J:J), to_text('Report_Nov 2017'!J:J), to_text('Report_Nov 2017'!K:K), to_text('Report_Nov 2017'!L:L), to_text('Report_Nov 2017'!M:M) }, "SELECT Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8 WHERE Col3 != 'Retired' AND Col4 MATCHES '"&TEXTJOIN("|", TRUE, 'Report_Nov 2017'!A:A)&"'", 1 ) )
方案2:用ARRAYFORMULA+VLOOKUP(逐个匹配更稳妥)
如果QUERY的关联逻辑搞不清,用VLOOKUP从Catalog里逐个匹配Report的TITLE-ID,这个更直观:
// 先在某列(比如A列)取Catalog的匹配数据 =ARRAYFORMULA( IFERROR( VLOOKUP( 'Report_Nov 2017'!A2:A, // Report的TITLE-ID列,从第2行开始 {Catalog!J2:J, Catalog!B2:B, Catalog!D2:D, Catalog!E2:E}, // 左边是匹配用的TITLE-ID,后面是要取的TITLE、SUBTITLE、STATUS {2,3,4,1}, // 对应取的列顺序 FALSE ), "" ) )
然后直接把Report的UNITS、USD、GBP、EUR列(比如J-M列)拖到旁边,最后用QUERY筛选掉STATUS为'Retired'的行就行。
最后敲个黑板
- 一定要核对两个表的TITLE-ID列位置:比如Catalog的TITLE-ID是J列,Report的TITLE-ID到底是哪一列?别关联错了字段!
- 用
to_text转换格式是对的,避免因为数字/文本类型不匹配导致匹配失败。 - 要是想保证结果条目数和Report完全一致,优先用方案2,因为它是以Report为基础逐个匹配的,不会多也不会少。
内容的提问来源于stack exchange,提问作者David Tonkin
相关产品推荐
相关产品推荐

