Google Sheets hay Excel: so sánh thật cho người dùng văn phòng và chủ cửa hàng nhỏ
Google Sheets hay Excel: so chi phí, làm chung, dùng trên điện thoại, khi mất mạng, giới hạn dữ liệu, Apps Script với VBA và các công thức khác nhau.
Mẹo Google Sheets · 14 phút đọc
Muốn tìm dữ liệu trùng trong Google Sheets, cách nhanh nhất là tô màu bằng định dạng có điều kiện với công thức =COUNTIF($B$2:$B$1000; B2)>1; muốn có danh sách không trùng thì dùng hàm UNIQUE; muốn xoá hẳn thì dùng công cụ xoá bản sao trong menu Dữ liệu. Cái khó thật sự là dữ liệu "gần trùng": cùng một số điện thoại nhưng gõ 0912 345 678, 0912.345.678 hay +84 912 345 678. Bài này đi qua cả bốn cách trên một danh sách 10 khách hàng, cách tìm trùng theo nhiều cột, chặn nhập trùng từ đầu và các lỗi khiến Google không nhận ra hai ô giống nhau.

Danh sách khách gom từ nhiều nguồn (Zalo, Facebook, sổ tay, nhân viên mỗi người một file) gần như luôn có người bị nhập hai lần. Hậu quả rất cụ thể: gọi một khách hai lần, đếm sai số khách mới trong tháng, gửi hai tin nhắn khuyến mãi cho cùng một người, hay tệ hơn là công nợ của một khách bị chia ra hai dòng.
Các ví dụ trong bài dùng bảng dưới đây: cột A là Họ tên, cột B là SĐT đúng như nhân viên đã gõ, dữ liệu ở dòng 2–11. Nhìn bằng mắt bạn sẽ thấy 4 người bị nhập 2 lần, tức chỉ có 6 khách thật.
| Dòng | A: Họ tên | B: SĐT gõ vào | Ghi chú |
|---|---|---|---|
| 2 | Nguyễn Thị Lan | 0909123456 | |
| 3 | Trần Văn Minh | 0912345678 | |
| 4 | Lê Thu Hà | 0987654321 | |
| 5 | Nguyễn Thị Lan | 0909123456 | Trùng y hệt dòng 2 |
| 6 | Phạm Quốc Bảo | 0938111222 | |
| 7 | Trần Văn Minh | 0912 345 678 | Trùng dòng 3, gõ có dấu cách |
| 8 | Hoàng Mai Anh | 0977000111 | |
| 9 | Lê Thu Hà | 0987.654.321 | Trùng dòng 4, gõ có dấu chấm |
| 10 | Vũ Đức Long | 0901888999 | |
| 11 | Phạm Quốc Bảo | +84 938 111 222 | Trùng dòng 6, gõ đầu +84 |

COUNTIF đếm xem giá trị của ô hiện tại xuất hiện bao nhiêu lần trong cả cột. Lớn hơn 1 nghĩa là có trùng. Đặt công thức đó vào định dạng có điều kiện thì Google tự tô màu, dữ liệu không bị thay đổi gì.
=COUNTIF($B$2:$B$1000; B2)>1Muốn tô cả dòng thay vì một ô, chọn A2:B1000 và đổi thành =COUNTIF($B$2:$B$1000; $B2)>1 (thêm $ trước chữ B để mọi ô trong dòng đều nhìn vào cột B).
Thử lại: với bảng ví dụ, B2 = 0909123456 xuất hiện 2 lần (dòng 2 và 5) nên được tô. B3 = 0912345678 chỉ xuất hiện 1 lần vì dòng 7 là "0912 345 678" có dấu cách — với Google đó là một chuỗi khác. Kết quả: chỉ 2 dòng được tô (2 và 5), trong khi thực tế có 8 dòng thuộc người bị nhập trùng. Phần tiếp theo sửa đúng chỗ này.
Chỉ muốn đánh dấu lần xuất hiện thứ hai trở đi (những dòng nên xoá), giữ nguyên dòng đầu: cho vùng đếm mở rộng dần từ dòng 2 tới dòng hiện tại.
=COUNTIF($B$2:B2; B2)>1Cùng công thức này đặt vào một cột phụ (ví dụ D2 rồi kéo xuống) sẽ ra TRUE/FALSE. Bạn bật bộ lọc và lọc TRUE để xem riêng các dòng thừa. Nếu chỉ cần đếm số lần xuất hiện của mỗi khách, xem thêm COUNTIF và COUNTIFS.
Google so sánh từng ký tự. Muốn bắt được "0912 345 678" và "0912345678" là một người, bạn tạo một cột khoá chỉ giữ lại phần cốt lõi của số, rồi tìm trùng trên cột khoá thay vì cột gốc. Với số di động Việt Nam, phần cốt lõi là 9 chữ số cuối: bỏ hết ký tự không phải số, rồi lấy 9 số bên phải để 0912… và +84 912… ra cùng một kết quả.
=RIGHT(REGEXREPLACE(B2&""; "\D"; ""); 9)Thử lại: B7 = "0912 345 678" → bỏ dấu cách còn 0912345678 → 9 số cuối là 912345678, giống hệt C3. B11 = "+84 938 111 222" → còn 84938111222 → 9 số cuối là 938111222, giống C6. B9 = "0987.654.321" → 987654321, giống C4.
Giờ đổi định dạng có điều kiện sang cột khoá: =COUNTIF($C$2:$C$11; C2)>1 (hoặc $C$2:$C$1000 cho cả cột). Kết quả: 8 dòng được tô (2, 3, 4, 5, 6, 7, 9, 11), chỉ dòng 8 và 10 là khách xuất hiện một lần. Đúng với những gì bạn thấy bằng mắt.
Số máy bàn và số nước ngoài
Lấy 9 số cuối hợp với số di động 10 số của Việt Nam. Danh sách có số máy bàn (11 số kèm mã vùng) hoặc số nước ngoài thì hai số khác nhau có thể trùng 9 số cuối — lúc đó dùng khoá đầy đủ: =REGEXREPLACE(B2&""; "\D"; "") và tự sửa đầu +84 thành 0 trước.
Cùng ý tưởng cho email: khoá là =LOWER(TRIM(D2)) — bỏ khoảng trắng hai đầu và đưa về chữ thường. Cho họ tên: =LOWER(TRIM(A2)), nhưng đừng chỉ dựa vào họ tên vì hai người khác nhau trùng tên là chuyện bình thường.
UNIQUE trả về một danh sách mới, mỗi giá trị một lần, theo thứ tự xuất hiện đầu tiên. Dữ liệu gốc giữ nguyên, nên đây là cách an toàn để lấy danh sách gửi tin, đếm số khách thật hay làm nguồn cho danh sách thả xuống.
=UNIQUE(A2:B11)| Công thức | Kết quả với bảng ví dụ | Giải thích |
|---|---|---|
| =COUNTA(UNIQUE(B2:B11)) | 9 | Chỉ dòng 5 trùng y hệt dòng 2; ba cặp còn lại khác cách gõ |
| =COUNTA(UNIQUE(C2:C11)) | 6 | Đếm trên cột khoá: đúng 6 khách thật |
| =UNIQUE(C2:C11; FALSE; TRUE) | 977000111, 901888999 | Đối số thứ 3 = TRUE: chỉ lấy giá trị xuất hiện đúng một lần |
| =SORT(UNIQUE(A2:A11)) | 6 họ tên xếp A–Z | Bọc SORT để sắp xếp danh sách |
Hai lưu ý. Một: nếu vùng chọn có ô trống, UNIQUE trả thêm một dòng trống và COUNTA đếm cả nó; dùng =UNIQUE(FILTER(B2:B; B2:B<>"")) khi chọn cả cột. Hai: UNIQUE phân biệt chữ hoa và chữ thường, nên "Lan.Nguyen@gmail.com" và "lan.nguyen@gmail.com" ra hai dòng — chuẩn hoá bằng LOWER trước.
Muốn lấy danh sách không trùng mà vẫn kèm các cột khác (họ tên, ngày tạo), dùng hàm QUERY gom nhóm theo cột khoá, hoặc tra lại từng khoá bằng XLOOKUP — XLOOKUP lấy dòng khớp đầu tiên, đúng là bản ghi cũ nhất.
Khi đã chắc chắn muốn xoá, Google Sheets có công cụ xoá bản sao trong menu Dữ liệu › Dọn dẹp dữ liệu (mục Xoá bản sao; giao diện tiếng Anh là Remove duplicates). Công cụ giữ lại dòng xuất hiện đầu tiên và xoá các dòng sau.
Thử lại: với cột khoá C, dòng 5 (trùng dòng 2), dòng 7 (trùng dòng 3), dòng 9 (trùng dòng 4) và dòng 11 (trùng dòng 6) bị xoá. Còn lại 6 dòng: Lan, Minh, Hà, Bảo, Mai Anh, Long. Nếu thay vào đó chỉ tích cột B, Google chỉ xoá 1 dòng (dòng 5).
Dòng nào được giữ là chuyện quan trọng
Công cụ luôn giữ dòng nằm trên. Nếu bạn muốn giữ bản ghi mới nhất (số điện thoại cập nhật, địa chỉ mới), hãy sắp xếp bảng theo ngày tạo giảm dần trước khi xoá. Nếu hai dòng mỗi dòng có một phần thông tin (dòng này có email, dòng kia có địa chỉ), xoá sẽ làm mất thông tin — gộp tay trước hoặc dùng công cụ có chức năng gộp.
Nếu sau khi xoá các ô còn khoảng trắng thừa, mục Cắt bớt khoảng trắng nằm ngay cạnh trong cùng menu Dọn dẹp dữ liệu.
Có lúc một giá trị lặp lại là bình thường: cùng một khách mua nhiều lần. Cái cần bắt là đơn bị nhập hai lần — trùng cả ngày, SĐT và số tiền. Ví dụ sổ đơn: A là Ngày, B là SĐT, C là Số tiền.
| Dòng | A: Ngày | B: SĐT | C: Số tiền | Trùng? |
|---|---|---|---|---|
| 2 | 15/10/2026 | 0909123456 | 350.000 | TRUE |
| 3 | 15/10/2026 | 0912345678 | 120.000 | FALSE |
| 4 | 15/10/2026 | 0909123456 | 350.000 | TRUE |
| 5 | 16/10/2026 | 0909123456 | 350.000 | FALSE |
=COUNTIFS($A$2:$A$1000; A2; $B$2:$B$1000; B2; $C$2:$C$1000; C2)>1Thử lại: dòng 2 và 4 cùng ngày 15/10, cùng số, cùng 350.000 nên COUNTIFS ra 2 → TRUE. Dòng 5 cùng số, cùng tiền nhưng khác ngày (khách mua lại hôm sau) → chỉ khớp chính nó → FALSE. Muốn chỉ đánh dấu dòng thừa (dòng 4), đổi vùng thành $A$2:A2, $B$2:B2, $C$2:C2 như ở phần COUNTIF.
Cách khác là ghép một cột khoá: =A2&"|"&B2&"|"&C2 rồi dùng COUNTIF hoặc công cụ xoá bản sao trên cột đó. Dấu | ngăn trường hợp ghép nhầm như "1"&"23" và "12"&"3" ra cùng chuỗi. Ngày phải là ngày thật, không phải chữ — nếu nghi ngờ, đọc cách sửa lỗi ngày tháng.
Dọn trùng một lần chưa đủ nếu ngày mai nhân viên lại nhập trùng. Xác thực dữ liệu kiểm tra ngay lúc gõ.
=COUNTIF($B$2:$B$1000; B2)=1Thử lại: đã có 0909123456 ở B2, nhân viên gõ 0909123456 vào B12 → COUNTIF ra 2, khác 1 → bị từ chối. Gõ 0911222333 → ra 1 → được nhận.
Xác thực dữ liệu không chặn được mọi thứ
Quy tắc so sánh đúng chuỗi đã gõ, nên "0909 123 456" vẫn lọt nếu trong cột đang là "0909123456". Muốn chặn cả kiểu gõ khác, dùng công thức trên cột khoá: =COUNTIF($C$2:$C$1000; RIGHT(REGEXREPLACE(B2&""; "\D"; ""); 9))=1 (cột C chứa khoá như phần trên). Dữ liệu dán vào hàng loạt có thể chỉ bị đánh dấu chứ không bị chặn, nên vẫn giữ định dạng có điều kiện để soát lại.
File nhiều người cùng nhập thì nên khoá các cột công thức như cột khoá, để không ai vô tình xoá công thức rồi gõ đè.

Một bẫy nữa: COUNTIF coi dấu * và ? trong giá trị là ký tự đại diện. Giá trị chứa các dấu này (mã hàng kiểu "A*01") có thể bị đếm sai; trường hợp đó dùng =SUMPRODUCT(--($B$2:$B$1000=B2))>1 để so sánh chính xác từng ký tự.
Các công thức trên đủ cho một danh sách vài trăm dòng do một người giữ. Khi đội bán hàng 5–10 người cùng thêm khách mỗi ngày từ form, Facebook, Zalo, việc trùng xảy ra liên tục và việc gộp bằng tay (giữ dòng nào, chuyển lịch sử chăm sóc sang đâu) mới là phần tốn thời gian. Cách tổ chức một danh sách như vậy được nói kỹ trong bài quản lý khách hàng tiềm năng bằng Google Sheets.

Dùng định dạng có điều kiện với =COUNTIF($B$2:$B$1000; B2)>1 để tô màu, hoặc đặt công thức đó ở một cột phụ rồi bật bộ lọc, lọc TRUE. Muốn danh sách không trùng ở chỗ khác thì dùng =UNIQUE(…). Cả hai cách đều giữ nguyên dữ liệu gốc.
Bấm Ctrl+Z (Cmd+Z trên Mac) ngay sau khi xoá, hoặc mở Tệp › Nhật ký phiên bản để khôi phục bản trước. Cách an toàn nhất vẫn là sao chép trang tính trước khi xoá.
Đếm giá trị của danh sách này trong danh sách kia: =COUNTIF('Khách cũ'!$B$2:$B$1000; B2)>0 ra TRUE là khách đã có trong danh sách cũ. Trong định dạng có điều kiện, tham chiếu sang trang khác phải bọc INDIRECT: =COUNTIF(INDIRECT("'Khách cũ'!B2:B1000"); B2)>0.
=COUNTUNIQUE(B2:B1000) hoặc =COUNTA(UNIQUE(FILTER(B2:B1000; B2:B1000<>""))). Nhớ chuẩn hoá trước (TRIM, LOWER, cột khoá số điện thoại), nếu không các giá trị gõ khác kiểu sẽ được đếm thành nhiều.
COUNTIF trong Google Sheets không phân biệt hoa thường, nên "An@gmail.com" và "an@gmail.com" được tính là một. Với email thì đó là điều bạn muốn. Nếu cần phân biệt, dùng =SUMPRODUCT(--EXACT($B$2:$B$1000; B2))>1.
Google Sheets hay Excel: so chi phí, làm chung, dùng trên điện thoại, khi mất mạng, giới hạn dữ liệu, Apps Script với VBA và các công thức khác nhau.
Cách dùng hàm FILTER trong Google Sheets: lọc 1 hay nhiều điều kiện AND/OR, theo ngày, chữ chứa, kết hợp SORT, UNIQUE và sửa lỗi không tìm thấy kết quả.
Cách dùng hàm ARRAYFORMULA trong Google Sheets: một công thức cho cả cột, bỏ dòng trống bằng IF, kết hợp VLOOKUP, XLOOKUP, SUMIF, thay AND/OR, sửa lỗi #REF!.
Cách dùng hàm XLOOKUP trong Google Sheets: gõ mã khách ra tên, SĐT, hạng; tra sang trái, giá trị khi không thấy, khớp gần đúng, sửa lỗi #N/A.
Xem thêm mẹo và video hướng dẫn trên kênh YouTube HiTaVa, hoặc đọc các bài khác trong chủ đề Mẹo Google Sheets.
Cần hỏi thêm?Zalo 0935077673 (Hải Vân)