Google Sheets to JSON & CSV - Public Sheet & Excel URL Reader
Pricing
$0.10 / 1,000 row exporteds
Google Sheets to JSON & CSV - Public Sheet & Excel URL Reader
Turn any public Google Sheet, Excel, ODS or CSV URL into clean JSON rows, CSV and an API. All tabs, typed values, header detection. No Google login, OAuth or API key. $0.10 per 1,000 rows.
Pricing
$0.10 / 1,000 row exporteds
Rating
0.0
(0)
Developer
Wood Between Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Features
Share
Google Sheets to JSON & CSV: Public Sheet & Excel URL Reader
Turn any public Google Sheet, Excel (.xlsx/.xls), OpenDocument (.ods) or CSV link into clean JSON rows, CSV files and an API endpoint. No Google login, no OAuth, no service account and no API key. Paste the link and run.
Why use it?
- Zero setup. Most Google Sheets tools need you to authorize a Google account first, and that is where they fail. This one reads any sheet shared as Anyone with the link or Published to the web, so there is nothing to connect.
- Every tab or just one. Read all worksheets, pick tabs by name, or paste a link with
#gid=to read only that tab. - Typed values. Numbers stay numbers, checkboxes become booleans and dates become ISO strings. Or choose formatted to get exactly what you see in the sheet.
- Smart headers. Pick the header row, rename duplicates automatically, and optionally convert names to
snake_case. - Files and API. Each tab is also saved as a CSV and a JSON file with direct download links. Schedule the Actor to keep a JSON API in sync with a spreadsheet your team edits.
- Works with more than Google. Direct
.xlsx,.xls,.odsand.csvURLs, Google Drive file links, Dropbox and OneDrive share links. - Clear errors. A private sheet gets a plain-English fix ("share it as Anyone with the link"), not a stack trace. Failed files are never charged.
Use cases
- Use a Google Sheet as a lightweight CMS or database for a website, app or no-code tool
- Feed spreadsheet data into Make, Zapier, n8n or your own code through the Apify API
- Merge many public spreadsheets (price lists, directories, open data) into one dataset
- Convert Excel files on the web to JSON or CSV in bulk
Input
| Field | Default | Notes |
|---|---|---|
spreadsheetUrls | (required) | Google Sheets links or IDs, or direct spreadsheet file URLs |
tabs | all | Tab names to read |
allTabs | false | Read every tab even if the link has #gid= |
headerRow | 1 | 0 = no header (columns become A, B, C...) |
valueMode | typed | typed or formatted |
skipEmptyRows | true | |
normalizeHeaders | false | Student Name becomes student_name |
outputMode | rows | rows = one item per row, tabs = one item per tab |
saveFiles | true | CSV + JSON per tab in the key-value store |
{ "spreadsheetUrls": ["https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit"], "normalizeHeaders": true }
Output
One item per row (default):
{ "student_name": "Alexandra", "gender": "Female", "class_level": "4. Senior", "home_state": "CA", "major": "English","extracurricular_activity": "Drama Club", "_tab": "Class Data", "_row": 2, "_spreadsheet": "https://docs.google.com/..." }
The SUMMARY record lists every spreadsheet and tab with column names, row counts and CSV/JSON download links.
How do I make my sheet readable?
In Google Sheets click Share > General access > Anyone with the link (Viewer), or File > Share > Publish to web. Nothing else is needed.
Pricing
$0.10 per 1,000 rows ($0.0001 per row). Platform usage is included. Failed or private files are free. Set a maximum charge per run for a hard cap.
Limits
- Read-only: it does not write back to Google Sheets.
- Formulas are returned as their calculated values.
- Private sheets can't be read. That is by design: no Google account access is ever requested.
- Files up to 200 MB.
Responsible use
Only read spreadsheets you have the right to use. The Actor never bypasses sharing settings or logins.
Support
Need write-back, filters or a different format? Open an issue on the Issues tab. We read every one.
Call it from curl, JavaScript or Python
You can run this Actor in the Apify Console with no code, or call it as an API from curl, JavaScript or Python. Replace YOUR_TOKEN with an Apify API token.
curl
curl "https://api.apify.com/v2/acts/wood-between-studio~google-sheets-reader/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"spreadsheetUrls": ["https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit"], "normalizeHeaders": true}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('wood-between-studio/google-sheets-reader').call({"spreadsheetUrls": ["https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit"],"normalizeHeaders": true});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("wood-between-studio/google-sheets-reader").call(run_input={"spreadsheetUrls": ["https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit"],"normalizeHeaders": true})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
You can also schedule the Actor, cap the spend per run, and send the dataset to Google Sheets, Slack or a webhook from the Console. Store page: apify.com/wood-between-studio/google-sheets-reader.