June 9, 20269 min read

Email Finder in Google Sheets: Enrich Contacts with Apps Script (2026)

Google Sheets is where most sales and marketing teams manage their prospecting lists before they make it into a CRM. This guide shows you how to enrich those lists with verified emails directly inside Sheets using Google Apps Script.

No additional software, no Zapier subscription, no CSV export-import loop. Paste names and domains into columns A and B, run the script, and verified emails appear in column C.

What you will build

A Google Apps Script that reads rows from your Sheet, calls the emailfinder.dev Person Email endpoint for each row, and writes the verified email back into column C. It also adds a custom menu to your Sheet so any team member can trigger enrichment with one click — no code knowledge required.

The final setup: column A = Full Name, column B = Company Domain, column C = Verified Email (filled by the script).

Step 1: Get your API key

Create a free account at emailfinder.dev/register. After signing up, go to Settings in the dashboard and copy your API key. You will paste it into the script in the next step.

Keep your API key private. Do not share the Sheet with people who should not have access to it, or store the key in a cell — only in the script properties.

Step 2: Open Apps Script editor

In your Google Sheet, click Extensions in the top menu, then Apps Script. This opens the Apps Script editor in a new tab. Delete any existing code in the editor before pasting the script below.

Step 3: The script

Paste this complete script into the Apps Script editor:

const API_KEY = 'your_api_key_here'; // Replace with your emailfinder.dev API key function findEmails() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const lastRow = sheet.getLastRow(); for (let row = 2; row <= lastRow; row++) { const fullName = sheet.getRange(row, 1).getValue(); const domain = sheet.getRange(row, 2).getValue(); if (!fullName || !domain) continue; // Skip if email already filled if (sheet.getRange(row, 3).getValue()) continue; const email = lookupEmail(fullName, domain); sheet.getRange(row, 3).setValue(email || 'not found'); // Respect rate limits Utilities.sleep(200); } SpreadsheetApp.getUi().alert('Done! Emails have been enriched.'); } function lookupEmail(fullName, domain) { const url = `https://www.emailfinder.dev/api/find-email/person?full_name=${encodeURIComponent(fullName)}&domain=${encodeURIComponent(domain)}`; const options = { method: 'get', headers: { Authorization: `Bearer ${API_KEY}` }, muteHttpExceptions: true, }; const response = UrlFetchApp.fetch(url, options); const data = JSON.parse(response.getContentText()); return data.status === 'found' ? data.email : null; } function onOpen() { SpreadsheetApp.getUi() .createMenu('Email Finder') .addItem('Find Emails', 'findEmails') .addToUi(); }

Replace your_api_key_here with your actual API key. Save the script with Ctrl+S (or Cmd+S on Mac).

Step 4: Run the script

The first time you run the script, Google will ask you to authorise it to access your Sheets data and make external network requests. Click Review Permissions, sign in with your Google account, and click Allow.

To run: click the Run button (the play triangle) in the Apps Script toolbar while the findEmails function is selected. Or close the editor and use the new Email Finder menu that appears in your Sheet.

The script processes each row in sequence, writes the verified email (or 'not found') to column C, and shows an alert when complete.

Adding a custom menu

The onOpen function in the script automatically adds an Email Finder menu to your Sheet every time the Sheet is opened. Team members can enrich emails with one click without opening the Apps Script editor.

You can also add a header row label. The script skips row 1 (starting the loop at row 2) — put your column headers there: Full Name, Company Domain, Verified Email.

Rate limiting

The Utilities.sleep(200) call adds a 200ms pause between rows, giving a throughput of approximately 5 lookups per second — well within the API's 1,000 requests per minute limit.

For large sheets (500+ rows), this means a runtime of about 2 minutes. Apps Script has a 6-minute execution limit for free accounts. If your sheet has more than 1,500 rows, split it across multiple runs or upgrade to a Google Workspace account with a 30-minute limit.

Error handling

The muteHttpExceptions: true option prevents the script from crashing on a failed request. The lookupEmail function returns null for any non-found response, and the calling code writes 'not found' to the cell.

The if (sheet.getRange(row, 3).getValue()) continue check skips rows that already have an email in column C — so you can run the script multiple times without duplicating charges for contacts you already enriched.

Get your API key and start enriching

Free credits included. No credit card required.