Blog
QR Codes in Google Sheets: 1 Per Row, Tested on 20 Links
On this page
1 formula makes QR codes in Google Sheets, 1 per row: =IMAGE("https://api.qrserver.com/v1/create-qr-code/?size=300x300&data="&ENCODEURL(A2)). IMAGE shows a picture from a web address, and the address here belongs to an online QR service that draws the code. For printed codes you may need to edit later, download the list as a CSV file and import it into a QR code generator instead.
Google SheetsFor Google Sheets: the IMAGE formula, ENCODEURL and the CSV download
The part of that formula most guides skip is ENCODEURL. We built a sheet of 20 rows, sent every row to 2 QR services with and without it, and read back each code. Without ENCODEURL, 9 of the 20 rows came back as codes that open the wrong link or no code at all.
The test: 20 rows, 2 QR services, with and without ENCODEURL
A QR formula in a spreadsheet joins 2 parts into a web address: the QR service’s address and the text in your cell. We built those addresses for a sample sheet of 20 rows, the 2 ways people write the formula:
- Plain join:
"<service>"&A2 - With ENCODEURL:
"<service>"&ENCODEURL(A2). Google’s ENCODEURL help says it encodes text for the query string of a web address, and showshello, world!becominghello%2C%20world%21. We reproduced it with standard percent encoding. It matched both of Google’s examples before the test ran.
The 2 services are the ones our Excel QR code guide tested: QR Server (api.qrserver.com, at 300 by 300 pixels) and QuickChart (quickchart.io, at its default size). We fetched all 80 addresses by plain HTTP from a Mac on 10 Nov 2026, without Google Sheets in the loop, and read each image with Apple Vision, the barcode detector in Apple’s Vision framework. A pass means the code read back exactly the text in the cell.
The sheet held 8 plain links, 5 links with & (UTM tags), 2 links with #, 2 phone links with +, 1 link with a space typed into it and 2 short labels with spaces.
| Plain join | With ENCODEURL | |
|---|---|---|
| 8 plain links | 16 of 16 exact | 16 of 16 exact |
5 links with & | 0 of 10: 9 cut at the first &, 1 error | 10 of 10 exact |
2 links with # | 0 of 4: cut at the # | 4 of 4 exact |
2 phone links with + | 0 of 4: the + became a space | 4 of 4 exact |
| 3 cells with spaces | 6 of 6 exact | 6 of 6 exact |
| All 20 rows | 22 of 40 exact | 40 of 40 exact |
What the plain join got wrong:
- The wrong codes still scan.
https://qrplify.com/?utm_source=qr&utm_medium=print&utm_campaign=menucame back as a code forhttps://qrplify.com/?utm_source=qr. A phone opens the page, and your campaign tags are gone. A quick scan test passes, and only a look at the full link shows the loss. - A phone number lost its country code sign.
tel:+12025550143came back astel: 12025550143, with a space where the+was. - 1 link made no code at all. On QR Server, the link ending
&id=104came back as an error message about a malformed request instead of an image. - Spaces passed, thanks to our test client, which sent each space as
%20. We did not test how Sheets sends a raw space; ENCODEURL settles it either way.
Every image was a PNG answered directly, with no redirect. QR Server’s files ran from 388 to 836 bytes, QuickChart’s from 784 to 1,607, and the longest address in the test came to 205 characters.
We also wrote the 16 web links into a CSV file in the columns of QRplify’s import sample, UTF-8 with commas between columns. Read back, every link and name matched the sheet, & and # included. The CSV writer put quotes around the 3 names containing a comma. A CSV file needs no ENCODEURL.
The IMAGE formula or a QR code generator
Google Sheets draws no QR code itself in this method. Google’s IMAGE help describes a function that inserts an image from a web address into a cell, so the code is only as good as the service at that address.
| IMAGE with QR Server | IMAGE with QuickChart | QRplify CSV import | |
|---|---|---|---|
| Who draws the code | QR Server, run by goQR.me | QuickChart | QRplify, from your CSV file |
| Your cell's text | Sent to the service in the address | Sent to the service in the address | Uploaded with the file |
| Limits | No request limit; may reject abusive use | Free plan is rate limited, no SLA | Free plan: 1,000 codes per import, and a QRplify screen before the link once scans pass 100 a month |
| Change the link after printing | No, the link is inside the code | No, the link is inside the code | Yes, each row becomes a dynamic code |
| Scan counts | None | None | Scans by city, device and time |
The service notes come from each vendor’s own pages: QR Server’s API notes ask for the text to be URL encoded: the job ENCODEURL does. They set no request limit, though the service may reject abusive requests. It records where each request comes from, not what the code holds. QuickChart’s pricing page lists a rate limit and no service level agreement on its free plan.
Pick by the job:
- A sheet people read on screen, such as an inventory list: the IMAGE formula is enough, with nothing to install.
- Printed codes whose links may change later: use the CSV route below. It also counts scans.
QRplify has no Google Sheets add-on, and you do not need one. The import reads the CSV file Sheets already downloads.
How to make QR codes in Google Sheets with a formula
- List the content. Put a header in A1, then 1 link or text per row from A2 down.
- Type the formula. In B2, type
=IMAGE("https://api.qrserver.com/v1/create-qr-code/?size=300x300&data="&ENCODEURL(A2)). For QuickChart instead, use=IMAGE("https://quickchart.io/qr?text="&ENCODEURL(A2)). Either way, the cell’s text goes to that company’s server, so keep private data out of these cells. - Size the cell. Google says the image resizes to fit inside the cell by default, and no mode makes the cell grow to fit the image. Make row 2 taller and column B wider, or use mode 4 with a height and width in pixels:
=IMAGE("...", 4, 150, 150). - Fill it down. Drag the fill handle in B2 down the column. Each row builds its own code from its own cell.
- Check 3 rows. Scan rows with
&,#,+or spaces in them. The free QR code decoder reads a screenshot of the cell and shows the full link, where a cut link shows.
Google’s ENCODEURL help lists no platform limit, so this formula needs none of the SUBSTITUTE workaround that Excel for Mac does. IMAGE also skips 2 kinds of source: Google’s help says SVG files are not supported and images hosted on drive.google.com cannot be used.
For codes that live in the file instead, download each from the URL QR code generator as a PNG and add it with Insert, Image, placed in the cell. Google’s image help takes PNG, JPG and GIF files under 50 MB, and a cell holding an image cannot also hold text. For a phone number, the call QR code generator keeps the + in place.
1 dynamic QR code per row: from Google Sheets to a CSV import
The formula route makes static codes: the link sits inside the pattern and cannot change once printed. A dynamic code holds a short redirect link you can point somewhere else after printing (static vs dynamic QR codes). To make 1 per row, use a CSV file and QRplify’s bulk import. The import makes URL codes, so keep it to web links.
- Download the sample. In the QRplify app, open Import QR Codes and download the sample CSV. Its header row has 9 columns. 2 are marked Required: Destination URL and QR Code Name. The columns marked Optional, such as Folder Name and PIN Code, can stay empty.
- Open it in Sheets. Click File, Import, and upload the sample. Google’s import help lists .csv among the file types, and Insert new sheets adds it as a new tab next to your list.
- Fill 1 row per code. Paste your links into Destination URL and a name for each into QR Code Name. Keep the header row exactly as it is.
- Download as CSV. Click File, Download, and choose the CSV file type, as Google’s download help describes. The import takes CSV files only, so XLSX will not do.
- Import and download. Upload the file in Import QR Codes. Each row becomes a dynamic URL code. Download every code as a PNG, or the batch’s list as a CSV to match codes to rows for printing.
A free account imports up to 1,000 codes at a time, and every plan includes unlimited dynamic codes. The bulk QR code generator guide covers the import screen and its options, and the Shopify QR code guide shows the same route starting from a store’s product export.
Track scans from every row
Every QRplify dynamic code counts its scans. The report splits them by city and device, with the time of each scan. To see the visits in your own analytics too, add UTM tags to each link in the sheet before you download the CSV, such as ?utm_source=qr&utm_medium=print&utm_campaign=labels. In the CSV, the tags travel exactly as typed. QR codes and UTM tags shows the full setup.
The limit, stated before you plan around it: on a free account, once your codes pass 100 scans in a month, scans show a QRplify screen for 3 seconds before the link opens. Premium skips that screen on 5 codes, and the Unlimited and Lifetime plans never show it. Pricing lists what each plan adds.
Print the codes so they scan
UTM tags make a link longer and a static code denser. A dynamic code holds only its short link, so the pattern stays simple. On labels, print each code 3 cm wide or more and keep the quiet zone, the empty margin around it, clear. QR code best practices covers contrast and color too.
FAQ: QR codes in Google Sheets
Can Google Sheets generate a QR code?
Yes, with the IMAGE function and an online QR service: =IMAGE("https://api.qrserver.com/v1/create-qr-code/?size=300x300&data="&ENCODEURL(A2)). The service draws the code from your cell’s text, and Sheets shows the picture in the cell.
Why does my Google Sheets QR code open the wrong page?
The formula probably joins the cell without ENCODEURL. In our test, links with & or # came back cut short, and the cut codes still scanned. Wrap the cell in ENCODEURL and the codes read back exactly.
How do I make a QR code that opens my spreadsheet?
Copy the sheet’s share link, and check it opens for someone signed out of your account. Paste it into the URL QR code generator, or make it a dynamic code so you can point it at a new sheet next year.
Is there a QRplify add-on for Google Sheets?
No. Nothing installs in Sheets, and QRplify does not connect to your spreadsheet. You download a CSV file from Sheets and import it, and a free account takes up to 1,000 rows in each file.