在 IMPORTRANGE QUERY 中使用列名

Using column names in IMPORTRANGE QUERY

我使用了一个脚本,该脚本允许我在同一 Google 工作簿 中的 sheet QUERY 中用列名替换 Col# 格式,但是当我使用 IMPORTRANGE 从不同的 Google Sheets spreadsheet 调用 QUERY 时,出现此错误:

Range not found (line 11, file "SQLfunction")

我的呼叫单元看起来像这样:

=QUERY(
  IMPORTRANGE("long-hairy-key","MASTER!A:BN"),
  IMPORTRANGE("long-hairy-key",SQL("MASTER!A:BN",STATS!D33,true)),
  1
 )

STATS!D33 是这样的:

select TRACT,PARID,LINE,OWN1,T_STATUS,ExhibitDate,FEET2,NewEase,TWSacres,ExistEase,PrevDistTWS,ATWSacres,ARdistance,StagingArea,Damages,UpdateReason,ACQ_STATUS where Col51 <>'' ORDER BY LINE ASC, TRACT ASC Label OWN1 'Landowner'

并且 SQL 函数来自 here.

有人可以推荐我如何调整脚本以适应 IMPORTRANGE 吗?

引用的 SQL() 自定义函数无法访问外部传播sheet。您必须调整 SQL() 自定义函数,使其能够访问外部价差sheet 或重新设计您的公式。

如果您要重新设计公式,一种方法是将外部数据的导入移出 "main formula"。为此,

  1. 首先,获取外部范围。添加一个新的sheet(假设它的名称是Sheet1)并将以下公式添加到A1 =IMPORTRANGE("long-hairy-key","MASTER!A:BN")
  2. 其次,将 "main formula" 替换为下一个:
=QUERY(
   Shee1!A:BN,
   SQL("Sheet1!A:BN",STATS!D33,true)),
   1
 )

您可以使用公式生成 sql 语句。

Step1. 使用 importrange 仅获取 headers。

将此公式粘贴到 Sheet1 A1 中:

=transpose(IMPORTRANGE("long-hairy-key","MASTER!A1:BN1"))

需要转置数据以制作字段名称的垂直列表。

Step2. 添加列号。

将此公式粘贴到 B1 中:

=ARRAYFORMULA(ROW(OFFSET(A1,,,counta(A:A))))

在这一步你会得到 table,它看起来像这样:

  A               B
1 FieldName1      1
2 FieldName2      2
3 FieldName3      3
4 FieldName4      4
5 FieldName5      5

Step3.合并SQL语句。

使用列 C 来指示要在查询中选择哪些列:

  A               B    C
1 FieldName1      1    1
2 FieldName2      2
3 FieldName3      3    1
4 FieldName4      4
5 FieldName5      5    1

并在空闲单元格 (F1) 中使用此公式:

="select Col"&JOIN(", Col",FILTER(B:B,C:C=1))

在我的例子中,这个公式给出了字符串 select Col1, Col3, Col5,这可以用在查询公式中:

=query(IMPORTRANGE("long-hairy-key","MASTER!A:BN"), F1)

使用额外的列让您的 SQL 更聪明,添加 where 子句、order bylabel 等等。


更新

所以这个 step-by-step 解决方案不能解决重新排列列的问题。

诀窍是使用列名列表并将其保存为值:

  1. 粘贴第 1 步中的公式:=transpose(IMPORTRANGE("long-hairy-key","MASTER!A1:BN1"))
  2. 复制它 → 去粘贴空格 → 值

然后您需要完成第 1 步和第 2 步才能制作当前号码列表。

然后你实际上会有两个 table。第一个将包含实际字段列表和字段编号,由步骤 1 和步骤 2 中的公式生成。这里是 Table1:

  A               B
1 FieldName1      1
2 FieldName2      2
3 FieldName3      3
4 FieldName4      4
5 FieldName5      5

第二个 table 将具有 SQL 设置。这是 Table2::

  A               B    C
1 FieldName1      1    1
2 FieldName3      3
3 FieldName2      2    1
4 FieldName4      4
5 FieldName5      5    1

其中的字段名称必须作为值输入。 B 列将包含 vlookup 函数:

= vlookup(A1, table1!A:B, 2, 0)

甚至 ArrayFormula:

= arrayformula(vlookup(offset(A1,,,counta(A1:A)), table1!A:B, 2, 0))

这就是您需要开始的全部内容。然后让您的查询更智能。