使用查询根据标题选择列

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

我有一个动态表格,其中的列时不时地移动。因此,我想在查询中引用我的列名称。不幸的是我不太了解,互联网提出了更多问题。

我的公式如下:

`=query('X Source'!A:AP, "select D, E, AA, AM, X, A where "&if(month(now())=1,"(month(A)<11)","(month(A)  <=month(now())-2)")&" and (V like 'C & G' or V like 'SAS' or V like 'SXS D' or V like 'DIR') Order By A    desc")

D = Cinter
E = Cluster
AA = Creation Date
AM = Change Ow
X = Title
A = Date`

Do you have any idea ? I would like not to write a script.




I have already tried with the function filter to bypass but there I get no further because of the filtering after month. 

`={FILTER('X Source'!AA:AA, 'X Source'!V:V="SAS",'X Source'!X:X<>"%BY SB%",'X Source'!X:X<>"%SB ONLY%",     month('X Source'! AA:AA)=month(today())-1);FILTER('X Source'!AA:AA,'X Source'!V:V="SXS D",'X     
Source'!X:X<>"%BY SB%",'X Source'!X:X<>"%SB ONLY%"`
google-sheets filter columnheader dynamic-script-loading
3个回答
0
投票

您可以定义以下命名函数(数据 > 命名函数 > 添加新函数)

姓名:

BETTERQUERY(range, better_query, headers)

定义

=QUERY({range},IF(IFERROR(SPLIT(better_query,"`")=better_query,1),better_query,
REGEXREPLACE(REDUCE(better_query,REGEXEXTRACT(better_query,REGEXREPLACE(
REGEXREPLACE(better_query,"([()\[\]{}|\\^$.+*?])","\\$1"),"`(.*?)`","`($1)`")),
LAMBDA(acc,cur,SUBSTITUTE(acc,cur,IFNA("Col"&MATCH(cur,INDEX(range,1),0),cur)))),
"`(Col\d+)`","$1")),headers)

然后像这样使用它:

=BETTERQUERY('X Source'!A:AP',"select `Cinter`, `Cluster`, `Creation date` ...",1)

有关其工作原理的更多信息,请参阅如何在 QUERY 中使用列名称


0
投票

您可以使用 MATCH 来查找列数,并在大括号中获取您的范围,这样您就可以将它们称为 Col1,Col2,Col3 而不是 A,B,C

为了让它更有活力并且你可以改变你的范围,我把它包裹在 LAMBDA 中。在标题中,我匹配了您的所有值并用逗号将它们连接起来。 “日期”仅与该列匹配。第五列 当您说哪些列位于哪些标题时,我怀疑这是否是一个错误。请将“Col”&MATCH(“Title”,INDEX(range,1),0)”中的“Title”更改为实际所需的标题标题(现在位于V列中),以便正确匹配:

=LAMBDA(range,
LAMBDA(headers,date,title,query({range}, "select "&headers&" where "&if(month(now())=1,"(month("&date&")<11)","(month("&date&")  <=month(now())-2)")&" and ("&title&" like 'C & G' or "&title&" like 'SAS' or "&title&" like 'SXS D' or "&title&" like 'DIR') Order By "&date&" desc"))(
  JOIN(",",INDEX("Col"&MATCH({"Cinter","Cluster","Creation Date","Change Ow","Title","Date"},INDEX(range,1),0))),
  "Col"&MATCH("Date",INDEX(range,1),0),
  "Col"&MATCH("Title",INDEX(range,1),0)
))
('X Source'!A:AP)

在我的带有随机列的虚拟示例中,查询的内部部分将如下所示:

“选择 Col7,Col3,Col15,Col20,Col11,Col12 其中(月(Col12)<11) and (Col11 like 'C & G' or Col11 like 'SAS' or Col11 like 'SXS D' or Col11 like 'DIR') Order By Col12 desc"


使用其他语言环境进行更新

=LAMBDA(range; LAMBDA(headers;date;pl;query({range}; "select "&headers&" where "&if(month(now())=1;"(month("&date&")<11)";"(month("&date&") <=month(now())-2)")&" and ("&pl&" like 'C & G' or "&pl&" like 'SAS' or "&pl&" like 'SXS D' or "&pl&" like 'DIR') Order By "&date&" desc";1))( JOIN(",";INDEX("Col"&MATCH({"Cinter";"Cluster ";"Creation Date";"Change Owner";"Title";"Date"};INDEX(range;1);0))); "Col"&MATCH("Date";INDEX(range;1);0); "Col"&MATCH("PL";INDEX(range;1);0) )) ('X Source'!A1:AS)


0
投票

这是我基于这篇文章的公式,它要短得多:

=QUERY(INDIRECT(A4&"!A1:Z"),"SELECT "&SUBSTITUTE(ADDRESS(1, MATCH(A5,INDIRECT(A4&"!A1:Z1"),0), 4),1,""))
  • 将工作表名称放入
    A1
  • 将标题名称(第一行)放入
    A2
  • 它还将在您的查询中包含标头名称,如果您想删除它,请修改 first INDIRECT 函数并将其设置为
    INDIRECT(A4&"!A2:Z")
© www.soinside.com 2019 - 2024. All rights reserved.