Tôi có thể sử dụng các tiêu đề cột trong a = QUERY không?


16

Đọc tài liệu cho =QUERYhàm 1 , 2 , 3 , một số trong đó dường như ngụ ý rằng tôi sẽ có thể sử dụng các tiêu đề cột trực tiếp trong truy vấn của mình. Ví dụ, =QUERYchức năng phải mất một tham số tùy chọn thứ ba , HEADERS, cho phép bạn chỉ định một số hàng tiêu đề.

Hầu hết các truy vấn của tôi sẽ đẹp hơn rất nhiều nếu tôi có thể sử dụng các tiêu đề cột, do đó không phải sử dụng các chỉ mục cột, nhưng tôi không thể làm cho nó hoạt động.

Thí dụ:

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

Tôi có thể truy vấn điều này bằng cách sử dụng các chỉ mục cột:

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

... nhưng không sử dụng các tiêu đề cột:

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

... điều này mang lại cho tôi Lỗi: Truy vấn không hợp lệ: Cột [Tên] không tồn tại trong bảng

Có phải tất cả đều có thể sử dụng các tiêu đề cột như thế này? Nếu không, mục đích của HÈADERStham số là gì?

Câu trả lời:


4

Tham số thứ ba mà bạn nói đến trong QUERYhàm, có nghĩa là để kiểm soát các tiêu đề. Nếu được đặt thành -1, thì Bảng tính Google sẽ mô tả lựa chọn của chính nó trong việc chọn các tiêu đề, dựa trên dữ liệu có sẵn: nhập mô tả hình ảnh ở đây

Tôi đã sử dụng bộ dữ liệu sau: nhập mô tả hình ảnh ở đây

Nếu được đặt thành 0, thì sẽ không có tiêu đề nào được sử dụng, để lại: nhập mô tả hình ảnh ở đây

Nếu được đặt thành 1, thì hàng đầu tiên sẽ được sử dụng, để lại: nhập mô tả hình ảnh ở đây

Nếu được đặt thành 2hoặc -1hoặc left blank, thì hai hàng đầu tiên sẽ được sử dụng, để lại: nhập mô tả hình ảnh ở đây

Sử dụng các tiêu đề, cách bạn đã làm trong ví dụ của mình, là không thể. Điều gần nhất sẽ là việc sử dụng QUERYhàm, được mô tả trong câu trả lời này . Có một tên cột gần như được sử dụng.


À, OK, vậy nếu HEADERS > 0sau đó, số lượng hàng tiêu đề đã cho sẽ được trả về bằng =QUERYđầu kết quả truy vấn, phải không? Điều đó có ý nghĩa - tôi nghĩ HEADERSchỉ các hàng được chỉ định bỏ qua trong truy vấn.
Vidar S. Ramdal

@Vidar OFFSETTùy chọn có thể được sử dụng để bỏ qua các hàng đầu tiên.
Jacob Jan Tuinstra

Theo kinh nghiệm của tôi, việc đặt tham số tiêu đề thành 0 không thực hiện những gì tài liệu Google mô tả hoặc những gì được mô tả ở đây. Về cơ bản, nó không làm gì cả (ví dụ như -1) theo như tôi có thể nói. Đã có ai nhận ra điều này chưa?
user24601

Tôi tin rằng ý định của người đăng ban đầu không phải là về việc lấy tiêu đề trong báo cáo mà là về việc sử dụng tên tiêu đề trong câu lệnh truy vấn thay vì phải sử dụng các chỉ mục cột (như trong A hoặc B hoặc C).
Farrel

7

Có phải tất cả đều có thể sử dụng các tiêu đề cột như thế này?

Vâng, nó là có thể. Trước tiên, bạn cần sử dụng MATCH để lấy số cột của cột có giá trị khớp với 'Tên'. Sau đó, bạn cần sử dụng ĐỊA CHỈ để có được tham chiếu ô. Cuối cùng, bạn cần sử dụng SUBSTITUTE để xóa số hàng khỏi tham chiếu ô.

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

3

Trong khi một bài viết cũ, tôi muốn thêm giải pháp của tôi vào hỗn hợp. Bạn có thể sử dụng tên cột mà tôi thấy hữu ích hơn. Bằng cách này, bạn không phải chỉnh sửa các cuộc gọi chức năng truy vấn khi bạn chèn hoặc xóa các cột khỏi dữ liệu nguồn.

Tôi đã thấy những người khác sử dụng kết hợp và thay thế, tôi đã triển khai một cái gì đó hơi khác một chút để chỉ đơn giản là gọi hàm truy vấn.

Đầu tiên - Tạo bảng tra cứu tất cả các tên cột của bạn như thế này. Bảng tra cứu của tôi bắt đầu trong Cột E của trang tính 'Cấu hình' chỉ vì tôi có các mục khác trên trang tính, nó có thể dễ dàng được đặt trong trang tính của chính nó.

  • Cột 1 (Tên cột)

    =TRANSPOSE( 'Source Data'!1:1 )
    
  • Cột 2 (Cột #)

    =arrayformula( row( E2:E ) - 1 )
    
  • Cột 3 (Cột thư)

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

    Tôi đang mở các sàng lọc để chuyển đổi số cột thành một chữ cái. Công thức này bị hạn chế ở chỗ nó chỉ xử lý 78 cột. Quá đủ cho tôi mặc dù.

Bây giờ cuộc gọi chức năng Truy vấn của bạn sẽ trông giống như thế này:

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

Giữ cho nó được định dạng độc đáo và nó không phải là xấu để quản lý. Điều duy nhất bạn sẽ phải chịu là nếu bạn thay đổi chỉ mục cột của phạm vi vlookup của bạn. Nhưng điều này không nên thay đổi thường xuyên, nếu có, coi đó là một phạm vi trợ giúp.


3

Câu hỏi cũ, nhưng tôi nghĩ giải pháp này có thể đáng giá.

Bạn có thể sử dụng chức năng tập lệnh tùy chỉnh để lấy chỉ mục cột (ví dụ A, B, C ...) bằng cách sử dụng tên tiêu đề, cho phép thực hiện một số thứ như:

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

Với colIndexchức năng:

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

Mà có thể dễ dàng hơn để sử dụng và đọc.


0

Đây là giải pháp của tôi:

nếu bạn có một cột được gọi là "thành phố", hãy tạo một ô mới ở đâu đó với chỉ mục của ô đó:

   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              

Sau đó, bạn có thể tạo một phạm vi được đặt tên cho ô Z: 2 được gọi là: "name", Z: 3 = "phone", Z: 4 = "city"

trong truy vấn của bạn, sau đó bạn có thể viết:

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

Bạn có thể kết hợp điều này với giải pháp khớp địa chỉ để không phải theo dõi các cột được sắp xếp lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.