Bỏ qua để đến nội dung chính
Điền NguyễnAZ

google-sheets

Hàm UNIQUE và SORT trong Google Sheets: lọc trùng, sắp xếp tự động

27/10/2026· Điền Nguyễn AZ
Hàm UNIQUE và SORT trong Google Sheets: lọc trùng, sắp xếp tự động

Muốn có danh sách không trùng lặp và tự sắp xếp mỗi khi nhập thêm dữ liệu, bạn chỉ cần một công thức: =SORT(UNIQUE(B2:B)). UNIQUE lấy các giá trị khác nhau, SORT xếp chúng theo thứ tự, và kết quả tự cập nhật khi bảng gốc thay đổi, không cần bấm lọc hay xóa trùng lại.

Bài này hướng dẫn từng hàm trên bảng đơn hàng cụ thể, rồi đi tiếp các trường hợp hay gặp trong thực tế: bỏ ô trống khỏi kết quả, xử lý tên gõ thừa khoảng trắng, sắp xếp danh sách học sinh theo tên chứ không theo họ, và lấy top N bằng SORTN.

Dữ liệu mẫu dùng trong bài

Sheet DonHang, dữ liệu từ dòng 2, mỗi ngày nhân viên nhập thêm dòng mới ở cuối:

A B C D E F
1 Ngày Khách hàng Sản phẩm Số lượng Thành tiền Nhân viên
2 01/10/2026 Nguyễn Văn An Bút bi 20 100.000 Hoa
3 01/10/2026 Trần Thị Bình Vở 200 trang 10 150.000 Minh
4 02/10/2026 Nguyễn Văn An Thước kẻ 15 75.000 Hoa
5 03/10/2026 Lê Văn Cường Bút bi 50 250.000 Minh

Các công thức bên dưới đặt ở một vùng trống, ví dụ cột H trở đi, hoặc ở một sheet báo cáo riêng.

Lưu ý dấu phân cách: bài viết dùng dấu phẩy , giữa các đối số. Nếu Google Sheets báo lỗi phân tích công thức (tùy cài đặt vùng của bảng tính), hãy thay bằng dấu chấm phẩy ;.

Hàm UNIQUE: lấy danh sách không trùng

Cú pháp

=UNIQUE(range, [by_column], [exactly_once])
  • range: vùng cần lọc trùng.
  • by_column (tùy chọn): FALSE (mặc định) so sánh theo dòng; TRUE so sánh theo cột, dùng khi dữ liệu nằm ngang.
  • exactly_once (tùy chọn): FALSE (mặc định) lấy mỗi giá trị một lần; TRUE chỉ lấy những giá trị xuất hiện đúng một lần.

Ví dụ 1: danh sách khách hàng không trùng

Gõ vào ô H2:

=UNIQUE(B2:B)

Kết quả "tràn" xuống các ô bên dưới: Nguyễn Văn An, Trần Thị Bình, Lê Văn Cường. Dùng vùng mở B2:B (không ghi số dòng cuối) để khách mới nhập ở dòng 500 vẫn được tính.

Ví dụ 2: tổ hợp không trùng trên nhiều cột

=UNIQUE(B2:C)

Trả về các cặp Khách hàng – Sản phẩm khác nhau. Hai dòng chỉ bị coi là trùng khi giống nhau ở tất cả các cột trong vùng. Cách này hữu ích để biết mỗi khách đã từng mua những mặt hàng nào.

Ví dụ 3: khách chỉ mua đúng một lần

=UNIQUE(B2:B, FALSE, TRUE)

Đối số thứ ba TRUE khiến Nguyễn Văn An (mua 2 lần) bị loại, chỉ còn khách mua đúng một lần. Đây là danh sách nên gọi chăm sóc lại để khách quay lại mua tiếp. Tính năng này hay bị bỏ qua vì nhiều người chỉ biết UNIQUE dạng một đối số.

Hàm SORT: sắp xếp tự động

Cú pháp

=SORT(range, sort_column, is_ascending, [sort_column2, is_ascending2, ...])
  • range: vùng cần sắp xếp.
  • sort_column: số thứ tự cột trong vùng (cột đầu tiên của vùng là 1), hoặc một vùng một cột riêng có cùng số dòng.
  • is_ascending: TRUE tăng dần (A→Z, nhỏ→lớn), FALSE giảm dần.
  • Có thể thêm nhiều cặp cột – chiều sắp xếp để phân định khi trùng giá trị.

Ví dụ 4: đơn hàng giá trị lớn nhất lên đầu

=SORT(A2:F, 5, FALSE)

Cột Thành tiền là cột thứ 5 của vùng A2:F (A=1, B=2, C=3, D=4, E=5), FALSE là giảm dần.

Ví dụ 5: sắp theo nhân viên, trong mỗi nhân viên sắp theo thành tiền

=SORT(A2:F, 6, TRUE, 5, FALSE)

Đơn của Hoa đứng trước Minh (cột 6 tăng dần); trong đơn của từng người, đơn lớn đứng trước (cột 5 giảm dần). Dùng để mỗi nhân viên nhìn ngay danh sách đơn của mình.

Kết hợp SORT + UNIQUE và bỏ ô trống

Công thức phổ biến nhất:

=SORT(UNIQUE(B2:B))

Nhưng vì B2:B gồm cả hàng nghìn ô trống phía dưới, UNIQUE sẽ coi "ô trống" là một giá trị và kết quả có thêm một dòng trống. Cách làm gọn hơn là lọc bỏ ô trống trước bằng FILTER:

=SORT(UNIQUE(FILTER(B2:B, B2:B<>"")))

Đọc từ trong ra ngoài: FILTER(B2:B, B2:B<>"") giữ lại các ô có dữ liệu → UNIQUE bỏ trùng → SORT xếp A→Z. Khi chỉ có một cột, SORT không cần đối số thứ hai.

Áp dụng tương tự cho bảng nhiều cột: =SORT(FILTER(A2:F, A2:A<>""), 5, FALSE).

Phần nâng cao 1: tên gõ thừa khoảng trắng, khác hoa thường

Đây là lý do số 1 khiến "danh sách không trùng" vẫn có hai dòng trông giống hệt nhau. Trang hỗ trợ của Google cũng lưu ý: nếu UNIQUE trả về dòng có vẻ trùng, hãy kiểm tra khoảng trắng thừa ở cuối ô.

Ngoài ra, UNIQUE trong Google Sheets phân biệt chữ hoa, chữ thường: "nguyễn văn an" và "Nguyễn Văn An" là hai giá trị khác nhau (khác với hàm UNIQUE của Excel, vốn không phân biệt).

Công thức chuẩn hóa trước khi lọc trùng:

=ARRAYFORMULA(SORT(UNIQUE(FILTER(PROPER(TRIM(B2:B)), B2:B<>""))))
  • TRIM xóa khoảng trắng ở đầu, cuối và gộp các khoảng trắng lặp giữa các từ thành một.
  • PROPER viết hoa chữ cái đầu mỗi từ, đưa mọi cách gõ về một dạng chung.
  • ARRAYFORMULA cho phép TRIM và PROPER xử lý cả cột cùng lúc.

Công thức này chỉ chuẩn hóa kết quả hiển thị. Về lâu dài, nên dùng danh sách thả xuống (dropdown) cho cột Khách hàng để người nhập không gõ mỗi người một kiểu. Danh sách cho dropdown có thể lấy luôn từ kết quả của công thức SORT(UNIQUE(...)) ở trên: chọn Dropdown (from a range) và trỏ tới cột kết quả.

Phần nâng cao 2: sắp xếp danh sách học sinh theo tên, không theo họ

Người Việt sắp danh sách lớp theo tên (chữ cuối), nhưng SORT trên cột Họ tên lại xếp theo họ, nên cả lớp "Nguyễn" dồn một chỗ. Bảng điểm có cột A = STT, B = Họ và tên, C = Điểm, dữ liệu từ dòng 2 đến dòng 40:

=ARRAYFORMULA(SORT(B2:C40, REGEXEXTRACT(B2:B40, "\S+$"), TRUE, B2:B40, TRUE))

Giải thích:

  • REGEXEXTRACT(B2:B40, "\S+$") lấy từ cuối cùng của họ tên ("An", "Bình", "Cường"). \S+ là một chuỗi ký tự không chứa khoảng trắng, $ là cuối chuỗi.
  • Vùng tên vừa tách được dùng làm cột sắp xếp thứ nhất. SORT cho phép cột sắp xếp nằm ngoài vùng dữ liệu, miễn là có cùng số dòng.
  • Cột sắp xếp thứ hai là cả họ tên, để hai bạn cùng tên "An" được xếp tiếp theo họ, tên đệm.

Lưu ý: dùng vùng có số dòng cố định (B2:B40) và không để ô trống giữa danh sách, vì REGEXEXTRACT báo lỗi với ô trống. STT nên đánh lại sau khi sắp xếp, ví dụ =SEQUENCE(COUNTA(B2:B40)) ở cột bên cạnh kết quả.

Phần nâng cao 3: SORTN lấy top N và lấy đơn mới nhất của mỗi khách

SORTN là "người anh em" của SORT, chỉ trả về N dòng đầu sau khi sắp xếp:

=SORTN(range, [n], [display_ties_mode], [sort_column1, is_ascending1], ...)

Top 5 đơn hàng lớn nhất:

=SORTN(FILTER(A2:F, A2:A<>""), 5, 0, 5, FALSE)

Số 0 là chế độ mặc định: lấy tối đa 5 dòng. Nếu muốn lấy thêm các đơn bằng đúng giá trị đơn thứ 5 (đồng hạng), đổi 0 thành 1.

Mỗi khách lấy một đơn gần nhất (dùng để biết lần cuối khách mua là khi nào):

=SORTN(SORT(FILTER(A2:F, A2:A<>""), 1, FALSE), 9^9, 2, 2, TRUE)
  • SORT(..., 1, FALSE): xếp đơn theo ngày mới nhất lên đầu.
  • SORTN(..., 9^9, 2, 2, TRUE): chế độ 2 bỏ các dòng trùng theo cột sắp xếp (cột 2 = Khách hàng), chỉ giữ dòng đầu tiên của mỗi khách, chính là đơn mới nhất. 9^9 là một số rất lớn, nghĩa là "không giới hạn số dòng".

Kết quả được xếp theo tên khách A→Z, mỗi khách một dòng kèm ngày, sản phẩm, thành tiền của lần mua gần nhất.

Mẹo: bảng tổng hợp doanh thu theo khách chỉ với 2 công thức

  1. Ô H2: =SORT(UNIQUE(FILTER(B2:B, B2:B<>""))) — danh sách khách.
  2. Ô I2: =ARRAYFORMULA(IF(H2:H="", , SUMIF(B2:B, H2:H, E2:E))) — tổng thành tiền từng khách.
  3. Ô H1: =COUNTUNIQUE(B2:B) nếu cần biết tổng số khách.

Khách mới nhập vào sheet gốc sẽ tự xuất hiện ở bảng tổng hợp. Khi cần nhóm theo nhiều tiêu chí hơn (theo tháng, theo nhân viên), hàm QUERY sẽ gọn hơn.

Lỗi thường gặp

#REF! – "Array result was not expanded because it would overwrite data in..." Nguyên nhân: vùng kết quả cần tràn xuống đang có dữ liệu. Cách sửa: xóa hết các ô bên dưới và bên phải ô chứa công thức, hoặc đặt công thức ở cột trống.

Kết quả có một dòng trống. Nguyên nhân: vùng mở B2:B chứa ô trống. Cách sửa: bọc FILTER(B2:B, B2:B<>"") như hướng dẫn.

Vẫn còn tên trùng. Nguyên nhân: khoảng trắng thừa hoặc khác hoa thường. Cách sửa: dùng công thức TRIM + PROPER ở phần nâng cao 1.

#N/A – "No matches are found in FILTER evaluation". Nguyên nhân: cột nguồn chưa có dữ liệu nào. Cách sửa: bọc ngoài bằng IFERROR(..., "").

Số và chữ số bị coi là khác nhau. Ví dụ mã "001" dạng văn bản và 1 dạng số. Google khuyên định dạng số thống nhất trong cả cột trước khi lọc trùng.

Không sửa được một ô trong kết quả. Kết quả là mảng do công thức sinh ra; gõ đè vào sẽ làm công thức báo lỗi #REF!. Nếu cần bản tĩnh để chỉnh tay, copy vùng kết quả rồi Ctrl + Shift + V (dán chỉ giá trị) sang chỗ khác.

Chuyển công thức sang Excel bị sai. Hàm SORT của Excel có cú pháp khác (SORT(array, sort_index, sort_order) với 1 / -1 thay cho TRUE / FALSE) và muốn sắp theo nhiều cột phải dùng mảng hằng như {6,5} hoặc hàm SORTBY. Với Excel, xem bài hàm FILTER trong Excel và cách xóa dữ liệu trùng lặp trong Excel.

Bảng tóm tắt công thức

Nhu cầu Công thức
Danh sách không trùng =UNIQUE(B2:B)
Không trùng, xếp A→Z, bỏ ô trống =SORT(UNIQUE(FILTER(B2:B, B2:B<>"")))
Tổ hợp không trùng nhiều cột =UNIQUE(B2:C)
Giá trị chỉ xuất hiện 1 lần =UNIQUE(B2:B, FALSE, TRUE)
Sắp xếp giảm dần theo cột 5 =SORT(A2:F, 5, FALSE)
Sắp theo 2 cột =SORT(A2:F, 6, TRUE, 5, FALSE)
Chuẩn hóa tên trước khi lọc =ARRAYFORMULA(SORT(UNIQUE(FILTER(PROPER(TRIM(B2:B)), B2:B<>""))))
Xếp học sinh theo tên =ARRAYFORMULA(SORT(B2:C40, REGEXEXTRACT(B2:B40, "\S+$"), TRUE, B2:B40, TRUE))
Top 5 =SORTN(FILTER(A2:F, A2:A<>""), 5, 0, 5, FALSE)
Đơn mới nhất mỗi khách =SORTN(SORT(FILTER(A2:F, A2:A<>""), 1, FALSE), 9^9, 2, 2, TRUE)
Đếm số giá trị khác nhau =COUNTUNIQUE(B2:B)

Học Google Sheets thực chiến

UNIQUE, SORT, FILTER và QUERY là bộ hàm giúp bảng tính tự cập nhật báo cáo mà không cần thao tác tay mỗi ngày. Khóa học Google Sheets tại Điền Nguyễn AZ thực hành trên chính dữ liệu bán hàng, chấm công, quản lý học sinh của học viên, học trực tiếp tại TP Vinh hoặc online qua Zoom.

📞 Hotline / Zalo: 0362 465 361

👉 Xem chi tiết: Khóa học Google Sheets

#hàm unique google sheets#hàm sort google sheets#lọc trùng google sheets#sắp xếp tự động google sheets

Tài liệu miễn phí

30 phím tắt Excel hay dùng nhất

Tổng hợp phím tắt giúp thao tác Excel nhanh hơn — điền thông tin để tải file PDF miễn phí về dùng ngay.