Skip to content

How do you publish a dashboard that reads a Google Sheet only the owner can edit?

Last updated 2026-08-24 · Confidence: documented — Google, GitHub, Vercel, and Netlify docs; the column-stability section is inferred and marked.

Host the single HTML file on any free static host and have it fetch the Sheet through one of Google’s read-only endpoints. The page can only read, so viewers never touch the data, and edits to the Sheet flow through without re-prompting the AI.

Four no-server ways the page can read the Sheet

Section titled “Four no-server ways the page can read the Sheet”
  • Publish to web — File → Share → Publish to the web publishes the whole spreadsheet or individual tabs; changes auto-republish, and the update “might take a few minutes”.
  • gviz endpointdocs.google.com/spreadsheets/d/{id}/gviz/tq returns JSON for a chosen tab or range (gid, sheet, range parameters), or CSV via tqx=out:csv. Works without credentials only when the sheet is shared “anyone with the link can view”; private sheets need OAuth.
  • opensheet — free hosted Sheet-to-JSON proxy; needs the same anyone-with-link sharing; responses cache for 30 seconds.
  • Apps Script web app — a doGet deployed to run as the owner serves JSON to anonymous visitors while the sheet itself stays private.

The same sheet can also feed an agent directly — see Feeding spreadsheets; AI output lands back in it via Writing to Docs.

Viewers can’t edit; anyone with the URL can read

Section titled “Viewers can’t edit; anyone with the URL can read”

Every endpoint above is read-only, and Google shows published files as a version viewers can’t edit. The trade: the published or link-shared URL is unguessable but unauthenticated — Google’s warning is “Be careful when publishing private or sensitive info”, and stopping access means stopping publishing. Sharing the page through the AI product’s own publisher has its own audience limits — see AI page publishing.

Renaming or reordering columns breaks the wiring

Section titled “Renaming or reordering columns breaks the wiring”

opensheet keys JSON by the header row and gviz addresses fixed ranges, so page code that reads named columns stops matching after a header change; adding rows is safe.