Могу ли я использовать заголовки столбцов в a = QUERY?

16

Читая документацию по =QUERYфункции 1 , 2 , 3 , некоторые из них, по-видимому, подразумевают, что я должен иметь возможность использовать заголовки столбцов непосредственно в своем запросе. Например, =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функции, предназначен для управления заголовками. Если установлено -1, то таблица Google будет отображать свой собственный выбор заголовков на основе доступных данных: введите описание изображения здесь

Я использовал следующий набор данных: введите описание изображения здесь

Если установлено 0, то заголовок не будет использоваться, оставляя: введите описание изображения здесь

Если установлено, будет 1использоваться первая строка, оставляя: введите описание изображения здесь

Если установлено значение 2или -1или left blank, то будут использоваться первые две строки, оставляя: введите описание изображения здесь

Использование заголовков, как вы сделали в своем примере, невозможно. Наиболее близким было бы использование QUERYфункции, описанной в этом ответе. Там используется квазиколонное имя.

Джейкоб Ян Туинстра
источник
Ах, хорошо, так что, если HEADERS > 0тогда указанное число строк заголовка будет возвращено =QUERYповерх результатов запроса, верно? Это имеет смысл - я думал, что HEADERSтолько указанные строки игнорируются в запросе.
Видар С. Рамдал
@Vidar Опцию OFFSETможно использовать для игнорирования первых строк.
Джейкоб Ян Туинстра
По моему опыту, установка параметра заголовков в 0 не делает то, что описывают документы Google или что изображено здесь. Насколько я могу судить, он практически ничего не делает (то есть, как -1). Кто-нибудь еще заметил это?
user24601
1
Я полагаю, что целью первоначального постера было не получение заголовков в отчете, а использование имен заголовков в операторе запроса, а не использование индексов столбцов (как в A, B или C).
Фаррел
7

Можно ли вообще использовать такие заголовки столбцов?

Да, это возможно. Во-первых, вам нужно использовать MATCH, чтобы получить номер столбца столбца, значение которого соответствует «Имя». Затем вам нужно использовать АДРЕС, чтобы получить ссылку на ячейку. Наконец, вам нужно использовать SUBSTITUTE, чтобы удалить номер строки из ссылки на ячейку.

=QUERY(Sheet1!A1:C,"SELECT A, B, C where "&SUBSTITUTE(ADDRESS(1,MATCH("Name",Sheet1!A1:C1,0),4),1,"")&" = 'Vidar'")
Дейв Майндл
источник
3

В то время как старый пост, я хотел добавить свое решение в микс. Вы можете использовать имена столбцов, которые я считаю более полезными. Таким образом, вам не нужно редактировать вызовы функций запросов при вставке или удалении столбцов из исходных данных.

Я видел, как другие использовали сопоставление и замену, я реализовал что-то немного отличное от простого вызова функции запроса.

Первый - создайте таблицу поиска для всех имен ваших столбцов, как это. Моя таблица поиска начинается в столбце 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 будет выглядеть примерно так:

=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              

Затем вы можете создать именованный диапазон для ячейки Z: 2 с именем: "name", Z: 3 = "phone", Z: 4 = "city"

в своем запросе вы можете написать:

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

Вы можете объединить это с решением для сопоставления адресов, чтобы не отслеживать отслеживаемые столбцы.

Тимар Иво Батис
источник