【问题标题】:Using Query to select column based on the headers使用查询根据标题选择列
【发布时间】:2023-01-19 08:00:23
【问题描述】:

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

我的公式如下所示:

`=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


    【解决方案1】:

    您可以使用 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)和 (Col11 像 'C & G' 或 Col11 像 'SAS' 或 Col11 像 'SXS D' 或 Col11 像'DIR')按Col12 desc订购”

    【讨论】:

      【解决方案2】:

      您可以定义以下命名函数:

      名称:

      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)))),
      "`(Cold+)`","$1")),headers)
      

      然后像这样使用它:

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

      有关其工作原理的更多信息,请参阅How to Use Column Names in QUERY

      【讨论】:

        猜你喜欢
        • 2015-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-15
        • 2021-10-28
        相关资源
        最近更新 更多