JSON for Sheets · Google Sheets add-on

JSON for Sheets turns JSON into a clean Google Sheets table.

JSON for Sheets is a Google Sheets add-on that lets you paste JSON or connect an API, preview the fields and rows, and insert the result as structured spreadsheet columns. No script or product API key to configure.

250 requests / month free · No credit card
orders-june · Sheets
A2 =JSON_IMPORT("api.example.com/orders","$.data[*]")
A B C D E 1 id customer.name customer.email total tags 2 8842 Ana Ruiz ana@ruiz.co 148.50 rush, gift 3 8843 Ben Okafor ben@okafor.dev 92.00 refund 4 8844 Chi Nakamura chi@nkmr.jp 1204.75 wholesale 5 8845 Dara Whitlock dara@wtlk.io 318.20 rush 6 8846 Elias Berg elias@berg.se 64.00
{} JSON for Sheets
Paste URL cURL
Request
GET api.example.com/orders
Root path
$.data[*]
Fields · 247 items
idnum
▾ customer
namestr
emailstr
totalnum
tags [2]arr
raw_metadata
Nested arrays
rows join json
Will write 247 rows × 5 columns
Insert table
Fetches41 / 250

Why JSON for Sheets requests Google access

The add-on reads and writes only the spreadsheet you have open. Pasted JSON, formula parsing, and range-to-JSON export are processed inside the spreadsheet and never sent to us. Remote API imports go through our service so caching, quotas, and URL safety checks can be applied — those responses are cached for the TTL you choose and never logged in full.

Read the privacy policy →
Three steps

From an endpoint to columns you can pivot.

01

Point it at the data

Paste JSON, read it from a cell, enter a URL, or paste a cURL command. Bearer tokens, API keys, and basic auth are saved as encrypted connections.

02

Choose the shape

Browse the response as a tree, tick the fields you want, pick how nested arrays behave, and read the exact row and column count before anything is written.

03

Write it where you want

Overwrite the managed range, append rows, or update-or-append by a unique key. Refresh by hand, on a formula, or on a daily or hourly schedule.

Watch it run

Nothing to install to see how it works.

1 Endpoint
2 Fields
3 247 rows
orders-june · Sheets importing
A1 =JSON_IMPORT("https://api.example.com/orders","$.data[*]")
A B C D E 1 id customer.name customer.email total tags 2 8842 Ana Ruiz ana@ruiz.co 148.50 rush, gift 3 8843 Ben Okafor ben@okafor.dev 92.00 refund 4 8844 Chi Nakamura chi@nkmr.jp 1204.75 wholesale 5 8845 Dara Whitlock dara@wtlk.io 318.20 rush 6 8846 Elias Berg elias@berg.se 64.00 7 8847 Farid Haddad farid@haddad.ae 889.10 gift
{} JSON for Sheets
GET api.example.com/orders
Fields · 247 items
id
▾ customer
name
email
total
tags [2]
247 rows × 5 columns written
Insert table
Fetches41 / 250
The hard part

Nested arrays, decided by you.

Most importers guess what to do with an array inside a record, and you find out after it has written 4,000 rows. Pick the behaviour first and see the result in the preview. Source record: {"id":8842,"tags":["rush","gift"]}

array=rows

Repeat the parent row once per item. The preview warns you before it multiplies records.

id tags 8842 rush 8842 gift
array=join

One row per record, primitives joined with a delimiter you choose. Best for tags and labels.

id tags 8842 rush, gift
array=json

Keep the array intact as minified JSON in one cell, ready for JSON_VALUE() later.

id tags 8842 ["rush","gift"]
Both directions

JSON out, as well as in

Select a range with a header row and get an array of objects back — for a webhook body, a config file, or an API you are testing. Array, object, and row-array shapes, compact or pretty.

=TABLE_TO_JSON(A1:C3, "pretty=true")
[{ "sku": "AX-1", "qty": 12 }, …]
Free forever

The local toolbox is unmetered

Validating, formatting, querying, flattening, inspecting a schema, and converting between JSON and tables all run inside the spreadsheet. No sign-in, no request count, no data leaving the sheet.

JSON_VALUE JSON_QUERY JSON_TABLE JSON_FLATTEN JSON_SCHEMA JSON_KEYS JSON_VALID JSON_PRETTY TABLE_TO_JSON all 13 →
Common questions

The short version

Do I need an API key from you?

No. You supply the API you are calling, and its credentials if it needs them. There is nothing of ours to configure.

What counts as a request?

One upstream fetch that returns valid JSON. Failures, blocked URLs, cached reads, and every local function are free. See the exact rules →

Does my pasted JSON leave the sheet?

No. Paste, preview, formulas, and range-to-JSON export are processed in the spreadsheet. Only remote fetches reach our service.

Where do my tokens live?

In encrypted connections on our server, referenced by ID. Never in a cell, a formula argument, a saved request body, or a log.

Can imports refresh themselves?

Yes — daily on Starter, hourly on Pro, using a spreadsheet trigger you authorise. Manual refresh works on every plan.

Will it overwrite my other columns?

No. Each import tracks the range it manages, asks before touching data outside it, and never deletes rows on a refresh.

Ready when your sheet is

Try it on your next awkward endpoint.

250 requests a month, unlimited local functions, no card.

Join the beta Getting started