How to convert json to csv for google sheets import
- Step 1Drop your JSON file — Drag a
.json,.ndjson,.jsonl, or.txtfile onto the converter above. Conversion is local; free files cap at 2 MB. - Step 2Keep flattening on and pick array handling — Flatten nested objects (default) gives dot-notation columns Sheets can sort and filter. Set Array values to Comma joined for human-readable list cells, or JSON literal to keep them re-parseable.
- Step 3Choose Comma for Import, or Tab for paste — Leave the delimiter on Comma if you will use File → Import → Upload. Switch to Tab if you plan to copy the output and paste it directly into a sheet — TSV pastes into separate cells automatically.
- Step 4Convert to CSV — Click Convert to CSV and check the preview. Records in / Rows out should match the number of objects you expect; Columns shows how wide the sheet will be.
- Step 5Import into Google Sheets — In Sheets: File → Import → Upload → select the CSV → choose Separator type 'Comma' (or 'Detect automatically') and Character set UTF-8 → Import data. Pick 'Replace spreadsheet' or 'Insert new sheet' as needed.
- Step 6Or paste the TSV directly — If you chose Tab, copy the converted output and paste into cell A1 of a sheet. Sheets places each tab-separated value in its own column with no extra step.
Two ways into Google Sheets
Match the delimiter to how you will get the data into Sheets.
| Method | Delimiter to choose | Steps in Sheets |
|---|---|---|
| File → Import → Upload | Comma (default) | Upload the CSV, set separator to Comma, character set UTF-8 |
| Copy and paste into grid | Tab | Paste into A1 — each value lands in its own cell automatically |
| IMPORTDATA from a hosted file | Comma | Host the CSV at a URL, then =IMPORTDATA("url") (outside this tool) |
Converter settings for Sheets
The controls that matter for a clean Google Sheets import.
| Setting | Recommended | Why |
|---|---|---|
| Flatten nested objects | On | Nested data becomes sortable, filterable dot-notation columns |
| Array values | Comma joined | Readable list cells (a, b) instead of JSON literals |
| Delimiter | Comma for import, Tab for paste | Matches how Sheets ingests the data |
| Include header row | On | Gives the sheet column titles you can freeze and filter |
Cookbook
Recipes for getting JSON into Google Sheets cleanly. Sample data anonymised.
Standard import via File → Import
ExampleComma-delimited CSV with dot-notation headers imports into named columns Sheets can sort and filter.
Input:
[
{ "name": "Ada", "address": { "city": "NYC" } },
{ "name": "Grace", "address": { "city": "LA" } }
]
Output CSV (Comma):
name,address.city
Ada,NYC
Grace,LA
Sheets: File → Import → Upload → Comma → UTF-8 → Import.Tab-delimited for direct paste
ExampleChoosing Tab outputs TSV; pasting it into A1 splits values across columns with no extra step.
Input:
[ { "name": "Ada", "role": "admin" } ]
Delimiter = Tab → output (→ = tab):
name→role
Ada→admin
Paste into A1: name in A1, role in B1, Ada in A2, admin in B2.International names without mojibake
ExampleUTF-8 output preserves accented characters; import with the UTF-8 character set so Sheets renders them correctly.
Input:
[ { "name": "José" }, { "name": "Müller" } ]
Output CSV:
name
José
Müller
Sheets import → Character set: UTF-8 → names render correctly.Array as a readable cell
ExampleComma-joined arrays read naturally in a Sheets cell rather than appearing as a JSON literal.
Input:
[ { "name": "Ada", "tags": ["vip", "eu"] } ]
Array values = Comma joined:
name,tags
Ada,"vip, eu"Records with differing fields
ExampleUnion-of-keys headers keep the grid consistent so Sheets shows aligned columns.
Input:
[
{ "name": "Ada", "city": "NYC" },
{ "name": "Grace" }
]
Output CSV:
name,city
Ada,NYC
Grace,Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
Whole CSV lands in column A on import
SupportedIf Sheets puts everything in column A, the separator was misdetected. Re-import and set Separator type explicitly to Comma (or use Tab output and paste). The CSV itself is correct.
Accented names show as é in Sheets
SupportedSet Character set to UTF-8 in the Sheets import dialog. The converter outputs UTF-8; the mojibake comes from Sheets guessing the wrong encoding.
A long ID becomes 6.63E+15 in Sheets
ExpectedSheets auto-converts long numbers to scientific notation. The CSV value is exact — after import, format the column as Plain text, or prefix the value, to keep the full digits visible.
Dates reformatted by Sheets locale
ExpectedSheets reinterprets date-looking strings per your locale. The CSV stores the original string; change the cell format or the spreadsheet locale if the display differs from the source.
Array of objects in one cell
Not expandedAn array of objects stays as a JSON literal in one cell — Sheets will not split it. Extract that array path first with json-path-extractor and convert it for a row-per-object layout.
File over the free 2 MB limit
BlockedFree conversions cap at 2 MB / 500 rows. Sheets also has its own cell limit per spreadsheet — for very large datasets, upgrade to Pro and consider splitting into multiple sheets.
Invalid JSON
Invalid JSONA syntax error stops conversion with an Invalid JSON message. Repair the source with json-format-fixer or validate it with json-validator first.
Header row imported as data
SupportedKeep Include header row on (the default) so your first row holds column titles. If you accidentally turned it off, the first record's values become headers — re-convert with it on.
Frequently asked questions
Why can't I import JSON directly into Google Sheets?
Sheets' File → Import only accepts CSV/TSV/XLSX and similar tabular formats, not JSON. Converting to CSV first lets Sheets split the data into real columns.
Should I use Comma or Tab output?
Comma for File → Import → Upload. Tab if you want to copy the output and paste straight into the grid — TSV pastes into separate cells automatically with no Split-text step.
How do I avoid garbled accented characters?
In the Sheets import dialog, set Character set to UTF-8. The converter always outputs UTF-8, so the only cause of mojibake is Sheets guessing the wrong encoding.
Why did my long ID turn into scientific notation?
Sheets auto-formats long numbers as 6.63E+15. The CSV value is intact — format the column as Plain text after import, or store the ID with a leading apostrophe.
Do nested fields become separate columns?
Yes, with Flatten nested objects on (default). address.city becomes its own dot-notation column that Sheets can sort and filter.
How are arrays handled?
Each array goes into one cell. Use Comma joined for readable list text, or JSON literal to keep it machine-readable. Arrays of objects are not split into rows.
Is my data uploaded before it reaches Google?
No. Conversion runs entirely in your browser. The CSV is produced locally; you then upload it to your own Google account.
What is the size limit?
Free: 2 MB / 500 rows. Pro: 100 MB / 100,000 rows. Note Sheets itself caps cells per spreadsheet, so very large imports may need splitting.
Can I keep the header row?
Yes — Include header row is on by default, giving your sheet column titles you can freeze and filter. Turn it off only if you are appending under an existing header.
What about IMPORTDATA?
If you host the converted CSV at a public URL, =IMPORTDATA("url") pulls it into a sheet. Hosting the file is outside this tool, but the CSV it produces works with that formula.
I have NDJSON, not a JSON array. Will it work?
Yes. Auto detect falls back to NDJSON, or force the NDJSON / JSONL input format. See ndjson-to-csv recipes for line-delimited specifics.
How do I get CSV from Sheets back into JSON?
Export the sheet as CSV (File → Download → CSV) and run it through csv-to-json.
Privacy first
Conversion runs locally in your browser. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.