=QUERY
関数のドキュメントを読む1 、 2 、、その一部は、クエリで列ヘッダーを直接使用できる必要があることを暗示しているようです。たとえば、=QUERY
関数 番目のオプションパラメーターを使用 、HEADERS
は、ヘッダー行の数を指定できるようにします。
列ヘッダーを使用できれば、列インデックスを使用する必要はありませんが、ほとんどのクエリはかなりきれいになりますが、機能させることはできません。
例:
A B C
---------------------
Name Phone City
Vidar 12345678 Oslo
Rupert 32165487 Berlin
列インデックスを使用してこれをクエリできます。
=QUERY(Sheet1!A1:C; "select A, B, C where A = 'Vidar'"; 1)
...ただし、列ヘッダーは使用しません:
=QUERY(Sheet1!A1:C; "select A, B, C where Name = 'Vidar'"; 1)
...これにより、Error:Invalid query:Column [名前]はテーブルに存在しません
このような列ヘッダーを使用することはまったく可能ですか?そうでない場合、HÈADERS
パラメーターの目的は何ですか?
QUERY
関数で言う3番目のパラメーターは、ヘッダーを制御するためのものです。 -1
に設定すると、Googleスプレッドシートは、利用可能なデータに基づいて、ヘッダーを選択する際の独自の選択肢を示します。
次のデータセットを使用しました。
0
に設定すると、ヘッダーは使用されず、次のようになります。
1
に設定すると、最初の行が使用され、次のようになります。
2
または-1
またはleft blank
に設定すると、最初の2行が使用され、次のようになります。
ヘッダーを使用して、この例で行った方法は不可能です。最も近いのは、this回答で説明されているQUERY
functionの使用方法です。準列名が使用されます。
このような列ヘッダーを使用することはまったく可能ですか?
はい、可能です。まず、MATCHを使用して、値が「名前」に一致する列の列番号を取得する必要があります。次に、ADDRESSを使用してセル参照を取得する必要があります。最後に、SUBSTITUTEを使用して、セル参照から行番号を削除する必要があります。
=QUERY(Sheet1!A1:C,"SELECT A, B, C where "&SUBSTITUTE(ADDRESS(1,MATCH("Name",Sheet1!A1:C1,0),4),1,"")&" = 'Vidar'")
古い投稿でしたが、自分のソリューションをミックスに追加したかったのです。私が見つけた列名はもっと便利だと思います。この方法では、ソースデータの列を挿入または削除するときにクエリ関数呼び出しを編集する必要はありません。
他の人がマッチと置換を使用するのを見ましたが、単にクエリ関数呼び出しとは少し異なるものを実装しました。
最初に-このようにすべての列名のルックアップテーブルを作成します。ルックアップテーブルは 'Config'シートの列Eで始まります。これは、シートに他のアイテムがあるため、独自のシートに簡単に配置できるためです。
列1(列名)
=TRANSPOSE( 'Source Data'!1:1 )
列2(列#)
=arrayformula( row( E2:E ) - 1 )
列3(列レター)
=arrayformula( if( int( F2:F / 26.5 ) > 0, char( int( F2:F / 26.5 ) + 64), "" ) & char( (F2:F - (int( F2:F / 26.5 ) * 26 ) ) + 64 ) )
列番号を文字に変換するための改良を受け入れています。この式は、78列しか処理できないという制限があります。私にとっては十分すぎるほど。
これで、クエリ関数呼び出しは次のようになります。
=query( 'Source Data'!$A:$L,
"Select " & " " &
vlookup( "Date", Config!$E:$G, 3, false ) & ", " &
vlookup( "Dev Query Engine Conn Count", Config!$E:$G, 3, false ) & ", " &
vlookup( "Dev Conn Limit Retry Count", Config!$E:$G, 3, false ) & ", " &
vlookup( "Dev Max Sequential Retry in One Minute", Config!$E:$G, 3, false ) & ", " &
vlookup( "Dev Conn Limit Errors", Config!$E:$G, 3, false ) & " " &
"where " & vlookup( "Display in Graph.", Config!$E:$G, 3, false ) & "=TRUE " &
"order by " & vlookup( "Date", Config!$E:$G, 3, false ) & " desc "
)
きれいにフォーマットされた状態に保ち、管理するのは悪くありません。苦労するのは、vlookup範囲の列インデックスを変更する場合だけです。しかし、これがヘルパー範囲であると考えれば、これは頻繁に変わるべきではありません。
古い質問ですが、この解決策は価値があると思います。
ヘッダー名を使用して列インデックス(A、B、C ...)を取得するカスタムスクリプト関数を使用して、次のようなことができます:
=query('MySheet'!A2:Z;
"select "&colIndex("'MySheet'!A1:Z1"; "Car name")&"
where "&colIndex("'MySheet'!A1:Z1"; "Car color")&"='Blue'"))
colIndex
関数を使用する場合:
function colIndex(a1NotationStr, header){
var range = SpreadsheetApp.getActiveSpreadsheet().getRange(a1NotationStr)
var row = range.getValues()[0]
//parse the header row and stop at first header matching our search
//use the related cell A1Notation and remove all numbers (i.e. 'A45' becomes 'A')
for(var i=0; i<row.length; i++){
var currHeader = row[i]
if(currHeader == header){
return range.getCell(1, i+1).getA1Notation().replace(/[0-9]/g, '');
}
}
}
使いやすく読みやすいかもしれません。