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


16

ドキュメントを読む=QUERY機能123、それのいくつかは、私は私のクエリで直接、列のヘッダーを使用することができるはずということを暗示しているようです。例えば、=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)

... エラー:無効なクエリ:列[名前]がテーブルに存在しません

このような列ヘッダーを使用することはまったく可能ですか?そうでない場合、HÈADERSパラメーターの目的は何ですか?

回答:


4

QUERY関数内であなたが話す3番目のパラメーターは、ヘッダーを制御するためのものです。に設定した場合-1、Googleスプレッドシートは、使用可能なデータに基づいて、ヘッダーを選択する際の独自の選択を示します。 ここに画像の説明を入力してください

次のデータセットを使用しました。 ここに画像の説明を入力してください

に設定すると0、ヘッダーは使用されず、次のようになります。 ここに画像の説明を入力してください

に設定すると1、最初の行が使用され、次のようになります。 ここに画像の説明を入力してください

セットがする場合2-1、またはleft blank、その後、最初の2行は残して、使用されます。 ここに画像の説明を入力してください

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


ああ、そうだとすればHEADERS > 0、与えられた数のヘッダー行が=QUERYクエリ結果の上に返されますよね?それは理にかなっています- HEADERSクエリでは指定された行のみを無視すると考えました。
ヴィダールS.ラムダル14

@VidarこのOFFSETオプションを使用して、最初の行を無視できます。
ジェイコブヤントゥインストラ14

私の経験では、headersパラメーターを0に設定しても、Googleのドキュメントで説明されていることやここで説明されていることは実行されません。私が知る限り、基本的には何もしませ(つまり、-1と同じです)。他の誰かがこれに気づいていますか?
user24601

元のポスターの意図は、レポートのヘッダーを取得することではなく、列インデックス(AまたはBまたはCのように)を使用するのではなく、クエリステートメントでヘッダー名を使用することだと思います。
ファレル

7

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

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

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

3

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

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

最初に-このようなすべての列名のルックアップテーブルを作成します。ルックアップテーブルは、「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

古い質問ですが、このソリューションには価値があると思います。

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

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


0

私の解決策は次のとおりです。

「city」という列がある場合、そのセルのインデックスを使用して新しいセルを作成します。

   A          B               C        ...         Y               Z        
 --------- ------------ ------------ ------ --------------- --------------- 
  Name        Phone        City        ...    Column Name     Column Index  
  Vidar      12345678     Oslo         ...    Name           A              
  Rupert     32165487     Berlin       ...    Phone          B              
  Sahid      32165487     Colombo      ...    City           C              

次に、「name」、Z:3 =「phone」、Z:4 =「city」という名前のセルZ:2の名前付き範囲を作成できます。

クエリで次のように記述できます。

=QUERY( Sheet1!A1:C,"SELECT A, B, C where "&name&" = 'Vidar'"

これをアドレス一致ソリューションと組み合わせて、再配置された列を追跡する必要がないようにすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.