## Extracted Emails
```
john.doe@example.com
sarah_123@company.co.uk
```
## Google Sheets Formula
**For a single email per cell:**
```
=REGEXEXTRACT(A1,"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")
```
**For multiple emails per cell (recommended for your case):**
```
=TEXTJOIN(", ",TRUE,IFERROR(REGEXEXTRACT(SPLIT(A1," ,;"),"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"),""))
```
**Array version for the whole column (paste in B1):**
```
=ARRAYFORMULA(IF(A1:A="","",IFERROR(TEXTJOIN(", ",TRUE,IFERROR(REGEXEXTRACT(SPLIT(A1:A," ,;"),"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"),"")))))
```
**How to apply:** Paste the second formula into B1 and drag down the column, or use the array version once in B1 to auto-fill all rows in column A.
Formulas to Extract Email Addresses in Google Sheets
Tested prompts for extract email addresses in google sheets compared across 5 leading AI models.
If you have a column of messy text, notes, or imported data and need to pull out just the email addresses, Google Sheets has no built-in EXTRACT_EMAIL function. You are stuck combining REGEXEXTRACT with a pattern that matches the structure of an email, or you copy-paste into a tool and clean it manually. Neither is fast when you have hundreds of rows.
The common use case: you exported a CRM dump, scraped a contact list, or received a CSV where emails are buried inside longer strings like 'Contact John at john@example.com for details.' You need a clean column of addresses you can paste into Mailchimp, upload to a sales tool, or just filter. That means extracting reliably, not just eyeballing.
This page shows you working formulas and AI-generated approaches for extracting email addresses from any text in Google Sheets. The formulas here handle the standard cases: single email per cell, emails embedded in sentences, and lists with mixed formatting. Pick the approach that matches your data and you can have a clean output column in under five minutes.
When to use this
This approach works best when your data is already inside Google Sheets and you need a repeatable, formula-driven extraction that updates automatically as new rows come in. It is the right tool when emails are embedded in free-form text, imported from a form response, or pasted from an export where the address is surrounded by other content.
- Cleaning a Google Form export where respondents typed their email inside a longer answer field
- Processing a CRM or database export where contact info is in a single combined column like 'Name | Email | Phone'
- Pulling emails from scraped web content or copied directory listings pasted into a sheet
- Standardizing a marketing list where some rows have plain emails and others have names followed by addresses
- Building a live pipeline where new rows are added regularly and the extraction formula should apply automatically
When this format breaks down
- If a single cell contains multiple email addresses, REGEXEXTRACT returns only the first match by default. You need REGEXEXTRACT with an array workaround or a script, which quickly becomes fragile.
- If your emails use non-ASCII characters or internationalized domain names (like .香港 or accented local parts), standard regex patterns will miss them or produce wrong results.
- If you are working with thousands of rows and need bulk processing with deduplication, validation, and export, a dedicated data cleaning tool or a simple Python script will be faster and more reliable than nested sheet formulas.
- If the source text has no consistent structure and emails appear in wildly varying formats across cells, regex accuracy drops and you will need manual review anyway, making the formula less useful than a direct AI prompt on the raw data.
The prompt we tested
You are an expert in Google Sheets formulas and data extraction. Given the following text or spreadsheet scenario, extract all valid email addresses and provide the Google Sheets formula(s) needed to do so.
Instructions: Return a clear response with two sections: (1) 'Extracted Emails' listing each email on its own line, and (2) 'Google Sheets Formula' showing a ready-to-paste REGEXEXTRACT or similar formula (e.g., =REGEXEXTRACT(A1,"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")) with a one-line explanation of how to apply it across a range. Keep the output concise and copy-paste friendly.
Input:
I have a column in Google Sheets (column A) with messy customer notes like: 'Contact John at john.doe@example.com or his assistant sarah_123@company.co.uk for billing questions.' I need to pull out just the email addresses into column B for my mailing list.
Provide the extracted email addresses and the Google Sheets formula(s) that would extract them from a cell or range.
Model comparison
| Model | Quality | Cost | Latency | Tokens |
|---|---|---|---|---|
| Claude Opus 4.7 | 8 | $0.0399 | 6.1s | 388 / 454 |
| Claude Haiku 4.5 | 9 | $0.0020 | 3.3s | 278 / 341 |
| GPT-5.4 | 8 | $0.0049 | 5.9s | 239 / 289 |
| Gemini 2.5 Pro | Not run yet | |||
| Grok 4.1 Fast Reasoning | 8 | $0.0001 | 13.3s | 388 / 102 |
Outputs
# Email Extraction from Google Sheets
## Extracted Emails
john.doe@example.com
sarah_123@company.co.uk
## Google Sheets Formula
```
=REGEXEXTRACT(A1,"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")
```
**How to apply:** Place this formula in cell B1, then copy it down column B. It extracts the first email found in each cell of column A. For multiple emails per cell, use `REGEXEXTRACTALL()` instead (requires splitting results into separate rows or columns with additional helper columns).
**Alternative for multiple emails per cell:**
```
=FILTER(SPLIT(REGEXREPLACE(A1,"([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})","|$1|"),"|\s+"),REGEXMATCH(SPLIT(REGEXREPLACE(A1,"([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})","|$1|"),"|\s+"),"@"))
```
**Simpler approach:** Use `REGEXEXTRACTALL()` in a helper column (Google Sheets only) to capture all emails, then flatten results as needed.
**Extracted Emails**
john.doe@example.com
sarah_123@company.co.uk
**Google Sheets Formula**
For the first email in a cell:
```gs
=REGEXEXTRACT(A1,"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")
```
For all emails in a cell joined by commas:
```gs
=TEXTJOIN(", ",TRUE,REGEXEXTRACT(SPLIT(REGEXREPLACE(A1,"([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})","|$1|"),"|"),"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"))
```
To apply down column B for all rows in column A:
```gs
=ARRAYFORMULA(IF(A1:A="","",REGEXEXTRACT(A1:A,"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")))
```
Use the first formula for one email per cell, or the second if a cell may contain multiple emails; place it in B1/B2 and fill down, or use the ARRAYFORMULA version for the whole column.
### Extracted Emails
john.doe@example.com
sarah_123@company.co.uk
### Google Sheets Formula
```
=ARRAYFORMULA(IF(A1:A="","",REGEXEXTRACT(A1:A,"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")))
```
Paste into B1; automatically extracts the first valid email from each non-empty cell in column A (handles entire range, spills to B:B).
What makes these work
-
01Always wrap with IFERROR
REGEXEXTRACT throws a #N/A error when it finds no match, which breaks downstream formulas like COUNTIF or array operations. Wrap every extraction formula in IFERROR(formula, "") to return a blank instead. This keeps your output column clean and safe to use as a source range.
-
02Test your regex on edge cases first
Before dragging a formula down 500 rows, test it on five cells that represent your messiest data: one with no email, one with a subdomain address, one with a plus-sign alias like user+tag@domain.com, and one where the email is at the very start or end of the string. Regex patterns that look correct often fail on edge cases you did not anticipate.
-
03Use a helper column, not in-place replacement
Extract to a new column rather than overwriting the source. This preserves the original data for auditing and lets you re-run the formula if your pattern needs adjustment. Once you confirm the output column is correct, you can copy it and paste-as-values if you need a static result.
-
04Validate results with a quick format check
After extraction, add a second helper column with =ISNUMBER(MATCH("*@*.*",B2,0)) or a simple LEN check to flag any extracted value that looks wrong, like a cell that returned partial text instead of a full address. Catching bad extractions before you export saves cleanup time later.
More example scenarios
A spreadsheet column contains entries like: 'Sarah Mitchell, sarah.mitchell@brightcorp.io, Account Manager' and 'Follow up with dev team: raj.patel@techsolutions.com RE: Q3 proposal'. The user needs just the email addresses in a separate column for an email campaign upload.
Apply =REGEXEXTRACT(A2, "[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}") in column B. For the two example rows this returns sarah.mitchell@brightcorp.io and raj.patel@techsolutions.com. Drag the formula down the entire column. Any cell with no email returns a #N/A error, which you can suppress with IFERROR.
A volunteer sign-up form asked 'How should we contact you?' and respondents typed things like 'You can reach me at volunteers@greencity.org anytime' or 'Email is best: j.torres2024@gmail.com, I check it daily.' The sheet has 340 rows and needs a clean email column for follow-up.
Use =IFERROR(REGEXEXTRACT(A2,"[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}"),"") in column B. This handles the varied sentence structures and returns a blank instead of an error for any rows with no address. The result column is safe to copy and paste directly into an email platform.
A recruiter exported job listings from a board into Sheets. Column D contains the full job description text, which sometimes includes a contact line like 'Send resumes to hiring@novatech.com' or 'Questions? Reach out to careers@medbridge.org.' They want a column of just the contact emails to log outreach.
=IFERROR(REGEXEXTRACT(D2,"[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}"),"no email found") extracts the first email in each description. Listings with no email get the fallback label so the recruiter knows to find contact info another way.
Two sales teams merged their contact lists into one sheet. One team stored data as 'firstname lastname <email@domain.com>' in Outlook format. The other stored plain emails. The merged column has both formats mixed across 600 rows and needs to output only the email address.
The same REGEXEXTRACT formula handles both formats because it matches the email pattern regardless of surrounding characters. For 'Jane Doe <jane.doe@acmecorp.com>' it correctly returns jane.doe@acmecorp.com. For a plain 'jane.doe@acmecorp.com' cell it returns the same result. One formula covers the entire mixed column.
A nonprofit coordinator pasted an alumni directory into Sheets. Each row is unstructured text like 'Michael Chen, Class of 2018, B.Sc. Engineering, mchen@alumni.stateu.edu, Chicago IL' or 'Lisa Park (lpark.2017@stateu.edu) - Program Coordinator'. They need the emails for a donation drive mailing list.
=IFERROR(REGEXEXTRACT(A2,"[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}"),"") extracts mchen@alumni.stateu.edu and lpark.2017@stateu.edu respectively. The formula ignores parentheses, commas, and other surrounding punctuation and isolates only the address.
Common mistakes to avoid
-
Using too simple a regex pattern
A pattern like =REGEXEXTRACT(A2,".+@.+") matches too broadly and can grab long strings that include surrounding words. Use a character-class pattern like [a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,} to match only valid email structures. Sloppy patterns produce dirty output that breaks mail platforms on import.
-
Forgetting that REGEXEXTRACT only returns the first match
If a cell contains two emails, the standard formula silently drops the second one. You will not see an error, you will just lose data. If your source data can have multiple addresses per cell, you need to either split cells first or use a Google Apps Script that loops through all matches.
-
Not accounting for uppercase in email domains
Some exports store emails with mixed case like User@Domain.COM. The regex pattern with [a-zA-Z] handles this correctly, but if you add any post-processing like LOWER() or exact-match lookups, verify your formula returns the address in the casing you need. Email addresses are technically case-insensitive in the domain part but case-sensitive in some systems for the local part.
-
Copying the formula result without pasting as values before export
If you copy the extracted email column and paste it directly into another tool or a new sheet, some applications receive the formula reference instead of the value, or the formula breaks because the source sheet is not included. Always use Paste Special > Values Only when moving extracted results out of the working sheet.
-
Ignoring blank rows in the source column
If your source column has blank cells mixed in, IFERROR handles errors but a blank source cell may still return an unexpected result depending on your formula structure. Filter or check for blanks before running bulk operations, especially if you are using the output column as a mailing list where empty rows cause import errors.
Related queries
Frequently asked questions
What is the best formula to extract an email address in Google Sheets?
The most reliable formula is =IFERROR(REGEXEXTRACT(A2,"[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}"),""). It handles emails embedded in sentences, addresses with subdomains, and plus-sign aliases. The IFERROR wrapper prevents errors in cells where no email is found.
How do I extract multiple email addresses from one cell in Google Sheets?
REGEXEXTRACT only returns the first match. To get all emails from a single cell you need Google Apps Script. Write a custom function that uses JavaScript's match() method with the global flag to return an array of all matches in the cell. There is no native Sheets formula that extracts multiple emails from one cell cleanly.
Why is my REGEXEXTRACT formula returning an error instead of the email?
A #N/A error means the regex found no match in that cell. Either the cell contains no email address, or your pattern does not match the format of the address in that cell. Wrap the formula in IFERROR to suppress the error. If you expect an email to be there, paste the cell content into a regex tester to debug the pattern.
Can Google Sheets extract emails from a column automatically as new data is added?
Yes. If you enter the formula in the first data row and then use the column as an ongoing input range, the formula stays live and recalculates whenever the source cell changes. You can also use ArrayFormula to apply the extraction across an entire column at once without dragging the formula down manually.
How do I extract email addresses from Google Sheets using ArrayFormula?
Use =ARRAYFORMULA(IFERROR(REGEXEXTRACT(A2:A,"[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}"),"")) in a single cell at the top of your output column. This applies the extraction to every row in the range A2:A automatically, including new rows added later, without any dragging.
Does Google Sheets have a built-in function to extract emails?
No. Google Sheets does not have a dedicated EXTRACT_EMAIL function. You build the extraction using REGEXEXTRACT with a regex pattern that matches email address syntax. Alternatively, you can write a custom function in Google Apps Script or use an AI tool to process the column and return clean addresses.
Try it with a real tool
Run this prompt in one of these tools. Affiliate links help keep Gridlyx free.