Puis-je utiliser des en-têtes de colonne dans a = QUERY?

16

En lisant la documentation de la =QUERYfonction 1 , 2 , 3 , certains semblent impliquer que je devrais pouvoir utiliser les en-têtes de colonne directement dans ma requête. Par exemple, la =QUERYfonction prend un troisième paramètre optionnel , HEADERSqui vous permet de spécifier un certain nombre de lignes d' en- tête.

La plupart de mes requêtes seraient beaucoup plus jolies si je pouvais utiliser des en-têtes de colonne, donc je n'aurais pas à utiliser d'index de colonne, mais je ne suis pas en mesure de le faire fonctionner.

Exemple:

A      B         C
---------------------
Name   Phone     City
Vidar  12345678  Oslo
Rupert 32165487  Berlin

Je peux interroger cela en utilisant des index de colonnes:

=QUERY(Sheet1!A1:C; "select A, B, C where A = 'Vidar'"; 1)

... mais sans utiliser les en-têtes de colonne:

=QUERY(Sheet1!A1:C; "select A, B, C where Name = 'Vidar'"; 1)

... cela me donne Erreur: requête non valide: la colonne [Nom] n'existe pas dans la table

Est-il possible d'utiliser des en-têtes de colonne comme celui-ci? Sinon, quel est l'objectif du HÈADERSparamètre?

Vidar S. Ramdal
la source

Réponses:

4

Le troisième paramètre dont vous parlez dans la QUERYfonction est destiné à contrôler les en-têtes. Si elle est définie sur -1, la feuille de calcul Google décrit son propre choix dans le choix des en-têtes, en fonction des données disponibles: entrez la description de l'image ici

J'ai utilisé l'ensemble de données suivant: entrez la description de l'image ici

S'il est défini sur 0, aucun en-tête ne sera utilisé, laissant: entrez la description de l'image ici

S'il est défini sur 1, la première ligne sera utilisée, laissant: entrez la description de l'image ici

Si défini sur 2ou -1ou left blank, les deux premières lignes seront utilisées, laissant: entrez la description de l'image ici

L'utilisation des en-têtes, comme vous l'avez fait dans votre exemple, n'est pas possible. La chose la plus proche serait l'utilisation de la QUERYfonction, décrite dans cette réponse. Là, un nom de colonne quasi est utilisé.

Jacob Jan Tuinstra
la source
Ah, OK, donc si HEADERS > 0alors le nombre donné de lignes d'en-tête sera retourné par =QUERYen haut des résultats de la requête, non? Cela a du sens - je pensais HEADERSque seules les lignes spécifiées à ignorer dans la requête.
Vidar S. Ramdal,
@Vidar L' OFFSEToption peut être utilisée pour ignorer les premières lignes.
Jacob Jan Tuinstra, le
D'après mon expérience, la définition du paramètre d'en-têtes à 0 ne fait pas ce que décrivent les documents Google ni ce qui est décrit ici. Pour autant que je sache, il ne fait rien (c'est-à-dire la même chose que -1). Quelqu'un d'autre a-t-il remarqué cela?
user24601
1
Je crois que l'intention de l'affiche originale n'était pas d'obtenir des en-têtes dans le rapport, mais plutôt d'utiliser des noms d'en-tête dans l'instruction de requête plutôt que d'avoir à utiliser des index de colonne (comme dans A ou B ou C).
Farrel
7

Est-il possible d'utiliser des en-têtes de colonne comme celui-ci?

Oui c'est possible. Tout d'abord, vous devez utiliser MATCH pour obtenir le numéro de colonne de la colonne dont la valeur correspond à «Nom». Ensuite, vous devez utiliser ADDRESS pour obtenir la référence de cellule. Enfin, vous devez utiliser SUBSTITUTE pour supprimer le numéro de ligne de la référence de cellule.

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

Alors qu'un ancien poste, je voulais ajouter ma solution au mix. Vous pouvez utiliser des noms de colonnes que je trouve plus utiles. De cette façon, vous n'avez pas à modifier vos appels de fonction de requête lorsque vous insérez ou supprimez des colonnes des données source.

J'ai vu d'autres utiliser la correspondance et le substitut, j'ai implémenté quelque chose d'un peu différent de simplement l'appel de la fonction de requête.

Tout d'abord - Créez une table de recherche de tous vos noms de colonne comme ceci. Ma table de recherche commence dans la colonne E d'une feuille «Config» uniquement parce que j'ai d'autres éléments sur la feuille, elle pourrait facilement être placée dans sa propre feuille.

  • Colonne 1 (nom de la colonne)

    =TRANSPOSE( 'Source Data'!1:1 )
    
  • Colonne 2 (colonne #)

    =arrayformula( row( E2:E ) - 1 )
    
  • Colonne 3 (Lettre de colonne)

    =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 ) )
    

    Je suis ouvert aux raffinements pour convertir un numéro de colonne en lettre. Cette formule est limitée en ce qu'elle ne gère que 78 colonnes. Plus que suffisant pour moi cependant.

Maintenant, votre appel de fonction Query ressemblerait à ceci:

=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 "
)

Gardez-le bien formaté et ce n'est pas mal du tout à gérer. La seule chose que vous subirez est si vous modifiez l'index de colonne de votre plage de recherche. Mais cela ne devrait pas changer souvent, voire pas du tout, étant donné qu'il s'agit d'une plage d'assistance.

Don
la source
3

Vieille question, mais je pense que cette solution en vaut la peine.

Vous pouvez utiliser une fonction de script personnalisé qui récupère l'index de colonne (c'est-à-dire A, B, C ...) en utilisant un nom d'en-tête, permettant de faire quelque chose comme:

=query('MySheet'!A2:Z; 
   "select "&colIndex("'MySheet'!A1:Z1"; "Car name")&"  
    where "&colIndex("'MySheet'!A1:Z1"; "Car color")&"='Blue'"))

Avec colIndexfonction:

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, '');
    }  
  }
}

Ce qui peut être plus facile à utiliser et à lire.

Pierre B.
la source
0

Voici ma solution:

si vous avez une colonne appelée "ville", créez une nouvelle cellule quelque part avec l'index de cette cellule:

   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              

Vous pouvez ensuite créer une plage nommée pour la cellule Z: 2 appelée: "nom", Z: 3 = "téléphone", Z: 4 = "ville"

dans votre requête, vous pouvez alors écrire:

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

Vous pouvez combiner cela avec la solution de correspondance d'adresses, pour ne pas avoir à suivre les colonnes réorganisées.

Timar Ivo Batis
la source