¿Puedo usar encabezados de columna en a = QUERY?

16

Al leer la documentación para la =QUERYfunción 1 , 2 , 3 , parte de ella parece implicar que debería poder usar encabezados de columna directamente en mi consulta. Por ejemplo, la =QUERYfunción toma un tercer parámetro opcional , HEADERSque le permite especificar un número de filas de encabezado.

La mayoría de mis consultas serían mucho más bonitas si pudiera usar encabezados de columna, por lo que no tendría que usar índices de columna, pero no puedo hacer que funcione.

Ejemplo:

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

Puedo consultar esto usando índices de columna:

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

... pero sin usar encabezados de columna:

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

... esto me da un error: consulta no válida: la columna [nombre] no existe en la tabla

¿Es posible usar encabezados de columna como este? Si no, ¿cuál es el propósito del HÈADERSparámetro?

Vidar S. Ramdal
fuente

Respuestas:

4

El tercer parámetro del que habla en la QUERYfunción está destinado a controlar los encabezados. Si se establece como -1, la hoja de cálculo de Google representará su propia elección al elegir encabezados, en función de los datos disponibles: ingrese la descripción de la imagen aquí

He usado el siguiente conjunto de datos: ingrese la descripción de la imagen aquí

Si está configurado para ser 0, entonces no se usará ningún encabezado, dejando: ingrese la descripción de la imagen aquí

Si se establece como 1, entonces se usará la primera fila, dejando: ingrese la descripción de la imagen aquí

Si se establece en 2or -1o left blank, se utilizarán las dos primeras filas, dejando: ingrese la descripción de la imagen aquí

Usar los encabezados, como lo hizo en su ejemplo, no es posible. Lo más parecido sería el uso de la QUERYfunción, descrita en esta respuesta. Allí se usa un nombre de cuasi columna.

Jacob Jan Tuinstra
fuente
Ah, está bien, entonces si HEADERS > 0el número dado de filas de encabezado se devolverá =QUERYencima de los resultados de la consulta, ¿verdad? Eso tiene sentido: pensé que HEADERSsolo las filas especificadas deberían ignorarse en la consulta.
Vidar S. Ramdal
@Vidar La OFFSETopción se puede usar para ignorar las primeras filas.
Jacob Jan Tuinstra
En mi experiencia, establecer el parámetro de encabezados en 0 no hace lo que describen los documentos de Google o lo que se muestra aquí. Básicamente no hace nada (es decir, igual que -1) por lo que puedo decir. ¿Alguien más ha notado esto?
user24601
Creo que la intención del póster original no era obtener encabezados en el informe, sino usar los nombres de encabezado en la declaración de la consulta en lugar de tener que usar índices de columna (como en A, B o C).
Farrel
7

¿Es posible usar encabezados de columna como este?

Sí, es posible. Primero, debe usar MATCH para obtener el número de columna de la columna cuyo valor coincide con 'Nombre'. Luego debe usar ADDRESS para obtener la referencia de celda. Finalmente, debe usar SUBSTITUTE para eliminar el número de fila de la referencia de celda.

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

Si bien una publicación anterior, quería agregar mi solución a la mezcla. Puede usar nombres de columna que considero más útiles. De esta manera, no tiene que editar sus llamadas a la función de consulta cuando inserta o elimina columnas de los datos de origen.

He visto a otros usar el partido y el sustituto, implementé algo un poco diferente a simplemente la llamada a la función de consulta.

Primero: cree una tabla de búsqueda con todos los nombres de columna como este. Mi tabla de búsqueda comienza en la columna E de una hoja de 'Configuración' solo porque tengo otros elementos en la hoja, podría colocarse fácilmente en su propia hoja.

  • Columna 1 (Nombre de columna)

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

    =arrayformula( row( E2:E ) - 1 )
    
  • Columna 3 (letra de columna)

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

    Estoy abierto a mejoras para convertir un número de columna en una letra. Esta fórmula es limitada porque solo maneja 78 columnas. Sin embargo, más que suficiente para mí.

Ahora su llamada a la función de consulta se vería así:

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

Manténgalo bien formateado y no es malo administrarlo en absoluto. Lo único que sufrirá es si cambia el índice de columna de su rango de vlookup. Pero esto no debería cambiar a menudo, si es que lo considera, considerando que es un rango auxiliar.

Don
fuente
3

Antigua pregunta, pero creo que esta solución puede valer la pena.

Puede usar una función de secuencia de comandos personalizada que recupera el índice de la columna (es decir, A, B, C ...) usando un nombre de encabezado, lo que permite hacer algo como:

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

Con colIndexfunción:

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

Que puede ser más fácil de usar y leer.

Pierre B.
fuente
0

Aquí está mi solución:

Si tiene una columna llamada "ciudad", cree una nueva celda en algún lugar con el índice de esa celda:

   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              

Luego puede crear un rango con nombre para la celda Z: 2 llamada: "nombre", Z: 3 = "teléfono", Z: 4 = "ciudad"

en su consulta puede escribir:

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

Puede combinar esto con la solución de coincidencia de direcciones, para no tener que realizar un seguimiento de las columnas reorganizadas.

Timar Ivo Batis
fuente