Google 表格:在 ArraryFormula 中使用查询

问题描述 投票:0回答:3

我有一张表可以应用查询功能逐行获取相应的搜索数据。但我需要应用 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)

filter lambda google-sheets-formula transpose array-formulas
3个回答
0
投票

使用:

=ARRAY_CONSTRAIN(LAMBDA(a, b, BYROW(a, LAMBDA(x, 
 TRANSPOSE(IFNA(FILTER(b, SEARCH(IF(x="", "×", x), b)))))))
 (F2:INDEX(F:F, MAX(ROW(F:F)*(F:F<>""))), Fruits!B2:B), 9^9, 12)


0
投票

=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中,结果应该和这张图一样。

我们在这里做的是...

  1. 使用 QUERY 去除 Current!F2:F 范围内的空白,将数组命名为 PHRASES with LAMBDA。
  2. 使用 QUERY 去掉 Fruits!B:B 范围内的空白,用 LAMBDA 将数组命名为 FRUITS。
  3. 使用 BYROW 按值处理单列数组 FRUITS,使用...
  4. BYROW 内部的 LAMBDA 将每个 ROW 的值命名为 FRUIT,
  5. 使用FILTER过滤数组FRUITS,
  6. 使用REGEXMATCH设置step.5中过滤函数的条件,字符串匹配返回TRUE,
  7. TRANSPOSE 每个过滤器的结果以满足您的显示格式。

如果需要,过滤器也可以替换为另一个 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"))

根据您在评论中的要求,这是更新后的代码:

  1. 为了使其不区分大小写,将 UPPER() 应用于转置查询中的 Col1 和 FRUIT,
  2. 要在该行上没有输出时显示空白而不是#N/A,请将 IFNA() 应用于 TRANSPOSE() 内的整个 QUERY(),
  3. 要限制输出数组的长度,请使用 ARRAY_CONSTRAIN() 调整 TRANSPOSE()。
=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()跳过,什么都不做,结果就是留一个空格排


0
投票

我发现这篇文章正在寻找解决我的问题的方法,我在下面想出了比以前的方法更简单的方法:

=BYROW(F2:F,LAMBDA(phrase,if(phrase<>"",IFERROR(TRANSPOSE(query(Fruits!B2:B4944,"select B where B contains '"&phrase&"' ")),),) ))

希望它能对将来的人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.