Чи можу я використовувати заголовки стовпців у 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), наскільки я можу сказати. Хтось ще помітив це?
користувач24601

1
Я вважаю, що намір оригінального плаката полягав не в тому, щоб отримувати заголовки у звіті, а скоріше про те, щоб використовувати імена заголовків у операторі запиту, а не використовувати індекси стовпців (як у A або B або C).
Farrel

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

Ось моє рішення:

якщо у вас стовпець під назвою "місто", створіть нову клітинку десь із індексом цієї комірки:

   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 під назвою: "ім'я", Z: 3 = "телефон", Z: 4 = "місто"

у вашому запиті ви можете написати:

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

Ви можете комбінувати це з рішенням відповідності адреси, щоб не потрібно було стежити за переставленими стовпцями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.