Extract Emails from Websites into Google Sheets, No Copy-Paste
Use =CONTACTINFO() to pull emails, phones and social links from a list of websites into Google Sheets, so an outreach list that takes hours of clicking through contact pages becomes one dragged formula. Charged at 8 scraping credits per page read.
Phil Nguyen · 5 min read

To extract emails from websites in Google Sheets, put the URLs in a column and type =CONTACTINFO(A2:A11): SheetMagic crawls each site and writes one row per URL with the Email, Phone, Facebook, Twitter, Instagram, LinkedIn and YouTube details it found. That turns an afternoon of opening contact pages into one formula, and leaves you with an outreach list you can verify, sort and send.
Say you run a small agency and want to pitch 50 local businesses. By hand, that means opening each site, hunting for the contact page and copying the email and phone into your sheet. At about 3 minutes a site, 50 sites is 2.5 hours before you send a single message.
=CONTACTINFO() reads the page you give it plus the pages it links to, so contact details tucked away on a /contact or /about page are picked up too.
The full signature is:
=CONTACTINFO(urls, maxDepth, maxPages, sameDomain)
One formula writes at most 10 rows, one per website. For a longer list, put =CONTACTINFO(A2) next to the first URL and drag it down: drag-filled copies of the same formula write into one shared results tab, and the Source column shows which cell each row came from.
Why does it crawl more than the homepage?
Most sites keep their email and phone number on a linked /contact or /about page, not on the homepage. maxDepth counts link hops away from the URL you give:
0reads only that page, which rarely finds anything.1, the default, reads that page plus every page it links to.
Leave maxDepth at 1 unless you have a reason to change it.
How do I set maxPages?
maxPages caps the total pages read for the whole formula run, not per site. The default is 25. A homepage often links to dozens of pages, so a low cap can run out before the crawler reaches /contact: in one live test, a 10-page crawl found only an unconfirmed phone number, while a 26-page crawl found the confirmed one.
If you pass several sites to one formula, they share that budget. Dragging one formula per row gives each site its own 25 pages.
What does it cost?
=CONTACTINFO() is charged by pages read, not by websites: 8 scraping credits per page plus 4 credits per run. Before a run starts, SheetMagic holds credits for the full maxPages budget, which at the default of 25 is 204 credits. When the run ends, only the pages actually read are charged and the rest of the hold comes back.
For the 50-site list above, with one dragged formula per site: a site where the crawler reads 10 pages costs 4 + (10 x 8) = 84 credits, so 50 sites like that is 4,200 credits. The most 50 sites can cost at the default cap is 50 x 204 = 10,200 credits. A run that returns no rows is charged nothing.
If your balance cannot cover the full hold, SheetMagic lowers maxPages to what your balance can pay for instead of refusing the job.
Monthly scraping credit allotments by plan:
| Plan | Scraping credits per month |
|---|---|
| Solo | 10,000 |
| Growth | 45,000 |
| Scale | 115,000 |
The Free plan includes 100 scraping credits.
What does Pages Crawled = 0 mean?
The last column, Pages Crawled, counts the pages the crawler actually read for that URL. A 0 means the site refused every request, usually because of bot protection. In that case the contact columns are empty because nothing could be read, not because the site lists no contacts.
The crawler also has no browser mode, so a site that loads its contact details with JavaScript can come back empty even when it does list them.
What can you do with the contact list?
- Verify before you send, so you do not pay for bounces.
=VALIDATEEMAIL()takes a list of addresses and returns Email, Result, Quality, Detail and Free Provider for each one, so you can drop undeliverable and free-mail addresses before they hit your sending tool. It costs 6 scraping credits per email plus 40 per run, so checking 50 emails is 40 + (50 x 6) = 340 credits. When a site has several emails,=CONTACTINFO()puts them in one cell separated by commas, so split that cell into one address per cell first, for example with Google Sheets' own SPLIT function. - Call the businesses that list no email. Filter the Email column for blanks and the Phone column for values, and you have a call list instead of a dead end.
- Message them where they are active. A row with no email but a Facebook, Instagram or LinkedIn link is still a lead. The results also include TikTok, Pinterest, WhatsApp, Telegram, Reddit, Snapchat, Threads and Discord links.
For the full prospecting workflow, see the sales lead generation guide and how to enrich lead lists in Google Sheets. Need the website list first? =GMAPS() returns business websites from a Google Maps search, and the web scraping guide covers every other scraper.
Text and scraping formulas run on the free allowance. Install from the Google Workspace Marketplace, no card, no expiry.
Install free for Google SheetsAbout the author
Phil NguyenPhil builds SheetMagic, the Google Sheets add-on that brings AI and web scraping into the spreadsheet, used by 6,300+ people. He writes these guides from the formulas he runs on his own sheets.
