hitava

Mẹo Google Sheets · 14 phút đọc

Cách lọc và xoá dữ liệu trùng lặp trong Google Sheets: tô màu, UNIQUE, xoá bản sao, chặn nhập trùng

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.

Đăng HiTaVaDữ liệu trùngCOUNTIFUNIQUEGoogle Sheets
Danh sách 10 khách với cột SĐT gõ nhiều kiểu và cột Khoá chỉ còn 9 chữ số; 8 dòng trùng tô màu cam, công thức =COUNTIF($C$2:$C$11; C2)>1

Ví dụ: danh sách khách hàng bị nhập trùng

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òngA: Họ tênB: SĐT gõ vàoGhi chú
2Nguyễn Thị Lan0909123456
3Trần Văn Minh0912345678
4Lê Thu Hà0987654321
5Nguyễn Thị Lan0909123456Trùng y hệt dòng 2
6Phạm Quốc Bảo0938111222
7Trần Văn Minh0912 345 678Trùng dòng 3, gõ có dấu cách
8Hoàng Mai Anh0977000111
9Lê Thu Hà0987.654.321Trùng dòng 4, gõ có dấu chấm
10Vũ Đức Long0901888999
11Phạm Quốc Bảo+84 938 111 222Trùng dòng 6, gõ đầu +84
Bảng ví dụ dùng xuyên suốt bài. Cột SĐT nên để định dạng văn bản thuần để không mất số 0 đầu.
Tô màu ô trùng
Định dạng có điều kiện + COUNTIF
Danh sách không trùng
=UNIQUE(…)
Xoá hẳn dòng trùng
Dữ liệu › Dọn dẹp dữ liệu
Chặn nhập trùng
Xác thực dữ liệu, công thức tuỳ chỉnh
Bốn thẻ: tô màu ô trùng bằng COUNTIF, hàm UNIQUE đếm ra 6 khách, xoá bản sao còn dòng 2, 3, 4, 6, 8, 10, chặn nhập trùng bằng xác thực dữ liệu
Bốn cách xử lý trùng: hai cách đầu không đụng vào dữ liệu gốc, cách thứ ba xoá dòng, cách thứ tư chặn từ lúc nhập.

Cách tô màu ô trùng lặp bằng COUNTIF

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ì.

  1. Chọn vùng B2:B1000 (cột SĐT).
  2. Vào Định dạng › Định dạng có điều kiện.
  3. Ở mục "Định dạng ô nếu", chọn Công thức tuỳ chỉnh là và dán công thức bên dưới.
  4. Chọn màu nền (ví dụ cam nhạt) rồi bấm Xong.
$B$2:$B$1000 khoá cố định để Google so mỗi ô với cả cột; B2 không có $ để tự đổi thành B3, B4… cho từng ô.
=COUNTIF($B$2:$B$1000; B2)>1

Muố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.

Ở dòng 5 vùng đếm là B2:B5, số 0909123456 đã gặp 2 lần nên tô; ở dòng 2 vùng đếm chỉ có B2 nên không tô.
=COUNTIF($B$2:B2; B2)>1

Cù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.

Tìm trùng khi số điện thoại gõ mỗi kiểu một khác

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ả.

Đặt ở C2 rồi kéo xuống. \D là "mọi ký tự không phải chữ số"; B2&"" biến ô thành chữ để REGEXREPLACE chạy được cả khi ô đang là số.
=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.

Hàm UNIQUE: lấy danh sách không trù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.

Gõ ở ô trống (ví dụ F2), kết quả tự tràn xuống. Chọn nhiều cột thì UNIQUE so cả dòng: chỉ bỏ dòng giống nhau ở mọi cột.
=UNIQUE(A2:B11)
Công thứcKết quả với bảng ví dụGiải thích
=COUNTA(UNIQUE(B2:B11))9Chỉ 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–ZBọc SORT để sắp xếp danh sách
Cú pháp đầy đủ: UNIQUE(dải_ô; theo_cột; chỉ_một_lần). Hai đối số sau không bắt buộc.

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.

Xoá dữ liệu trùng lặp bằng công cụ có sẵn

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.

  1. Tạo bản sao trang tính trước (chuột phải vào tên trang › Sao chép) để còn đường lui.
  2. Chọn cả bảng, gồm mọi cột của dòng (ở ví dụ là A1:C11), không chỉ cột SĐT — chọn một cột thì công cụ chỉ xử lý ô trong cột đó, các cột khác có thể bị lệch dòng.
  3. Mở công cụ xoá bản sao, đánh dấu "Dữ liệu có hàng tiêu đề" nếu dòng 1 là tiêu đề.
  4. Ở phần chọn cột để phân tích, chỉ tích cột khoá (cột C). Tích cả cột B thì các dòng gõ khác kiểu sẽ không bị coi là trùng.
  5. Bấm xoá. Google báo đã xoá bao nhiêu dòng trùng và còn bao nhiêu dòng.

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.

Tìm trùng theo nhiều cột với COUNTIFS

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òngA: NgàyB: SĐTC: Số tiềnTrùng?
215/10/20260909123456350.000TRUE
315/10/20260912345678120.000FALSE
415/10/20260909123456350.000TRUE
516/10/20260909123456350.000FALSE
Mỗi cặp "vùng; giá trị" là một điều kiện. Dòng chỉ tính là trùng khi khớp cả ba.
=COUNTIFS($A$2:$A$1000; A2; $B$2:$B$1000; B2; $C$2:$C$1000; C2)>1

Thử 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.

Chặn nhập trùng bằng xác thực dữ liệu

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õ.

  1. Chọn B2:B1000.
  2. Vào Dữ liệu › Xác thực dữ liệu › Thêm quy tắc.
  3. Ở phần Tiêu chí, chọn Công thức tuỳ chỉnh là và dán công thức bên dưới.
  4. Trong tuỳ chọn nâng cao, chọn từ chối dữ liệu nhập (chặn hẳn) hoặc hiển thị cảnh báo (cho nhập nhưng đánh dấu ô).
Hợp lệ khi số vừa gõ chỉ xuất hiện đúng một lần trong cột.
=COUNTIF($B$2:$B$1000; B2)=1

Thử 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õ đè.

Lỗi hay gặp: nhìn giống nhau mà Google không coi là trùng

Bốn lỗi khiến Google không nhận ra dữ liệu trùng: dấu cách thừa (LEN 21 thay vì 20), chữ hoa thường, số điện thoại gõ có dấu cách, dấu chấm, +84, và dấu cách không ngắt CHAR(160), kèm công thức sửa
Bốn lý do phổ biến khiến hai ô trông giống nhau mà COUNTIF hay UNIQUE vẫn coi là khác.
  • Dấu cách thừa ở đầu hoặc cuối. Thường gặp khi dán từ Zalo hay web. Kiểm tra bằng =LEN(D2): "lan.nguyen@gmail.com" có 20 ký tự, ra 21 là có ký tự thừa. Sửa bằng =TRIM(D2) hoặc Cắt bớt khoảng trắng.
  • Chữ hoa, chữ thường. COUNTIF không phân biệt hoa thường nên vẫn đếm đúng, nhưng UNIQUE thì có. Chuẩn hoá bằng =LOWER(TRIM(D2)) cho email; với họ tên có thể dùng PROPER để viết hoa chữ đầu.
  • Dấu cách không ngắt CHAR(160). Dữ liệu dán từ trang web có loại dấu cách này, TRIM không xoá được. Dùng =TRIM(SUBSTITUTE(D2; CHAR(160); " ")).
  • Số và chữ lẫn lộn. Cùng một mã nhưng ô này là số, ô kia là chữ (thường do mất số 0 đầu, hoặc dán từ phần mềm khác). Cách nhận ra và sửa giống hệt lỗi SUM bằng 0. Với số điện thoại, cột khoá ở trên đã xử lý luôn chuyện này.

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ự.

Khi danh sách khách hàng lớn và nhiều người cùng nhập

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.

Hộp thoại Gộp lead trùng của mẫu Quản lý Lead & Bán hàng PRO: hai lead cùng SĐT 0383397202 đặt cạnh nhau, chọn lead được giữ, nút Gộp L-0059 vào lead được giữ
Gộp lead trùng trong mẫu Quản lý Lead & Bán hàng PRO (chạy trên Google Sheets): so hai lead cùng số điện thoại đã chuẩn hoá rồi chọn lead được giữ.

Câu hỏi thường gặp

Làm sao lọc dữ liệu trùng mà không xoá?

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.

Xoá bản sao rồi có lấy lại được không?

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á.

Tìm trùng giữa hai trang tính hoặc hai danh sách khác nhau thế nào?

Đế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.

Đếm số giá trị không trùng trong một cột bằng hàm gì?

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

Vì sao COUNTIF vẫn báo trùng dù hai ô khác chữ hoa thường?

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.

Đọc tiếp

Nguồn tham khảo

Mẫu làm sẵn cho việc này

Đọc tiếp

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)