Không có tập lệnh ứng dụng
Người ta không thể tạo một chức năng mới mà không có Apps Script. Cách duy nhất để hợp lý hóa quy trình là đặt nhiều ô ở đâu đó và tham chiếu các ô đó.
Ví dụ: dưới mỗi tiêu đề, chẳng hạn như 'Trọng lượng', hãy nhập lệnh
=regexextract(address(1, column()), "[A-Z]+")
Điều này sẽ đặt (các) chữ cái cột dưới tiêu đề. Bao gồm các hàng với các chữ cái trong phạm vi tiêu đề được đặt tên. Trong chuỗi truy vấn, sử dụng
hlookup("Weight", Headers, 2, 0)
cái nào dễ nhìn hơn
SUBSTITUTE(ADDRESS(1,MATCH("Weight", Headers, 0),4), "1", "")
Với tập lệnh ứng dụng
Truyền một phạm vi (được đặt tên hoặc cách khác) vào một hàm tùy chỉnh sẽ chuyển vào các giá trị , không có thông tin về vị trí của chúng trong trang tính. Nhưng tôi đã tìm thấy một giải pháp: suy ra vị trí của các tiêu đề từ đối số đầu tiên query
. Không cần bao gồm "Tiêu đề", bản thân nó đã lặp đi lặp lại.
Phiên bản 1: các tiêu đề được bao gồm trong phạm vi truy vấn
Tôi thích bao gồm các hàng tiêu đề trong phạm vi được truyền cho truy vấn và chỉ định số lượng hàng tiêu đề làm đối số thứ 3 của query
. Điều này tránh việc giải thích sai dữ liệu là tiêu đề hoặc ngược lại. Ví dụ:
=QUERY(A1:F13, "select "&GetHeader("Type")&" where ("&GetHeader("Version")&" = 'Version 1') and ("&GetHeader("Type")&" <> 'Type')", 2)
Đây là chức năng tùy chỉnh để sử dụng với truy vấn trên:
function getHeader(name) {
var sheet = SpreadsheetApp.getActiveSheet();
var formula = SpreadsheetApp.getActiveRange().getFormula();
var args = formula.match(/\w+:\w+(?=[ ,])/);
var range = sheet.getRange(args[0]);
var firstRow = range.offset(0, 0, 1, range.getWidth());
var headers = firstRow.getValues();
for (var i = 0; i < headers[0].length; i++) {
if (headers[0][i] == name) {
var notation = range.getCell(1, i+1).getA1Notation();
var column = notation.replace(/\d/, '');
return column;
}
}
return 'Not found';
}
Hàm lấy công thức từ ô mà nó được gọi. Nó trích xuất đối số phạm vi đầu tiên của công thức với một biểu thức chính quy. Sau đó, nó nhìn qua hàng đầu tiên của phạm vi này , giả sử đó là hàng tiêu đề, để tìm kiếm chuỗi đã cho. Nó nhận được ký hiệu A1 của ô với chuỗi, loại bỏ phần hàng của nó và trả về kết quả.
Phiên bản 2: các tiêu đề được lấy từ Hàng 1
Một phiên bản thay thế, trong đó các tiêu đề được lấy từ hàng đầu tiên của trang tính, bất kể các hàng trong đối số truy vấn. Chỉ cần thay thế
var firstRow = range.offset(0, 0, 1, range.getWidth());
với
var firstRow = sheet.getRange(1, range.getColumn(), 1, range.getWidth());
Với phiên bản này, bạn có thể sử dụng
=QUERY(A3:F13, "select "&GetHeader("Type")&" where ("&GetHeader("Version")&" = 'Version 1') and ("&GetHeader("Type")&" <> 'Type')")