All guides
Spreadsheet guide

How to show the name for a scanned ID in Google Sheets

Scan an ID, see the name: XLOOKUP or VLOOKUP from a People tab, a Report tab that covers new rows, Not on the list, and who has not scanned today.

By the QR to Sheets team 11 min readUpdated 6 October 2026

Short answer

To show a name next to each scanned ID in a Google Sheet, keep a People tab listing every ID with its name, then look each scanned ID up with XLOOKUP, VLOOKUP or INDEX and MATCH on a separate Report tab.

Every formula here is free and works the same on a Google Forms response sheet, a USB scanner log or rows written by QR to Sheets.

QR to Sheets handles the scanning half: staff scan printed ID codes in a phone browser, each scan lands as a row on the scan tab, and your formulas add the names.

A scan log full of IDs is accurate and unreadable. S1042, S1043, V0007: nobody at the end of a session can tell from that column who came. The fix is not to put names into the codes. It is a lookup: one tab that says which name belongs to which ID, and a formula that reads it.

Everything in this guide is ordinary Google Sheets and costs nothing. It works whether the IDs reached the sheet through a Google Form, a USB barcode scanner typing into a cell, or a scanner link. The column letters below follow the default QR to Sheets row; adjust them to your own sheet.

Written by QR to Sheets, which sells the scanning half described near the end, so weigh that accordingly. A QR to Sheets scanner link does not hold your list of people or look names up for you: the list stays in your own Google Sheet, where you decide who can see it. (The paid Events add-on is the exception: it imports a guest list and shows each guest's name at check-in.) Google Sheets behaviour was read from Google's own help pages on 2026-10-06.

The layout: a People tab, a scan tab and a Report tab

Make the IDs match as text

This is the trap that makes a correct formula return nothing. QR to Sheets writes the scanned value exactly as it was read, as text, so 1042 in the Log tab is the text 1042, with any leading zeros kept. If you type 1042 on the People tab, Google Sheets stores a number, and a text 1042 never matches a number 1042. Every row then shows as missing from the list.

Getting IDs into the sheet for free

The lookup does not care how the IDs arrived, so start with whatever is free and already to hand:

Show the name next to a scan: XLOOKUP, VLOOKUP or INDEX and MATCH

All three do the same job: find the scanned ID in the People tab and return the name on that row. Each example looks up the ID in Log!B2 and shows Not on the list when the ID is missing, instead of an #N/A error.

Use XLOOKUP if you only work in Google Sheets. VLOOKUP and INDEX with MATCH are worth knowing because they also work in older spreadsheets and in files that will be opened in other tools.

A Report tab that covers new rows on its own

The tempting move is a formula in column G of the Log tab, filled down beside the scans. Do not. New scans arrive as new rows at the bottom, and a formula filled down beside earlier rows does not reliably follow them, so the names stop partway down. Typing on the scan tab also puts the original record one slip away from an edit.

Instead, put one formula per column in row 2 of a Report tab, with headers such as Time, ID, Name and Class in row 1. Each formula covers every row of the Log, including rows that have not arrived yet:

VLOOKUP is used here because it accepts a whole column of IDs inside ARRAYFORMULA in one formula. To highlight problems, add a conditional formatting rule to the Report tab with the custom formula =$C2="Not on the list".

What Not on the list is telling you

Who has not scanned today?

A scan log only records who came. Absence is the People list minus today's scans. One formula on its own tab lists the ID and name of everyone with no scan dated today:

Why VALUE() is there: QR to Sheets writes each time as YYYY-MM-DD HH:MM:SS in the workspace timezone, and Google Sheets stores it as text. VALUE() turns that text into a date and time, INT() drops the time, and the result can be compared with TODAY(). VALUE() also accepts a real date, so the same formulas work on a Google Form response sheet. Check your own column with =ISTEXT(Log!A2).

TODAY() follows the spreadsheet's own time zone, set in File, Settings. Set it to the same zone as your scans, or for an hour or two around midnight today will mean the wrong day.

One person, several scans

Someone who scans twice appears twice on the Report tab, which is right for a log: the second scan may be a return after lunch or a nervous double tap. For a register with each person once, build it from the unique IDs scanned today and look the names up from there:

On a QR to Sheets scanner link, a repeat is recorded and flagged by default: when the same code repeats on a link within 12 hours the screen turns amber and says Saved anyway. Keep the link's Accept duplicate scans setting on for daily attendance. Switched off, a link records each code once, ever, and would refuse tomorrow's scan.

Should the code hold the ID only, or the ID and the name?

Two designs work. The ID-only code with a People tab is the better default for anything printed and carried:

The alternative is a code that carries both, such as S1042|Ana Lopez, split into separate columns as it is scanned. Column mapping in QR to Sheets does this, and it suits a one-off event where nobody will build a People tab. Know the costs before choosing it: the name is printed inside every code, a name change means a new code, and with column mapping on the row layout changes. A mapped row starts with the scan time in column A, the link name in column B and a device ID in column C, and your own columns begin at column D. Point the formulas above at column D instead of column B.

Where QR to Sheets fits

QR to Sheets is the scanning half of this layout. You connect your Google Sheet and create a scanner link pointed at the Log tab. Staff, teachers or volunteers open the link in their phone browser, allow the camera once and scan each person's printed code. There is no app and no account for the person scanning, and each scan lands as a timestamped row on the Log tab. The People tab and the Report tab are yours, built with the formulas above.

Be clear about one limit. On a scanner link the phone shows the code it scanned, such as S1042, and a confirmation; it does not show the name, because the name lives in your sheet rather than in QR to Sheets. The Events add-on, which imports a guest list, does show each guest's name at the door. If the person at the door needs to see names, keep the Report tab open on a laptop or tablet beside them, or use codes that carry the name and accept the privacy cost above.

Google Form + lookup formulas compared with QR to Sheets
CapabilityGoogle Form + lookup formulasQR to Sheets
CostFreeFree to 300 scans in total, one link and one phone; then 7 USD per registered device per month
How the ID gets inTyped into a form fieldScanned from a printed code, or typed when a card is missing
Typos in IDsCommon, and each one shows as Not on the listRare, because the code is read rather than typed
Names next to IDsLookup formulas you writeLookup formulas you write
Name shown on the phoneOnly if the person types itNo on a scanner link (the Events add-on shows guest names)
TimestampA real date in the spreadsheet's time zoneText in the workspace timezone, read with VALUE()
No signalCannot submitKept on the phone, sent later
Where the data livesYour Google SheetYour Google Sheet

On price: the free plan is one scanner link, one Sheet, one registered device and 300 scans in total, not per month, which covers one door or one class for a trial. Beyond that it is 7 USD per registered device per month with unlimited scans and links. One phone at the door is one device, however many people it scans.

Step by step

  1. 1

    Build a People tab

    Put each ID in column A, the name in column B and anything else you report on, such as class or team, in column C. Format column A as plain text before typing, so the IDs match what the scanner writes.

  2. 2

    Put only the ID in each code

    Print one code per person from the ID column. A code that holds only S1042 reveals nothing if it is lost, and a name change means editing one cell rather than reprinting a card.

  3. 3

    Leave the scan tab alone

    Let scans land on their own tab, here called Log. Do not type on it, sort it or fill formulas down beside it. It is the record everything else is built from.

  4. 4

    Add a Report tab with array formulas

    One ARRAYFORMULA per column at the top of a Report tab copies each scan across and looks the name up, and it covers new rows as they arrive without anyone touching it.

  5. 5

    Add a list of who has not scanned today

    A FILTER over the People tab that keeps every ID with no scan dated today is your absence or no-show list. It updates itself through the day.

Frequently asked questions

How do I show a name when an ID is scanned into Google Sheets?+

Keep a People tab with each ID and name, then use =XLOOKUP(Log!B2, People!A:A, People!B:B, "Not on the list") on a separate Report tab. For a version that covers new rows automatically, use VLOOKUP inside ARRAYFORMULA in row 2 of the Report tab.

Why does my lookup say Not on the list for everyone?+

Almost always a type mismatch: the scanned IDs are text and the People tab holds numbers, or the other way round. Check both with ISTEXT. Give IDs a letter prefix, or format the People ID column as Plain text before typing them.

Why does VLOOKUP return the wrong name?+

The last argument is missing. VLOOKUP assumes a sorted list unless you pass FALSE, and on an unsorted list it can return a nearby ID's name instead of an error. Use =VLOOKUP(ID, People!A:C, 2, FALSE), or use XLOOKUP, which matches exactly by default.

Does QR to Sheets look up names itself?+

No. It writes the scanned code as a row in your Google Sheet, and you add names with a lookup against your own People tab. The list of people never leaves your spreadsheet, and a scanner link's phone shows the scanned code rather than a name. The paid Events add-on is different: it imports a guest list and shows each guest's name at check-in.

How do I list who has not scanned today?+

Filter the People tab for IDs with no scan dated today: =FILTER(People!A2:B, People!A2:A<>"", ISNA(MATCH(People!A2:A, FILTER(Log!B2:B, IFERROR(INT(VALUE(Log!A2:A)), 0)=TODAY()), 0))). The VALUE() is needed because QR to Sheets timestamps are stored as text.

Should I put the person's name in the QR code?+

Usually not. Any phone camera can read a QR code, so a lost card exposes whatever it holds, and a name change means reprinting. Put an ID in the code and keep the name on a People tab. Codes that carry both can be split into columns with column mapping when a list is not practical.

Try it on your own Google Sheet

Connect Google, create a scanner link, and share the URL with your team. The free tier covers 300 scans, and nobody you share it with has to install anything.

Start for free

No credit card required

Keep reading