Google Sheets lacks a native QR feature, and no menu item generates one, which usually isn't the real obstacle since most people need a code for every row of a list rather than one made by hand. Some spreadsheets work around this with a formula that pulls a QR image from a third-party chart API into a cell, which works only as long as that outside service stays online.
A more durable approach treats the sheet as a data source: export the relevant column as CSV and run it through a generator built to read a list and hand back one code per row, rather than relying on a live formula that could break without warning.
Getting a code for every row in a Sheet
Build a column of full links
If the sheet only has IDs or names, add a formula column that concatenates a base URL with each row's value, so every entry is a working link before export.
Export as CSV
File > Download > Comma-separated values (.csv) exports the current sheet in the plain format a bulk generator expects.
Run the file through a bulk QR generator
Upload the CSV; each row becomes its own static code, checked by decoding it before it's added to the output, up to 1,000 rows per batch.
Match the downloaded files back to the sheet
Codes are typically named from the row's own data, which keeps a folder of results sortable against the original spreadsheet for printing or mail merge.
The IMAGE-formula workaround, and its real limits
A formula that builds a URL to a chart-rendering API and wraps it in Sheets' IMAGE function can display something that looks like a QR code directly in a cell. It has no control over error correction, no logo support, and stops working the moment the external service it depends on changes its API or shuts down — which has happened before to formulas built the same way for chart images.
Why an exported CSV is the more durable path
Treating the spreadsheet as a data source rather than a rendering surface separates the two jobs: Sheets manages the list, and a dedicated generator makes the codes, decodes each one to confirm it scans, and packages the result — none of which depends on an external service staying online indefinitely.
What each row's code contains
A completed link in a row is encoded exactly as written. A row with only a name or ID needs a formula column to build the full URL first, since a bare identifier isn't something a scanner's browser can open.
https://example.com/rsvp/482Printing codes generated from a sheet
A code destined for a badge, ticket or shelf label needs at least 20 mm on a side for a close scan, following the same rule as any printed code: scanning distance runs about ten times the code's width.
Print it at least 20 mm (2.0 cm) wide
Where spreadsheet-driven codes fail
Relying on a chart-API formula for production use
It's fine for a quick preview, but a workflow that prints hundreds of labels shouldn't depend on an outside service's image endpoint staying unchanged.
Encoding an ID instead of a completed URL
A bare row value like "482" opens nothing on scan without being part of a full link built ahead of export.
Not checking for duplicate or blank rows before export
A blank cell exported into the batch produces a code with no meaningful destination — worth filtering the sheet before running the batch.
Batch-generated codes are static by design
Codes generated from a spreadsheet row are static, which fits records that shouldn't change identity later, like a numbered ticket or asset tag. A row that genuinely needs a repointable destination should be made as an individual dynamic code outside the batch.
How dynamic QR codes workSheets-driven jobs this suits
- An RSVP list turned into a personal check-in code per guest.
- A shared inventory sheet where each SKU gets a code to its listing.
- A volunteer sign-up sheet exported into badge codes for an event.
- A property list turned into a code per listing for printed flyers.