Public Google Sheet to JSON - Read Any Shared Sheet, No Login
Pricing
from $3.00 / 1,000 row returneds
Public Google Sheet to JSON - Read Any Shared Sheet, No Login
Paste the link of any publicly shared Google Sheet and get one typed JSON row per sheet row: numbers, booleans, ISO dates, clean column keys. Optional tab and SQL-like query. Read-only and public-only: no login, no OAuth, no API key, and private sheets are never touched.
Pricing
from $3.00 / 1,000 row returneds
Rating
0.0
(0)
Developer
Kobkoon Janngam
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
20 minutes ago
Last modified
Categories
Security
Limited permissionsShare
Public Google Sheet to JSON — read any shared sheet, no login
Paste the link of a publicly shared Google Sheet and get one typed JSON row per sheet row. No Google account, no OAuth, no API key. For developers, analysts, no-code builders and AI agents that were handed a sheet link and just need the data.
Quick start: press Start with no configuration. It reads a public sample sheet and returns 30 rows. Then paste your own link into sheets. The sheet must be shared as "Anyone with the link can view".
Sample output
| student_name | gender | class_level | home_state | major | extracurricular_activity | _rowNumber |
|---|---|---|---|---|---|---|
| Alexandra | Female | 4. Senior | CA | English | Drama Club | 1 |
| Andrew | Male | 1. Freshman | SD | Math | Lacrosse | 2 |
| Anna | Female | 1. Freshman | NC | English | Basketball | 3 |
| Becky | Female | 2. Sophomore | SD | Art | Baseball | 4 |
These rows come from a real run on 8 November 2026 against the Google Sheets API sample sheet, whose names are fictional sample data.
The columns are yours: every key comes from your sheet's own header, so Home State becomes home_state. Every row also carries _sheetId, _sheetName, _rowNumber and _truncatedColumns. The SUMMARY record lists each sheet's columns with their original labels and types.
What you get
- Typed values. Numbers stay numbers, booleans stay booleans, dates become ISO (
2024-01-15, or2024-01-15T09:30:00with a time, in the sheet's own time zone). A number formatted with leading zeros, such as00123, is returned as that text, because that is what the cell means. - Clean keys. Header names are sanitised and de-duplicated. A blank header becomes
column_C. The empty columns out to the edge of the grid are dropped. - Rows an AI agent can hold. A row stays under 4 KB. A longer cell is cut and named in
_truncatedColumns. A sheet too wide to fit keeps its left columns; the log andSUMMARYname the ones left out, andquerycan select the ones you need.
Input
| Field | Default | Notes |
|---|---|---|
sheets | a public sample sheet | The link from your browser, with or without #gid=, or a bare sheet ID. A bad entry is skipped with its reason; the others still run. |
sheetName | empty | The name on the tab. Empty means the tab in the link, or the first tab. |
query | empty | Google's Query Language, with column letters: select A, E where E = 'Art'. |
maxRows | 100 | Across the whole run, up to 50,000. |
firstRowIsHeader | true | Off: every row is data and keys are column_A, column_B. |
Public and read-only, and what that means
This Actor reads only sheets their owner chose to share publicly. It sends no login, cookie or token of any kind. A private sheet answers with a redirect to Google's sign-in page; the Actor stops there, does not follow it, charges nothing and tells you: "This sheet is not shared publicly; ask its owner to set 'Anyone with the link can view'".
It never writes. It cannot add rows, change cells or create sheets. If you need to read private sheets or write to a sheet, you need a tool that signs in to your Google account through OAuth, which this one deliberately does not do. In exchange, there is nothing to set up, and no permission over your Google account to grant.
A public sheet can still contain personal data. This Actor adds no enrichment and looks nothing up, but you are responsible for what you read and how you use it, including under data protection law and the sheet owner's terms. Do not assume that a shared sheet is free to republish.
Traps worth knowing
- A wrong tab name does not fail. Google serves the first tab when a tab name or gid does not exist. The answer does not name its tab, so the Actor compares it with the first tab and warns in the log, and sets
sameDataAsFirstTabinSUMMARY, when they are identical. That is correct when you did name the first tab. - Mixed columns lose values. Google gives a column one type, the majority one, and treats the minority as null. A mostly numeric column with a few text notes returns null for those notes. This is how the source behaves, and no client can recover them.
_rowNumberis a position in the answer, 1 being the first data row. With aqueryit is the position in the query's result, not the row in the sheet.- "Publish to the web" links (
/spreadsheets/d/e/2PACX-...) are not served by this endpoint, and the Actor says so. Use the sheet's normal link.
Empty results and errors
A query that matches nothing, or a sheet with no data, succeeds with an empty dataset and says so in the log. A bad query fails with Google's reason in plain words. If several sheets are listed, one failure does not stop the others; the run only fails when nothing could be read. SUMMARY lists every skipped entry and failed sheet with its reason.
How it works
The Actor calls Google's documented Visualization API query endpoint, /spreadsheets/d/<ID>/gviz/tq, and reads its JSON response format. It checks docs.google.com/robots.txt at the start of each run, keeps the Crawl-delay of one second it asks for, and identifies itself with a truthful User-Agent.
Pricing
You pay per row returned: $3 per 1,000 rows. Blank rows and sheets that could not be read cost nothing. The run respects your spending limit.
Disclaimer
This is an unofficial tool, not affiliated with or endorsed by Google. Google Sheets is a trademark of Google LLC. The data belongs to whoever owns each sheet, and you are responsible for your use of it.