How to save a Google Sheet as CSV (every tab, UTF-8 fix)
Download a Google Sheet as CSV, export any single tab straight from a URL, fix Excel's broken characters, and automate the export on a schedule.
The short answer
File → Download → Comma-separated values (.csv)
That is the whole thing for a one-off export. But there are four details that trip almost everyone up, and they are the reason this page exists: CSV exports only the active tab, it strips your formulas, Excel mangles the encoding, and there is no built-in way to do it on a schedule. Each is covered below.
Step 1: Open the tab you want to export
This is the step people skip, and it causes the single most common complaint about Google Sheets CSV export.
CSV is a single-table format. It has no syntax for "sheet 2". So when Google exports CSV, it exports the tab you are currently looking at and nothing else. If your workbook has Orders, Customers and Products tabs and you were sitting on Orders, you get Orders - silently, with no warning that the other two were left out.
Click the tab you actually want at the bottom of the window first.
Step 2: Choose File then Download
Open the File menu in the top-left toolbar and hover Download. You will see the full list of export formats: .xlsx, .ods, .pdf, .html, .csv and .tsv.
Step 3: Select Comma-separated values (.csv)
Click Comma-separated values (.csv, current sheet). Note that Google labels it "current sheet" right there in the menu - that is your reminder about the one-tab limit.
The download starts immediately. The file lands in your browser's download folder named SpreadsheetName - TabName.csv.
Step 4: Repeat for each additional tab
If you need every tab, you have three options:
Download each tab individually. Switch tabs, repeat the export. Fine for two or three tabs, tedious beyond that.
Export as .xlsx instead. One file, every tab preserved, opens in Excel, LibreOffice and Numbers. If the reason you wanted CSV was just "a file I can open in Excel", this is strictly the better choice.
Use the export URL per tab. Faster than clicking through the menu, and scriptable. That is next.
Exporting a specific tab straight from a URL
Every Google Sheet exposes an export endpoint. Take your normal spreadsheet URL:
https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=123456789
Replace everything from /edit onward:
https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/export?format=csv&gid=123456789
Opening that URL downloads that specific tab as CSV. To find a tab's gid, click the tab and read the #gid= value at the end of the address bar. The first tab is usually gid=0.
This works with curl too, as long as the sheet is shared publicly ("Anyone with the link"):
curl -L -o orders.csv \
"https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/export?format=csv&gid=0"The -L matters - Google issues a redirect before serving the file, and without it you will save the redirect body instead of your data.
For a private sheet this returns a Google sign-in page rather than CSV, because there is no credential in the request. That is the limitation that pushes people toward a real API, covered below.
Fixing broken characters in Excel
Google exports CSV as UTF-8. This is correct. Excel on Windows, when you double-click a .csv file, assumes the legacy ANSI codepage instead. The result is José becoming José and every non-English name in your data looking corrupted.
The data is fine. Excel is reading it wrong. Fix it on import:
- In Excel, go to Data → From Text/CSV.
- Pick your file.
- Set File Origin to 65001: Unicode (UTF-8).
- Click Load.
Characters render correctly. Google Sheets, LibreOffice, Numbers and every programming language read the original file correctly without any of this - it is an Excel-specific quirk.
What CSV throws away
CSV holds computed values as plain text. Everything else is discarded:
- Formulas. A cell containing
=SUM(B2:B50)exports as1284, not the formula. - All formatting. Colours, fonts, borders, number formats, conditional formatting.
- Structure. Merged cells get flattened, frozen rows are just rows.
- Extras. Charts, images, notes, comments, data validation rules, filter views.
If you need any of that, export .xlsx. Use CSV when the destination is a database import, a script, or a tool that wants raw tabular data - which is what it is good at.
Also worth knowing: dates export in whatever display format the sheet was using. If your sheet shows 26/07/2026 and the system you are importing into expects 2026-07-26, you will get parse errors. Set the column to an ISO format in Sheets before exporting, or normalise it on the import side.
Automating the export
There is no built-in scheduled CSV export in Google Sheets. Two approaches actually work.
Apps Script on a timer
Fetch the export URL from inside Apps Script, where the script's own credentials handle auth, and save the result to Drive:
function exportTabAsCsv() {
const id = "SPREADSHEET_ID";
const gid = 0;
const url = `https://docs.google.com/spreadsheets/d/${id}/export?format=csv&gid=${gid}`;
const csv = UrlFetchApp.fetch(url, {
headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
}).getContentText();
DriveApp.createFile(`export-${new Date().toISOString().slice(0, 10)}.csv`, csv);
}Then add a time-based trigger under Triggers in the Apps Script editor to run it daily. The Authorization header is the part that makes this work on a private sheet, unlike the plain curl version.
A REST endpoint that returns CSV
If the export needs to run from your own infrastructure - a cron job, a CI pipeline, a backend service - you want an authenticated HTTP endpoint rather than screen-scraping the Google export URL.
GKit SheetsAPI exposes any sheet as REST and takes a format parameter:
curl "https://api.gkit.mreshank.com/api/spreadsheets/{userKey}/Orders?format=csv" \
-H "Authorization: Bearer $API_KEY" \
-o orders.csvThe response comes back as text/csv with your header row first, and because it is a normal authenticated API call, it works on private sheets from any environment without OAuth flows in your script. You can also filter before exporting - ?where=status:Active gets you just the rows you need instead of the whole tab. Full details in Export Google Sheets data as CSV via API and the output formats reference.
It is free while in beta.
Quick reference
| Task | How |
|---|---|
| One-off export, current tab | File → Download → Comma-separated values (.csv) |
| Specific tab by URL | /export?format=csv&gid=TAB_ID |
| Every tab in one file | File → Download → Microsoft Excel (.xlsx) |
| Fix Excel character mangling | Data → From Text/CSV → File Origin: UTF-8 |
| Keep formulas and formatting | Export .xlsx, not CSV |
| Scheduled export, private sheet | Apps Script + time trigger, or an authenticated REST API |
| Export only matching rows | API with a filter parameter |
Frequently asked questions
Why does my Google Sheets CSV only contain one tab?
CSV is a single-table format with no concept of multiple sheets, so Google exports only the currently active tab. To get every tab you must download each one separately, or export the workbook as .xlsx or .zip instead.
How do I export a specific tab of a Google Sheet as CSV by URL?
Replace everything from /edit onward in the spreadsheet URL with /export?format=csv&gid=TAB_ID, where TAB_ID is the gid value shown in the address bar when that tab is selected. Opening that URL downloads just that tab as CSV.
Why are accented or non-English characters broken when I open the CSV in Excel?
Google exports UTF-8, but Excel on Windows assumes the legacy ANSI encoding when you double-click a .csv file. Import it instead through Data then From Text/CSV and set the file origin to UTF-8, and the characters render correctly.
Does exporting to CSV keep my formulas and formatting?
No. CSV stores only the computed cell values as plain text. Formulas, colours, fonts, merged cells, conditional formatting, charts, notes and data validation are all dropped. Export as .xlsx if you need any of that preserved.
Can I automatically export a Google Sheet to CSV on a schedule?
Yes. Either write an Apps Script that fetches the export URL and runs on a time-based trigger, or call a REST API that returns the sheet as CSV from whatever scheduler you already use, such as cron or a CI job.