我有一张表可以应用查询功能逐行获取相应的搜索数据。但我需要应用 ArrayFormula 来自动执行此搜索过程。我想知道我该怎么办。
预期结果
检查短语结果1结果2结果3结果4
Apple Apple Ice Apple 番荔枝/糖苹果/番荔枝 蔷薇苹果/水苹果
浆果 Cape gooseberry/Inca berry/Physalis
man Mango 山竹
妈妈
水果 火龙果 鸡蛋果 百香果 黑心果/巧克力布丁果
j 菠萝蜜红枣 Jenipapo
nake 蛇果/Salak
me 角瓜 蜜瓜 枸杞子 鼠瓜
目前
检查短语结果1结果2结果3结果4
苹果苹果冰苹果
浆果苹果冰苹果
男人苹果冰苹果
妈妈苹果冰苹果
水果 苹果 冰苹果
j 苹果冰苹果
裸苹果冰苹果
我苹果冰苹果
我目前实现的是单行使用这个:
=IF(LEN(F2:F)=0, IFERROR(1/0), IF(LEN(F2:F)>0, Query(TRANSPOSE(QUERY(Fruits!B:B, "select B where B contains '" & F2:F & "'")),"select * limit 12")))
我该怎么办。请建议我。我在这里附上我的文件链接。 [我的 Google 表格文件] (https://docs.google.com/spreadsheets/d/1QDfruKtwJjmRQWqTlO3sBM-e9vp9QKwmla23ss0U1sY/edit#gid=1411907513)
=LAMBDA(PHRASES,FRUITS,
BYROW(PHRASES,LAMBDA(FRUIT,
TRANSPOSE(FILTER(FRUITS,REGEXMATCH(FRUITS,FRUIT)))
))
)(QUERY({Current!F2:F},"WHERE Col1 IS NOT NULL"),QUERY({Fruits!B:B},"WHERE Col1 IS NOT NULL"))
把这个公式放到G2中,结果应该和这张图一样。
我们在这里做的是...
如果需要,过滤器也可以替换为另一个 QUERY 函数,在这种情况下输出应该相同。
=LAMBDA(PHRASES,FRUITS,
BYROW(PHRASES,LAMBDA(FRUIT,
TRANSPOSE(QUERY(FRUITS,"WHERE Col1 CONTAINS '"&FRUIT&"'"))
))
)(QUERY({Current!F2:F},"WHERE Col1 IS NOT NULL"),QUERY({Fruits!B:B},"WHERE Col1 IS NOT NULL"))
根据您在评论中的要求,这是更新后的代码:
=LAMBDA(NOTNULL,LAMBDA(PHRASES,FRUITS,
BYROW(PHRASES,LAMBDA(PHRASE,
ARRAY_CONSTRAIN(
TRANSPOSE(IFNA(
QUERY(FRUITS,"WHERE UPPER(Col1) CONTAINS '"&UPPER(PHRASE)&"'"),
"")),
1,12)
))
)(QUERY({Current!F2:F},NOTNULL),QUERY({Fruits!B:B},NOTNULL)))("WHERE Col1 IS NOT NULL")
如果找不到匹配项,代码将留下一个空行,这在您的评论中是必需的
* Show blank if no valid return. (instead of #N/A)
,
你是什么意思
When there is no phrase match, that row skipped
?
在我的测试环境中不会。
但是如果你的意思是当你将'check phrase'列的某些部分留空时,它确实会破坏计算,因为从未提到过这种情况,你可能在check phrase列中有空白,所以我根本没有处理它。
如果是这种情况,您应该始终在一开始就将此类条件包含在您提供的示例数据中,否则这是另一个问题,也许最好在尝试解决后打开另一个问题来询问解决方案靠自己。
无论如何,如果您需要处理检查短语列中的空白,这是一个快速的解决方案:
=LAMBDA(NOTNULL,LAMBDA(PHRASES,FRUITS,
BYROW(PHRASES,LAMBDA(PHRASE,
ARRAY_CONSTRAIN(TRANSPOSE(IFNA(IF(PHRASE="","",QUERY(FRUITS,"WHERE UPPER(Col1) CONTAINS '"&UPPER(PHRASE)&"'")),"")),1,12)
))
)({Current!F2:F},QUERY({Fruits!B:B},NOTNULL)))("WHERE Col1 IS NOT NULL")
当'Check phrase'列中有空白时输出结果向上移动的原因是,正如我所说,我使用QUERY来摆脱2个源数据的额外空白,这有助于加快速度,但是如果数组值之间有空格,它们也会被删除,这会导致引用数组被缩短。
处理这个问题,最简单的办法是,不去掉空格,留在那里,在IFNA()里面,凡是遇到空PHRASE,直接用IF()跳过,什么都不做,结果就是留一个空格排
我发现这篇文章正在寻找解决我的问题的方法,我在下面想出了比以前的方法更简单的方法:
=BYROW(F2:F,LAMBDA(phrase,if(phrase<>"",IFERROR(TRANSPOSE(query(Fruits!B2:B4944,"select B where B contains '"&phrase&"' ")),),) ))
希望它能对将来的人有所帮助。