web-dev-qa-db-ja.com

= QUERYで列ヘッダーを使用できますか?

=QUERY関数のドキュメントを読む12、その一部は、クエリで列ヘッダーを直接使用できる必要があることを暗示しているようです。たとえば、=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パラメーターの目的は何ですか?

14
Vidar S. Ramdal

QUERY関数で言う3番目のパラメーターは、ヘッダーを制御するためのものです。 -1に設定すると、Googleスプレッドシートは、利用可能なデータに基づいて、ヘッダーを選択する際の独自の選択肢を示します。 enter image description here

次のデータセットを使用しました。 enter image description here

0に設定すると、ヘッダーは使用されず、次のようになります。 enter image description here

1に設定すると、最初の行が使用され、次のようになります。 enter image description here

2または-1またはleft blankに設定すると、最初の2行が使用され、次のようになります。 enter image description here

ヘッダーを使用して、この例で行った方法は不可能です。最も近いのは、this回答で説明されているQUERYfunctionの使用方法です。準列名が使用されます。

3

このような列ヘッダーを使用することはまったく可能ですか?

はい、可能です。まず、MATCHを使用して、値が「名前」に一致する列の列番号を取得する必要があります。次に、ADDRESSを使用してセル参照を取得する必要があります。最後に、SUBSTITUTEを使用して、セル参照から行番号を削除する必要があります。

=QUERY(Sheet1!A1:C,"SELECT A, B, C where "&SUBSTITUTE(ADDRESS(1,MATCH("Name",Sheet1!A1:C1,0),4),1,"")&" = 'Vidar'")
7
Dave Meindl

古い投稿でしたが、自分のソリューションをミックスに追加したかったのです。私が見つけた列名はもっと便利だと思います。この方法では、ソースデータの列を挿入または削除するときにクエリ関数呼び出しを編集する必要はありません。

他の人がマッチと置換を使用するのを見ましたが、単にクエリ関数呼び出しとは少し異なるものを実装しました。

最初に-このようにすべての列名のルックアップテーブルを作成します。ルックアップテーブルは '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範囲の列インデックスを変更する場合だけです。しかし、これがヘルパー範囲であると考えれば、これは頻繁に変わるべきではありません。

3
Don

古い質問ですが、この解決策は価値があると思います。

ヘッダー名を使用して列インデックス(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, '');
    }  
  }
}

使いやすく読みやすいかもしれません。

3
Pierre B.