How to Extract Email Addresses from Gmail to a Spreadsheet (4 Ways)

8apps Team·

Gmail has no export-these-addresses button. Here are the four routes that actually work - Other contacts, Contacts export, Takeout and Apps Script - and which one fits your situation.

Gmail can find exactly the right messages. Google can export everything you own. Nothing connects the two.

There is no "select these search results, export the senders to a spreadsheet" button anywhere in Gmail. That is the honest starting point, and it is why this question gets asked so often.

So the question is not how do I press the button. It is which of four workarounds fits what you are actually trying to do.

RouteGood forCosts you
Other contactsEveryone you have ever emailedThree clicks, but no filtering at all
Contacts exportA clean CSV of saved contactsContacts only, not correspondents
Google TakeoutA full mailbox archiveAn archive file, not a list
Apps ScriptAddresses from a specific searchAn afternoon, and it will time out
An add-onThe same, without the afternoonFree tiers are capped

Work down that table in order. Most people who land on this question are looking for row one and have never heard of it.


1. Other contacts — the free answer most people never find

If you have emailed someone and never saved them, Google has probably saved them for you already. Google Contacts calls this Other contacts, and it is the fastest route by a distance.

  1. Go to contacts.google.com
  2. In the left sidebar, click Other contacts

Google's own description: "If you email someone but you haven't added them as a contact, Google Contacts automatically saves their email address in your 'Other contacts' group."

Two things nobody mentions.

It is desktop only. Google states plainly that on iPhone, iPad or Android you will not see Other contacts at all.

And it can be switched off — in two separate places. Your Google Account under People & sharing → Contacts → Contact info saved from interactions, and in Gmail under Settings → Create contacts for auto-complete, where one of the options is "I'll add contacts myself."

If Other contacts is empty, one of those settings is why. It is also worth checking before you conclude the feature is broken.

The catch is that Other contacts is everything, in one undifferentiated pile. There is no filtering, no date range, no "only people from this label." If you want some of your correspondents rather than all of them, keep reading.


2. Export your contacts to CSV

Once the people you want are actually in Contacts:

  1. Go to contacts.google.com
  2. Tick the contacts you want. For everything, tick any contact, then top-left Selection Actions → All
  3. Top right, More actions → Export
  4. Choose Google CSV
  5. Click Export

That CSV opens straight in Google Sheets or Excel.

The limitation is real, and it is the same one as above. This exports contact records. It has no idea what is in your mail, so it cannot answer "everyone I emailed under label:clients in the last six months." Contacts and Gmail are separate products that happen to share an account.


3. Google Takeout — the route that sounds right and isn't

Takeout at takeout.google.com exports Gmail in three steps: Select data → Customize archive → Receive archive. What comes back is message content, headers and attachments — the whole mailbox, in a mail-archive format built for importing into another mail client.

It is a genuinely good backup. It is a poor address list:

  • No column structure. It is not a spreadsheet and does not become one. Getting addresses out means parsing the archive yourself.
  • No deduplication. A contact who appears in 40 threads appears 40 times.
  • No real scoping. You can choose which labels to include, but not "only the last six months" or "only from this sender."
  • Not instant. Google notes the export "could take from a few minutes to a few days" depending on account size. Encrypted messages stay encrypted.

Takeout is the right tool for backing up or migrating a mailbox. It is the wrong tool for building a list.


4. Apps Script — full control, and a six-minute wall

This is the DIY route, and the first one that actually matches the job. The Gmail service in Apps Script gives you everything you need: search your mail, walk the matching threads, read the From, To and Cc fields off each message, write the results to a Sheet.

The scoping happens in the search string — and the same string works in the Gmail search box, in Apps Script and in the Gmail API, so you only ever learn it once:

label:clients newer_than:6m has:attachment

The operators worth knowing

OperatorWhat it doesExample
label:Restricts to one Gmail labellabel:clients
from:A sender, or a whole domainfrom:@acme.com
to:Messages sent to an addressto:sales@yourcompany.com
cc:Messages where an address was copiedcc:me
newer_than:Relative recencynewer_than:6m
older_than:Everything before a pointolder_than:2y
after: / before:Absolute date boundsafter:2026/01/01
has:attachmentOnly messages with files attachedhas:attachment
list:A mailing-list address-list:news@example.com
category:One of Gmail's inbox categoriescategory:primary

list: is the underrated one. Prefixed with a minus, it is the clean way to drop a newsletter you keep accidentally collecting.

Combine freely. label:conference-2026 newer_than:3m has:attachment is a real, useful list. in:anywhere is not — it drags in Spam and Trash.

Check the result count in Gmail before you write a line of code. If the query returns 4,000 threads, it is too loose, and the sheet will be noise regardless of how good the script is.

Three things will bite you

  • The address fields are strings, not arrays. getTo() and getCc() return one comma-separated string, and each value arrives as "Display Name" <addr@example.com>. You are splitting, trimming and parsing before you have anything usable.
  • Six minutes. Apps Script kills any single execution at six minutes. A large mailbox needs batching with a stored cursor and a time-driven trigger — which is most of the afternoon this route costs you.
  • Daily read quotas. 20,000 on a personal Gmail account, 50,000 on Google Workspace.

None of these are dealbreakers. They are the reason this route takes an afternoon rather than ten minutes.


Where Contact Extractor fits

Contact Extractor is route four without the afternoon. It runs as an Apps Script add-on inside your own Google account, takes the same Gmail search syntax, and writes the results into a Sheet, deduplicated.

It exists because of the specific gap this page describes: Takeout hands you an archive, and Contacts cannot see your mail. That gap is the whole product.

Step 1: Test the query in Gmail

Build the search in Gmail first, where you can see the results before committing to anything, exactly as above.

Step 2: Open the add-on in the destination Sheet

Create or open the Google Sheet you want the list to land in:

Extensions → Contact Extractor by 8apps → Open App

Step 3: Recreate the search as filters

Enter the same scope you just tested — Gmail label, From, To, Subject, after/before dates, plus any advanced operators under Advanced Options.

A live Gmail-compatible query is assembled as you type, and Verify opens it in Gmail so you can confirm you are looking at the same message set you tested. This is the step that catches a mistake before it becomes a 4,000-row sheet.

Step 4: Choose which fields to read

Rather than dumping whole messages, you choose which parts of each message to read. Each match returns the email address and the name attached to it:

FieldUse it when
FromYou want the people who wrote to you
ToYou want the people a message was addressed to
CCYou want everyone looped into a thread — often the widest useful net
BCCYou are working through your own sent mail
Reply-toSenders route replies to a different address than they send from
Subject lineAddresses appear in subjects, e.g. forwarded enquiries
Message bodyAddresses are written in signatures or inside the message text

Start narrow. From and CC cover most real cases. Adding Message body widens the catch considerably, but also pulls in every no-reply address written into a footer.

Step 5: Exclude your own domain

Put your own domain in the Exclude domains field — just yourcompany.com, not a full address. Without this, a large share of most exports is your own colleagues.

Step 6: Save and extract

Addresses are written into the Sheet, deduplicated as they go. Someone who appears across 40 threads appears once.

If the underlying message set keeps growing — a live label, a shared alias, an ongoing campaign — set the task to run hourly and the Sheet stays current on its own.

Contact Extractor on the Google Workspace Marketplace


Cleaning up the sheet

Whichever route you took, a cleanup pass is worth it:

  • Filter out no-reply addresses. =FILTER(A2:A, NOT(REGEXMATCH(A2:A, "(?i)no-?reply|donotreply")))
  • Group by domain to see which companies are actually represented: =ARRAYFORMULA(IFERROR(REGEXEXTRACT(A2:A, "@(.*)$")))
  • Re-check for duplicates if you have combined several exports: =UNIQUE(A2:A)

Before you email any of it

Extracting addresses from your own mailbox is a records exercise. Emailing that list is a marketing act, and only the second one is regulated.

Google's sender guidelines are blunt: "Don't send messages to people who didn't sign up to get messages from you", and "Don't purchase email addresses from other companies."

The FTC is equally clear that there is no business-to-business carve-out — "The law makes no exception for business-to-business email" — and it lists automated address collection among the aggravated violations under CAN-SPAM.

The practical version: keep the people you have genuinely corresponded with. Drop list: matches, no-reply senders, and addresses that only ever appeared in a CC chain. A list built from real correspondence is both more defensible and considerably more likely to get a reply.


A note on permissions

Any tool that reads your Gmail will ask for Gmail access through Google's own consent screen, and you should read what it asks for. Two things worth checking on anything you install:

  1. Does it process your mail inside your Google account, or send it to a third-party server?
  2. Has it been through Google's security review?

Contact Extractor runs as an Apps Script add-on in your own Google account, writes only to the Sheet you choose, and is CASA 2 certified. It reads the messages your filters match, and only the fields you select — pulling the email addresses and names it finds there, and nothing else.


Which route should you use?

You want to…Use
Everyone you have ever emailed, no filtering neededOther contacts
A CSV of contacts you have already savedGoogle Contacts → Export
Back up or migrate an entire mailboxGoogle Takeout
Addresses from a specific search, and you can codeApps Script
Addresses from a specific search, and you cannotAn add-on
Three addresses from one threadCopy and paste, honestly

The last row matters. Not every job needs a tool.


Sources


Related reading