2016-06-07 104 views
0

我已經使用了一個腳本,它允許我在同一Google 工作簿中的工作表QUERY中替換Col#格式的列名。在Google表格中使用列名IMPORTRANGE查詢

但是,當我打電話從不同的谷歌片工作簿IMPORTRANGE查詢時,我得到這個錯誤:沒有找到範圍(第11行,文件「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函數就是從這裏開始: https://productforums.google.com/forum/#!topic/docs/vTgy3hgj4M4

有人可以推薦我如何調整腳本以適應IMPORTRANGE?

回答

0

被引用的SQL()自定義函數無法訪問外部電子表格。您必須調整SQL()自定義函數以使其能夠訪問外部電子表格或重新設計公式。

如果你去重新設計公式,一種方法是將外部數據的導入移出「主公式」。要做到這一點,

  1. 首先,獲取外部範圍。添加一個新的工作表(假設它的名字是Sheet1)和下列公式添加到A1 =IMPORTRANGE("long-hairy-key","MASTER!A:BN")
  2. 二,更換「主要配方」其他像下一個:
 
=QUERY(
    Shee1!A:BN, 
    SQL("Sheet1!A:BN",STATS!D33,true)), 
    1 
) 
+0

魯本,這看起來像一個合理的方式來做到這一點,但不會計時是一個問題? –

+0

Ruben,感謝您重新格式化我的參賽作品。我無法弄清楚如何去做。 –

+0

@JimGarner:這個答案有兩個部分。主要部分是第一段,第二部分是關於第一部分提到的兩個解決方案路徑之一。我認爲你應該考慮更新你的問題或發佈一個新的問題,以包含更多關於特定情況和時間相關問題的細節。 –

0

您可以生成帶公式的sql語句。

Step1。使用導入範圍僅獲取標題。

在Sheet1中A1粘貼此公式:

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

需要轉置數據,使字段名的垂直列表。

Step2。添加列號。

粘貼此公式B1:

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

在這個步驟中,您將得到表,它看起來像這樣:

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

第三步。合併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 by,label等等。


更新

所以這一步一步的解決方案不與重排列解決問題。

的技巧是使用列名列表,並將其保存爲值:

  1. 粘貼第一步公式:=transpose(IMPORTRANGE("long-hairy-key","MASTER!A1:BN1"))
  2. 複製→去粘貼空間→值

然後你需要通過步驟1和2來製作當前firld號碼的列表。

然後你會有兩個表。第一個將保存由步驟1和步驟2的公式生成的實際字段列表和字段編號。這裏的Table1

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

而第二個表將有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)) 

這就是你需要開始。然後,讓您的查詢變得更加智能。

+0

Great Max。它確實直接回答了這個問題,這是很好的邏輯。但是想要使用字段名稱而不是列號的原因是在重新排列或插入列時。 所以這個解決方案不會解決這個問題,因爲我認爲你必須回過頭來,爲那些已經改變的領域重新設置C列。對? –

+0

沒錯!要避免重新排列的列出現問題,請使用唯一的字段列表並將其保存爲值。然後,如果只有字段名稱不會更改,則查詢將正常工作。我會更新我的答案以顯示如何。 –

+0

雖然這種方法適用於我使用列名稱,但它會對字段名稱更改,列更改和插入有更多的開銷管理。 所以,儘管這是一個解決方案,但對我來說更好的方法是@Ruben所提供的;首先將數據移動到導入區域中,在那裏我可以隱藏TAB,然後使用目前爲止我喜歡的現有SQL腳本在同一本書中的當前本地Tab/Sheet上運行。謝謝Max。 –