Posso usar cabeçalhos de coluna em a = QUERY?

16

Lendo a documentação da =QUERYfunção 1 , 2 , 3 , algumas delas parecem sugerir que eu deveria poder usar os cabeçalhos das colunas diretamente na minha consulta. Por exemplo, a =QUERYfunção leva um terceiro parâmetro opcional , HEADERSque permite que você especifique um número de linhas de cabeçalho.

A maioria das minhas consultas seria muito mais bonita se eu pudesse usar cabeçalhos de coluna, não precisando usar índices de coluna, mas não consigo fazê-lo funcionar.

Exemplo:

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

Eu sou capaz de consultar isso usando índices de coluna:

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

... mas não usando cabeçalhos de coluna:

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

... isso me dá Erro: Consulta inválida: a coluna [Nome] não existe na tabela

É possível usar cabeçalhos de coluna como este? Caso contrário, qual é o objetivo do HÈADERSparâmetro?

Vidar S. Ramdal
fonte

Respostas:

4

O terceiro parâmetro de que você fala na QUERYfunção é destinado a controlar os cabeçalhos. Se estiver definido -1, a planilha do Google mostrará sua própria escolha na escolha de cabeçalhos, com base nos dados disponíveis: insira a descrição da imagem aqui

Eu usei o seguinte conjunto de dados: insira a descrição da imagem aqui

Se configurado para ser 0, nenhum cabeçalho será usado, deixando: insira a descrição da imagem aqui

Se configurado para ser 1, a primeira linha será usada, deixando: insira a descrição da imagem aqui

Se definido como 2ou -1ou left blank, as duas primeiras linhas serão usadas, deixando: insira a descrição da imagem aqui

Usar os cabeçalhos, como você fez no seu exemplo, não é possível. O mais próximo seria o uso da QUERYfunção, descrita nesta resposta. Lá, um nome de quase coluna é usado.

Jacob Jan Tuinstra
fonte
Ah, ok, então se HEADERS > 0o número especificado de linhas de cabeçalho será retornado =QUERYno topo dos resultados da consulta, certo? Isso faz sentido - pensei que HEADERSapenas as linhas especificadas fossem ignoradas na consulta.
Vidar S. Ramdal 26/02
@Vidar A OFFSETopção pode ser usada para ignorar as primeiras linhas.
Jacob Jan Tuinstra
Na minha experiência, definir o parâmetro headers como 0 não faz o que o Google Docs descreve ou o que é descrito aqui. Basicamente, não faz nada (isto é, igual a -1), tanto quanto eu posso dizer. Alguém mais notou isso?
User24601
Acredito que a intenção do pôster original não era obter cabeçalhos no relatório, mas usar nomes de cabeçalho na instrução de consulta em vez de precisar usar índices de coluna (como em A ou B ou C).
Farrel
7

É possível usar cabeçalhos de coluna como este?

Sim, é possível. Primeiro, você precisa usar MATCH para obter o número da coluna cujo valor corresponde a 'Nome'. Então você precisa usar ADDRESS para obter a referência da célula. Por fim, você precisa usar SUBSTITUTE para remover o número da linha da referência da célula.

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

Enquanto era um post antigo, eu queria adicionar minha solução à mistura. Você pode usar nomes de colunas que considero mais úteis. Dessa forma, você não precisa editar suas chamadas de função de consulta ao inserir ou remover colunas dos dados de origem.

Já vi outras pessoas usarem a correspondência e o substituto, implementei algo um pouco diferente para simplesmente chamar a função de consulta.

Primeiro - Crie uma tabela de pesquisa com todos os nomes de colunas como este. Minha tabela de pesquisa começa na coluna E de uma planilha 'Config' apenas porque tenho outros itens na planilha, ela pode ser facilmente colocada em sua própria planilha.

  • Coluna 1 (nome da coluna)

    =TRANSPOSE( 'Source Data'!1:1 )
    
  • Coluna 2 (nº da coluna)

    =arrayformula( row( E2:E ) - 1 )
    
  • Coluna 3 (letra da coluna)

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

    Estou aberto a aprimoramentos para converter um número de coluna em uma letra. Essa fórmula é limitada, pois lida apenas com 78 colunas. Mais do que suficiente para mim.

Agora, sua chamada à função Query seria mais ou menos assim:

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

Mantenha-o bem formatado e não é nada ruim de gerenciar. A única coisa que você sofrerá é se você alterar o índice da coluna do seu intervalo de visualizações. Mas isso não deve mudar com frequência, se é que o considera, considerando-o um alcance auxiliar.

Don
fonte
3

Pergunta antiga, mas acho que essa solução pode valer a pena.

Você pode usar uma função de script personalizada que recupera o índice da coluna (por exemplo, A, B, C ...) usando um nome de cabeçalho, permitindo fazer algo como:

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

Com colIndexfunção:

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

O que pode ser mais fácil de usar e ler.

Pierre B.
fonte
0

Aqui está a minha solução:

se você tiver uma coluna chamada "cidade", crie uma nova célula em algum lugar com o índice dessa célula:

   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              

Você pode criar um intervalo nomeado para a célula Z: 2 chamada: "nome", Z: 3 = "telefone", Z: 4 = "cidade"

na sua consulta, você pode escrever:

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

Você pode combinar isso com a solução de correspondência de endereço, para não precisar rastrear colunas reorganizadas.

Timar Ivo Batis
fonte