Skip to content
RowDocs

How to merge multiple Google Sheets into one

Several spreadsheets into one — either stacked into a single table, or with every original tab preserved.

Two different jobs share this query, and Sheets is much better at one than the other. Stacking rows from several files into one table is well supported. Keeping every source tab as its own tab is the one people actually get stuck on.

IMPORTRANGE, QUERY, and copying tabs

Ten minutes for a live stack; per-tab manual work for the rest

  1. 1

    IMPORTRANGE to pull data across files

    =IMPORTRANGE("<spreadsheet-url>", "Sheet1!A:Z") pulls another file's range in. The first use of each source shows a #REF! with an Allow access prompt — you have to click it once per source file before anything appears.

  2. 2

    Stack several with braces

    ={IMPORTRANGE(url1,"A2:Z"); IMPORTRANGE(url2,"A2:Z")} stacks them vertically. Start at row 2 in each so you do not repeat the header, and note the semicolon — a comma would place them side by side instead.

  3. 3

    Wrap in QUERY to tidy the result

    =QUERY({...}, "select * where Col1 is not null", 0) removes the blank rows that trailing empty ranges pull in, which is what makes the raw stack look broken.

  4. 4

    For separate tabs, copy them by hand

    Right-click a tab → Copy to → Existing spreadsheet, then pick the destination. One dialog per tab, per source file.

Where it breaks

  • IMPORTRANGE is a live link, not a merge. The combined view breaks the moment a source file is renamed, moved, or has its sharing changed — and it recalculates on a schedule you do not control, so large stacks show Loading… for noticeable stretches.
  • It also requires the sources to line up. Different column orders between files produce a silently misaligned stack rather than an error, because the formula is matching positions, not headers.
  • The Copy to route is the only one that preserves tabs, and it cannot be batched — it is one menu, one dialog, per tab. This is the exact chore the query is usually asking to avoid.
  • IMPORTRANGE has cell limits and slows down markedly on large ranges, so the technique that works for three sheets of a thousand rows is not the technique for thirty.

Or do it here, in two clicks more

This runs in your browser, so it reads a downloaded file rather than connecting to your Google account — no Drive access, no consent screen, no signup. The export is the only extra step:

  1. 1Download each spreadsheet you want to merge: File → Download → .csv for a single tab, or .xlsx to bring all its tabs.
  2. 2Drop them all in below at once.
  3. 3Run it. You get one real .xlsx — one tab per source file, or unioned into a single sheet, whichever you pick.

Runs entirely in your browser · No upload · No signup · Open the network tab and check

Questions

Which route keeps my tabs?

In Sheets, only Copy to — one tab at a time. IMPORTRANGE and QUERY both flatten everything into one range by design. The tool below preserves one tab per source file in a single run, which is the gap that makes this query hard to answer with Sheets alone.

Will the merged file stay in sync with the originals?

No — and this is the real trade-off. IMPORTRANGE stays live; a downloaded merge is a snapshot. If you need a permanently updating dashboard, IMPORTRANGE is genuinely the right answer and you should use it. If you need one file to send someone, a snapshot is what you actually want.

What if the files have different columns?

Then one tab per file is the safer choice, because a union would either misalign or leave gaps. The IMPORTRANGE stack handles this worst of all: it matches by position, so mismatched files are combined incorrectly without any warning.

Working in Excel instead?

Merge CSV to Excel covers the same job from an .xlsx or .csv file, with the Excel methods — Power Query, VBA and the rest — written out in full.