ฉันสามารถใช้ส่วนหัวคอลัมน์ใน 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ฟังก์ชั่นหมายถึงการควบคุมส่วนหัว หากตั้งค่าเป็น-1Google สเปรดชีตจะแสดงตัวเลือกของตัวเองในการเลือกส่วนหัวตามข้อมูลที่มี: ป้อนคำอธิบายรูปภาพที่นี่

ฉันใช้ชุดข้อมูลต่อไปนี้: ป้อนคำอธิบายรูปภาพที่นี่

หากตั้งค่าเป็นจะ0ไม่มีการใช้ส่วนหัวและออกจาก: ป้อนคำอธิบายรูปภาพที่นี่

หากตั้งค่าเป็นจะ1ใช้แถวแรกออกจาก: ป้อนคำอธิบายรูปภาพที่นี่

หากตั้งค่าเป็น2หรือ-1หรือleft blankจากนั้นจะใช้สองแถวแรกออกจาก: ป้อนคำอธิบายรูปภาพที่นี่

การใช้ส่วนหัวเป็นวิธีที่คุณทำในตัวอย่างของคุณเป็นไปไม่ได้ สิ่งที่ใกล้เคียงการใช้งานของที่จะQUERYฟังก์ชั่นที่อธิบายไว้ในนี้คำตอบ มีชื่อคอลัมน์เสมือนใช้อยู่


อาตกลงดังนั้นถ้าHEADERS > 0จำนวนแถวส่วนหัวที่กำหนดจะถูกส่งกลับโดย=QUERYด้านบนของผลการค้นหาใช่ไหม นั่นสมเหตุสมผลแล้ว - ฉันคิดว่าHEADERSมีเพียงแถวที่ระบุที่จะไม่สนใจในคิวรี
Vidar S. Ramdal

@Vidar OFFSETตัวเลือกสามารถใช้เพื่อละเว้นแถวแรก
Jacob Jan Tuinstra

จากประสบการณ์ของฉันการตั้งค่าพารามิเตอร์ส่วนหัวเป็น 0 ไม่ได้ทำตามที่เอกสารของ Google อธิบายหรือสิ่งที่อธิบายไว้ที่นี่ โดยพื้นฐานแล้วมันไม่ได้ทำอะไร (เช่นเดียวกับ -1) เท่าที่ฉันสามารถบอกได้ มีใครสังเกตเห็นสิ่งนี้อีกบ้าง?
user24601

1
ฉันเชื่อว่าความตั้งใจของผู้โพสต์ดั้งเดิมไม่ได้เกี่ยวกับการรับส่วนหัวในรายงาน แต่เป็นการใช้ชื่อส่วนหัวในคำสั่งการสืบค้นแทนที่จะต้องใช้ดัชนีคอลัมน์ (เช่นใน A หรือ B หรือ C)
Farrel

7

เป็นไปได้ไหมที่จะใช้ส่วนหัวคอลัมน์เช่นนี้

ใช่มันเป็นไปได้ ก่อนอื่นคุณต้องใช้ MATCH เพื่อรับหมายเลขคอลัมน์ของคอลัมน์ที่มีค่าตรงกับ 'ชื่อ' จากนั้นคุณต้องใช้ ADDRESS เพื่อรับการอ้างอิงเซลล์ สุดท้ายคุณต้องใช้ 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( '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'"

คุณสามารถรวมสิ่งนี้กับโซลูชันการจับคู่ที่อยู่เพื่อไม่ต้องติดตามคอลัมน์ที่จัดเรียงใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.