Google Sheets image generation with jsontoimg is a button, not a background job. You select rows, click Render selected, and each row becomes a signed image URL written back into the sheet. Knowing that up front prevents the most common misunderstanding about it.
How it works
The add-on is an Apps Script project you install with clasp. You map header columns to named layers, choose a template and format, and pick where results go. For each selected row it mints POST /api/v1/img/sign, warms the signed GET /api/v1/img/{template} URL, and writes that URL to a URL column. For PNG, JPG, WebP, and AVIF it also inserts the image into the cell with SpreadsheetApp.newCellImage.
Set up
- Create an API key under Integrations, then API keys.
- In the sidebar open Settings, paste the key, and click Test connection. Leave Base URL blank for the hosted service.
- Pick the header row, template, and format.
- Map each layer to a column. Text layers stringify the cell; image layers take an
httporhttpsURL. - Choose a URL column, an image column, or both.
The key is stored in UserProperties for your Google account, and the mapping lives in DocumentProperties on the spreadsheet. Use a dedicated key you can revoke.
Limits to plan around
- 50 selected rows per run. The header row is skipped. A 500-row sheet is ten runs.
- Button-driven. It does not run when a cell changes. For edit-driven or scheduled work, use n8n or an HTTP step.
- In-cell images are raster only. PDF returns a URL, not a picture in the cell.
- First fetch bills a credit. Re-running a row with identical values is a cache hit; changing a value renders again.
If the first render is still running, the signed URL responds 503, and the add-on retries for you.
A sheet layout that works
| name | course | photo_url | image_url (result) |
|---|---|---|---|
| Ada Lovelace | JSON renders | https://example.com/ada.jpg | written back |
Keep one row per output file and one column per changing layer. Anything constant stays in the template, not a column.
Where it fits
For a one-off cohort or a catalog refresh that a person triggers, this is the shortest route. For recurring automation, use the pattern in the Image Automation API guide. Apps Script itself is documented at developers.google.com/apps-script.
FAQ
How do I generate images from Google Sheets?
Install the jsontoimg Apps Script add-on, map columns to template layers, select up to 50 rows, and click Render selected. Each row’s signed image URL is written back to the sheet.
Does the Sheets add-on run automatically on edit?
No. It is button-driven and renders only the rows you select. For edit-driven automation, use n8n or an HTTP step.
Can I render more than 50 rows?
Run it again on the next 50. The cap is 50 selected rows per run, so a 500-row sheet takes ten runs.
Can the sheet show PDFs as in-cell images?
No. In-cell images work for PNG, JPG, WebP, and AVIF only. PDF output is written as a URL.
Related Resources
- How JSON-to-image conversion works — the pillar guide
- Image automation API guide — choose a trigger
- Google Sheets docs — install steps
- Certificates use case — a typical sheet-driven job