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, open a local .json file, read JSON from a cell, or make a public or authenticated API request, preview the fields and rows, and insert the result as structured spreadsheet columns. No script or Codeprint API key to configure.

5 external fetches / day free · No credit card
orders-june · Sheets
A2 Public URL · $.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 URL
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
Today's fetches3 / 5

Why JSON for Sheets requests Google access

During interactive use, the add-on reads and writes the Google Sheets file you have open. If you explicitly enable a refresh schedule, it can reopen only the spreadsheet where you saved that import. Pasted JSON, local .json files, formula parsing, and range-to-JSON export stay inside the Google add-on session and are never sent to Codeprint. Remote API imports go through our service so quotas and URL safety checks can be applied. Each preview fetches the source again; response bodies are processed in memory and are not retained in a response cache or 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, open a local .json file, read it from a cell, enter a public URL, or build an authenticated GET, POST, PUT, PATCH, or DELETE request. Remote requests run only from the sidebar or an authorized saved schedule.

02

Choose the shape

Filter and select 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. Saved remote imports refresh manually on Free or automatically on paid plans.

Watch it run

Nothing to install to see how it works.

1 Endpoint
2 Fields
3 247 rows
orders-june · Sheets importing
A1 Public URL preview · $.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
Today's fetches3 / 5
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 12 local functions →
Common questions

The short version

Do I need an API key from you?

No Codeprint API key is required. If the upstream API needs a token, API key, or Basic credentials, save it as an encrypted connection.

What counts as a request?

One fresh upstream fetch that returns valid JSON. Failures, blocked URLs, local files, and every local function are free. Free includes five successful fetches per UTC day; paid allowances reset monthly. See the exact rules →

Do pasted JSON or local files leave the sheet?

No. Pasted JSON, local-file JSON, their local previews, formulas, and range-to-JSON export stay inside the Google add-on session. Remote URL previews and imports pass through our service.

Where do my tokens live?

Saved credentials are encrypted in Supabase Vault. The add-on sees only masked connection details; the secret is resolved server-to-server for the request.

Can imports refresh themselves?

Yes. Save a remote import after writing it. Starter supports daily and weekly schedules; Pro also supports hourly schedules. Free saved imports can be run manually.

Will it overwrite my other columns?

Each import tracks the range it manages and asks before touching existing data outside it. Overwrite replaces and clears stale cells only inside that managed range; upsert preserves managed rows missing from the latest response.

Ready when your sheet is

Try it on your next awkward endpoint.

Five external fetches every day, unlimited local tools, no card.

Request beta access Getting started