FastBankConvertFastBankConvert home

Combine Multiple Sheets in Google Sheets into One List

By FastBankConvertPublished October 17, 2026

To combine multiple sheets in Google Sheets into one list, give every monthly tab the same columns, then stack their ranges on a new tab with VSTACK or a curly-brace array. Wrap the stack in QUERY to drop blank rows. The combined list updates whenever a monthly tab changes, so there is nothing to copy and paste.

Lining up monthly tab columns before combining them

Stacking formulas join ranges by position, not by heading. Column A of January lands on top of column A of February whatever the headers say. So before you write any formula, make every monthly tab use the same columns in the same order, with the same kind of value in each.

For converted statements, a five-column layout works well: Date, Description, Debit, Credit, Balance. Check each tab against it:

  1. Same column order on every tab. A month where the bank printed Credit before Debit must be rearranged.
  2. Same number of columns. An extra Notes column on one tab breaks the stack.
  3. Headers in row 1 only, with data starting in row 2.
  4. Real dates and real numbers. A tab where amounts came in as text will sum differently from the rest.
  5. No totals row at the bottom of a tab. The formula would pick it up as a transaction.

Text with stray spaces or invisible characters is a common reason a column looks right but behaves wrongly. Cleaning imported text with TRIM and CLEAN fixes that on each tab before you combine.

If you want to practise before touching real statements, use a made-up file; the guide to sample bank statement PDFs for testing lists safe ones.

Stacking statement tabs with curly-brace arrays

A curly-brace array builds a new range from pieces inside a formula. Google's help on using arrays in Google Sheets explains the two separators: a comma places ranges side by side as columns, and a semicolon places them one under the other as rows. Semicolons are what stack tabs.

On a new tab called All, put this in A2:

={Jan!A2:E200; Feb!A2:E200; Mar!A2:E200}

Sheets places January's rows first, February's under them, then March's. Type the headers yourself in row 1 of the All tab, since each range starts at row 2 and skips the monthly headers.

Two details trip people up:

  • Equal widths. Every range inside the braces must have the same number of columns. A:E with A:F returns an error instead of a list.
  • Locale. The same help page notes that in countries that use a comma as the decimal mark, the column separator inside braces becomes a backslash. The semicolon still stacks rows, but if a formula copied from an English guide fails, the locale is a likely cause.

Fixed ranges like A2:E200 include every empty row up to 200. That gives gaps between months, which the QUERY section removes.

Is VSTACK better than curly braces for combining tabs?

VSTACK does the same job as the semicolon array and is easier to read, so it is the better choice in most current files. Google's VSTACK help page describes it as appending ranges vertically and in sequence to return a larger array. The formula below gives the same result as the braces version.

=VSTACK(Jan!A2:E200, Feb!A2:E200, Mar!A2:E200)

Reasons to prefer it:

  • Readability. A list of ranges separated by commas is easier to scan and edit than nested braces.
  • Adding months. Add , Apr!A2:E200 at the end. With braces it is easy to drop a semicolon or put a comma in the wrong place.
  • Sibling functions. HSTACK places ranges side by side, which helps when you add a column next to the stack, as shown later.

Curly braces still have a place. They work in older files and in other formulas that build small arrays, such as a lookup table typed into a formula. Both methods share the same rule: ranges should be the same width. Neither reorders columns for you.

Dropping blank rows from the stacked list with QUERY

Wrap the stack in QUERY and keep only rows where the first column has a value. That removes the empty rows each fixed range carries, so the months run on without gaps. The formula on the All tab becomes the one below, with 0 meaning the stacked data has no header row.

=QUERY(VSTACK(Jan!A2:E200, Feb!A2:E200, Mar!A2:E200), "select * where Col1 is not null", 0)

Inside QUERY, a stacked range has no column letters, so columns are named Col1, Col2 and so on, in order. Col1 here is Date.

A trap in the date column

Google's QUERY function help explains that when a column holds mixed data types, the majority type decides the column's type and the other values are treated as nulls. If a few dates on one tab are text while the rest are real dates, those rows count as null and the filter silently drops them. Fix text dates on the monthly tabs first, or filter on a column that is always text, such as Description: "select * where Col2 is not null".

Worked example

Three example tabs with made-up row counts and totals:

Tab Transactions Sum of Debit
Jan 41 3,218.40
Feb 37 2,904.15
Mar 44 3,661.02
Expected on All 122 9,783.57

After the QUERY formula fills the All tab, put =COUNTA(B2:B) and =SUM(C2:C) somewhere off to the side. They should read 122 and 9,783.57. Anything else points to a row that was dropped or picked up by mistake.

Tagging each combined row with its source month

A combined list is more useful when each row says which tab it came from. You can filter by month, trace an odd row back to its statement and spot a month that was combined twice. Add the label on the monthly tabs, or let a formula add it as the tabs are stacked.

Option 1: a Month column on each tab

Add column F to every monthly tab and fill it with the month name, such as "Jan 2026", down to the last transaction. Then widen every range in the stack to A2:F200. This is the simplest method and survives copying and sorting.

Option 2: build the label in the formula

HSTACK can attach a label column to each range as it is stacked:

=ARRAYFORMULA(VSTACK(HSTACK(Jan!A2:E200, IF(LEN(Jan!A2:A200), "Jan", )), HSTACK(Feb!A2:E200, IF(LEN(Feb!A2:A200), "Feb", ))))

ARRAYFORMULA makes the IF run on every row of its range rather than on one cell. The IF part returns the label only where the date cell is filled, so blank rows stay blank and the QUERY wrapper can still drop them. It is longer, but the monthly tabs stay untouched.

Either way, the label lets you build a pivot table or SUMIF by month from one list instead of visiting each tab.

Why does a combined statement list miss or double-count rows?

Most errors in a combined list come from the ranges, not the formula. A range that stops short misses rows, a range that includes the header or a totals row adds junk, and a month entered twice doubles its amounts. Checking counts and totals against the monthly tabs finds all of them.

The usual causes, and the fix for each:

  • Range too short. A2:E200 misses row 201 onward. Use open ranges like A2:E, which run to the bottom of the tab.
  • Headers included. A range starting at A1 puts "Date" in the middle of your list. Start at row 2.
  • Totals rows. A Total line at the bottom of a tab becomes a fake transaction. Delete it or keep totals on a separate tab.
  • New month left out. The formula only covers tabs named in it. Add each new tab when you create it.
  • Overlapping statements. Statements that share a few days at the edges repeat those transactions. Finding them is covered in removing duplicates in Google Sheets, which shows how to flag rather than delete.
  • Mixed types. Text amounts or text dates on one tab behave differently in QUERY and SUM. Clean them on the source tab.

Do not type into the All tab. The formula owns that area, and a value typed inside it stops the formula from spilling, so Sheets shows an error in place of the list.

When the monthly tabs live in separate spreadsheet files

Range references like Jan!A2:E only reach tabs in the same spreadsheet. To combine data held in separate files, bring each one in with IMPORTRANGE, then stack the results as before. The first use asks you to allow access between the two files.

A formula combining two files looks like this, with the file addresses shortened:

=QUERY(VSTACK(IMPORTRANGE("url-of-2025-file", "All!A2:F"), IMPORTRANGE("url-of-2026-file", "All!A2:F")), "select * where Col2 is not null", 0)

That works, but it has costs. Each import fetches data over the network, so a file built from many imports recalculates slowly and can show loading errors for a moment. Anyone who opens the combined file also sees whatever the imports pull in, which matters if the sources hold other clients' data.

Skip the cross-file approach when a one-off combination will do. Download each tab as CSV, paste them into one tab, and keep that as a fixed archive. Live formulas are worth the effort only when the monthly files keep changing.

New statements arrive more easily when every month already has the same columns. FastBankConvert, a converter that is getting ready to open, is built to give each statement the same date, description, amount and balance columns, so a new month drops into the stack. You can join through Get started to hear when it opens.

All posts in Google Sheets, Numbers and LibreOffice