# Remove Duplicates in Google Sheets Without Losing Rows

- Author: FastBankConvert (https://www.fastbankconvert.com)
- Published: 2026-04-22
- Updated: 2026-04-22
- Category: Google Sheets, Numbers and LibreOffice
- Canonical: https://www.fastbankconvert.com/blog/remove-duplicates-in-google-sheets

> Remove duplicates in Google Sheets after stacking statements: the cleanup tool, UNIQUE, and keeping genuine repeated charges.
To remove duplicates in Google Sheets after stacking statements, first decide which columns make a row a duplicate, then flag repeats with a COUNTIFS check before deleting anything. Data, Data cleanup, Remove duplicates deletes them in place. Two identical coffee purchases on the same day can both be real, so keep a statement line number in the key.

## Why do stacked statements create duplicate rows in Google Sheets?

Stacked statements create duplicate rows in Google Sheets because consecutive statement periods often overlap, and because files get added twice. When you paste or import one month below another, any transaction printed on both statements appears twice. A sheet that holds a year of stacked months can collect dozens of these without anyone noticing.

The repeats come from a handful of sources, and knowing which one you have tells you how to find them:

- **Overlapping periods.** A card statement may run from the 14th to the 13th, while a downloaded transaction history covers the calendar month. Combining the two puts the overlapping days in twice.
- **The same file added twice.** It is easy to import March, get distracted and import March again. Every row of that month doubles.
- **Pending and posted versions.** A history exported from online banking may include a pending card charge that later posts with a different date. The two rows look alike but are not exact copies.
- **Carried-forward lines.** Some statements reprint the last few transactions of the previous period, or a balance brought forward, at the top of the new one.
- **Conversion artifacts.** A converter that reads a page twice, or a page included twice in a merged PDF, adds a full page of repeats.

Exact copies are the easy case. The hard cases are near copies, such as the pending and posted pair, and real repeats, such as two identical subscription charges, which the removal must keep.

## Which columns decide a duplicate transaction in Google Sheets?

A duplicate transaction in Google Sheets is a row whose date, description and amount all match another row from a different statement. Those three columns form the key. Leave out a running balance, a category you added, or a notes column, because those can differ between two copies of the same transaction.

The running balance is worth a closer look. On a single statement, each row's balance is unique, so two genuine identical charges have different balances. Across two statements that overlap, the same transaction may print the same balance on both. That makes balance a useful tiebreaker inside one statement but a poor one across statements.

The most reliable key adds a source label. When you stack statements, add a column that records which statement each row came from, such as "2026-03 checking", and a column with the row's position on that statement. With those two columns, a row is a duplicate only if the date, description and amount match and the source differs. Two matching rows from the same statement are kept, because a statement does not print the same transaction twice.

Hidden differences can stop real duplicates from matching. A trailing space in a description, a non-breaking space from a PDF, or an amount stored as text on one row and as a number on the other all make two copies look different to a formula. Google's [UNIQUE function help page](https://support.google.com/docs/answer/10522653) warns about exactly this, pointing to trailing spaces and inconsistent number formats. Clean the columns first; [TRIM and CLEAN in Google Sheets](/blog/trim-and-clean-in-google-sheets) covers which characters each one removes.

Descriptions on card statements also carry noise, such as a store number or a date stamp, that differs between a pending and a posted copy. Pulling out just the merchant name with a pattern, as described in [using REGEXEXTRACT in Google Sheets](/blog/regexextract-in-google-sheets), gives you a cleaner key column to match on.

## The Remove duplicates cleanup tool in Google Sheets

The Remove duplicates tool in Google Sheets deletes repeated rows from a selected range in one step. Select the range, then choose Data, then Data cleanup, then Remove duplicates. A dialog asks whether the data has a header row and which columns to compare. Click Remove duplicates, and Sheets reports how many rows it removed.

A few details from [Google Docs Editors Help on removing duplicates](https://support.google.com/docs/answer/6325535) matter for statement data:

- **Matching ignores case and formatting.** Cells with identical values but different letter case, formatting or formulas count as duplicates. "COFFEE HOUSE" and "Coffee House" match.
- **A single selected cell means the whole range.** If you select one cell inside a block of data, duplicates are removed for the whole range around it.
- **You choose the columns.** Untick the columns that should not count, such as balance, category and notes.

The tool keeps the first occurrence and deletes the later ones. Sort your data first if the order matters, for example so that the posted copy of a transaction, with its final date, comes before the pending copy.

The weakness of this tool is that it acts immediately and silently. It tells you how many rows went, but not which ones. If the count is larger than you expected, use Edit, then Undo, and run the flagging method in the next section instead.

## UNIQUE and COUNTIFS for a duplicate check you can undo

UNIQUE and COUNTIFS find duplicate rows without deleting anything. UNIQUE returns a new list with each distinct row once, leaving the original untouched. COUNTIFS adds a count next to each row showing how many times its key appears. Both let you look at the repeats before you decide what to remove.

UNIQUE is the quick route. On a separate tab, a formula like the one below writes a de-duplicated copy of the date, description and amount columns:

```
=UNIQUE(Transactions!A2:C)
```

Google's help page notes that UNIQUE takes optional arguments: by_column, to compare columns instead of rows, and exactly_once, which returns only entries that appear a single time. Setting exactly_once to TRUE is a quick way to list the rows that never repeat, which is the opposite view and sometimes the more useful one.

COUNTIFS is the careful route, because it keeps every row and adds a flag. With dates in A, descriptions in B, amounts in C and the source statement in E, put this in F2 and fill it down:

```
=COUNTIFS(A$2:A2, A2, B$2:B2, B2, C$2:C2, C2)
```

The range grows as it goes down, so the first copy of a transaction gets 1, the second gets 2, and so on. Filter column F for values above 1 to see every later copy.

### A worked example of stacked rows

The rows below are an example of February and March statements stacked together, with an overlap. The values are made up for illustration.

| Date | Description | Amount | Statement | Line | Count | Verdict |
| --- | --- | --- | --- | --- | --- | --- |
| 2026-02-27 | ELECTRIC CO | -84.10 | Feb | 31 | 1 | Keep |
| 2026-02-28 | COFFEE HOUSE | -4.75 | Feb | 32 | 1 | Keep |
| 2026-02-28 | COFFEE HOUSE | -4.75 | Feb | 33 | 2 | Keep: same statement, two purchases |
| 2026-02-28 | COFFEE HOUSE | -4.75 | Mar | 1 | 3 | Remove: overlap copy of line 32 |
| 2026-02-28 | COFFEE HOUSE | -4.75 | Mar | 2 | 4 | Remove: overlap copy of line 33 |
| 2026-03-01 | PAYROLL ACME | 1500.00 | Mar | 3 | 1 | Keep |

A plain count would mark three of the four coffee rows for removal. The statement column shows that the February statement printed two purchases, so two must stay. The March copies are the overlap. This is why a count alone is not a verdict: it tells you where to look.

## Genuine repeated charges that duplicate removal would delete

Genuine repeated charges are separate transactions that happen to share a date, description and amount. Duplicate removal cannot tell them from copies, because by the key they are identical. Two coffees on one card on the same morning, two identical parking fees, or a split bill paid in two equal halves are all real money.

These cases are common in some kinds of data:

- **Small card purchases** at the same merchant on the same day.
- **Transfers** between your own accounts, when you move the same round amount twice.
- **Fees** charged per item, such as two identical wire fees on one day.
- **Rent and service charges** that repeat across units or tenants. On a property ledger, many tenants pay exactly the same rent on the same day. [A rent roll PDF turned into Excel rows](/blog/rent-roll-pdf-to-excel) keeps each unit on its own row for exactly this reason, and the unit number belongs in the key.

The safeguard is the one shown in the worked example: keep the source statement and line number on every row, and only remove a match when it comes from a different statement. Within one statement, two identical rows are two transactions.

A second safeguard is to look at the counts before deleting. If a filter on the count column shows a value of 2 for rows that all come from the same statement, those are real repeats. Exclude them from the removal.

## Checking totals after removing duplicate statement rows

Checking totals proves that duplicate removal kept every real row. After the cleanup, each month's transactions should add up to the change in balance shown on that month's statement. If they do, nothing real was removed and no copy was left behind. If they do not, the gap tells you how much went wrong.

Run the check per statement period:

1. For each month, take the opening and closing balance printed on the statement.
2. Sum that month's amounts in the cleaned sheet, using a SUMIFS over the date range.
3. The opening balance plus the sum should equal the closing balance.
4. If the result is too low by the amount of one transaction, a real repeat was removed. If it is too high, a copy survived.

Count rows as well. If the March statement lists 52 transactions, the cleaned sheet should hold 52 rows dated in that statement's period. A count of 50 with a matching total is possible when two removed rows cancel out, so check both.

Keep the original stacked tab until the checks pass. Copy it with Duplicate from the tab menu before any cleanup, and delete the copy only once every month ties.

Duplicates are easier to avoid than to remove. Converting each statement once and naming each output file by account and period makes a repeat import obvious before it happens. FastBankConvert is being built to warn you before download when a statement's balances do not add up; [the get started page](/get-started) is where to hear when it opens.
