How to make a QR code in Google Sheets
SmartQRCode editorial · Updated October 2026
How to make a QR code in Google Sheets means placing a real export over the grid, not photographing it. Download PNG from SmartQRCode, then Insert Image Over Cells. A cell screenshot failure includes gridlines and chrome. Fit to width print then shrinks whatever survived. Frozen headers can reprint on top of a finder.
How to make a QR code in Google Sheets without IMAGE formulas pretending to be a generator
Sheets will let you drop a URL into IMAGE() and hope the function draws a scannable mark. That path depends on a third-party chart URL, a pixel size you do not control, and a print pipeline that resamples. Generate the pattern in SmartQRCode. A website QR code is the usual station-link job. A Google Form QR belongs on a roster when the form will be replaced. Tracked codes fit when you need country totals per station.
Print from a computer that has already opened the sheet once so images finish loading. A first-open print can emit empty boxes. How to make a QR code in Google Sheets for a lab of shared logins is: wait for the PNG to appear, then File, Print.
Hosted types keep the printed squares stable while destinations move. That is why a term-long classroom sheet should not start as a static Canva widget pasted into A1. If the sheet is a one-night raffle that will never be counted, Canva is enough and Sheets is overhead.
Do not screenshot the unpaid editor. Use Download PNG (or SVG if you will place it elsewhere). Sheets in Chrome is a raster compositor.
Conditional formatting and alternating colours that sit under an over-cells image still print if the image is semi-transparent, which Sheets images are not, but a border you drew with drawing tools can. Delete drawings that hug the picture. A QR mark is not a sparkline. If you need a scannable column for thirty SKUs, bulk-create hosted files and place thirty PNGs. One stretched IMAGE() is how row 30 fails.
Insert Image Over Cells, then kill Fit to width
- On the SmartQRCode code page, Download PNG sized for the printed millimetres, 300 dpi or higher.
- In Sheets, Insert, Image, Insert image over cells. Avoid Insert image in cell if row height is still the default 21 pixels.
- Drag the image to a square. In the three-dot menu, set a custom size so the on-paper height will be at least 2 cm. Lock aspect ratio.
- File, Print. Under Scale, choose Normal, 100 percent. Clear Fit to width and Fit to height.
- Set a print area or current sheet that includes a light gutter around the picture. Turn off Show gridlines.
- Watch sheets frozen header collision: unfreeze rows for the print, or move the picture below the freeze so a repeating header cannot cover a finder.
- Print one page. Scan from about 30 cm. If the PDF looked large and the paper looks small, Scale was not Normal.
Excel print area millimetres is the same physics. Bulk CSV jobs are how you mint many hosted files when the sheet has hundreds of destinations. Sheets should place those files, not invent them.
Why screenshotting Google Sheets cells fails
A screenshot is a picture of software. It contains the green selection outline, the formula bar, maybe a comment triangle. Cropping does not restore module edges. Flattening a grid into a photograph and then reprinting that photograph is a known print failure: each generation adds blur. Insert Image Over Cells with a Download PNG is a first-generation raster at a known dpi.
IMAGE() formulas that pull a chart API are a second trap. You do not control error correction, quiet zone, or the millimetre size on paper. When the API changes, every station sheet breaks at once.
How Fit to width ruins a Sheets code
Fit to width exists because teachers have too many columns. It multiplies picture size by a factor nobody typed. Desk-distance scans want about 2 cm across the symbol, quiet zone not counted. After Fit to width, you get a stamp. Normal scaling plus a dedicated print-area tab for the codes, with the data table on the next tab, is the boring fix.
If you must print table and code together, set the image size after you pick scale, then proof on paper. Print preview zoom is not millimetres.
Can each row hold a different hosted file
Yes. One PNG per row, each from its own SmartQRCode code. Hosted destinations can change without new images. Static payloads cannot. For classroom lists hosted is the usual fit because assignment URLs churn. Do not put a Wi-Fi payload in the same scaling pass as a website type without checking each picture's centimetre height; Wi-Fi is static and uncounted.
Named ranges, extra tabs, and a print that uses the wrong sheet
Sheets files accrete tabs: Roster, Stations, Print me, Old print me. The code lives on Print me at 100 percent. A colleague prints Roster, which still has Fit to width, and the night's labels fail. Name the print tab in a cell the size of a headline. Protect that sheet if your domain allows it. Frozen headers that reprint on every page belong off that tab.
IMAGE() formulas that pull a chart URL will break when the chart host changes, and they ignore your millimetre brief. Delete them. Insert Image Over Cells is the placement. If you need one code per row for thirty stations, thirty PNGs named by station is tedious and correct. A single PNG duplicated and stretched to fit each cell is how row 30 becomes 8 mm.
Download PDF from Sheets is not a substitute for Normal scaling. The PDF inherits Fit to width if you left it on. Set Scale first, then Download, then print that PDF at 100 percent, then scan. Chrome's print dialog has its own shrink-to-fit checkbox; clear that too.
A form URL on a roster should be hosted so a duplicated assignment does not strand last term's paper. Place that PNG on the print tab, not inside a comment. Comments do not print as scans.
Gridlines, alternating row colours, and a thick outside border around the picture all compete with quiet zone. The border is extra ink. If you need a caption, put it in the cell above, not as a drawing that overlaps the top finder.
When Canva beats a spreadsheet layout
A single poster, a bake sale, or a party invite that will never be counted belongs in Canva's built-in QR. Sheets wins when the surrounding data already lives in rows. For those grids, Insert Image Over Cells from a SmartQRCode PNG, with Fit to width off and frozen headers clear of finders, is the method. Photographing cells is not.
A substitute teacher printing from a phone will hit Chrome's shrink-to-fit. Put Normal scaling in the tab name in huge type. If the district blocks downloads, File, Print to a school printer from the account that owns the sheet, then photocopy. Photocopies add blur; start from a 2.5 cm mark if you know copies are coming. Scan a photocopy, rather than trusting the original alone.
Questions this raises
The capture includes gridlines, the formula bar, and often a frozen header. That raster is not a print file. Insert Image over cells using a Download PNG from SmartQRCode.
Print, Fit to width scales every picture to make columns fit the paper. A 2 cm symbol becomes smaller than a phone can resolve from a desk. Use Normal scaling and a set print area.
Yes. Place one SmartQRCode PNG per row if each destination is hosted. Editing the live URL does not require a new image. A static payload in that row does.
A one-off poster that will never be counted or retargeted should use Canva static QR widget. Sheets is for rosters, stations, and classroom lists that already live in a grid.
A frozen row that reprints on every page can overprint the top finder. Keep the picture below the freeze, or put codes on a dedicated print-area sheet.
Keep going
The tools and playbooks this post refers to, one click away.
Make the code this post is about
$1.99 for 7 days, then a paid plan. Pick a type, brand it, and edit the destination whenever you like, even after it is printed.