How to Connect Gmail With Google Sheets in 2026: 3 Ways
Log Gmail emails in a Google Sheet automatically with a free Apps Script, a Workspace Studio flow or Zapier, and get an email when the sheet changes.
Gmail has no built-in button that sends emails to Google Sheets, so you connect the two with one of three tools: a free Google Apps Script that copies labeled emails into rows, a Google Workspace Studio flow with an Add a row step, or a Zapier Zap from a Gmail trigger to Create Spreadsheet Row. Going the other way, Google Sheets can email you when the sheet changes.
The reason people want this is usually the same: a stream of emails that has to become a list. Inquiries from a contact form, invoices, applications, order confirmations. Inbox search finds one message, but it can't show you fifty of them side by side with a status column. Below are the three ways to log Gmail in a sheet, what each costs and where each one breaks, plus the Sheets settings that send email back to you and the usual reasons rows stop appearing.
Method | Direction | Works on | Cost |
|---|---|---|---|
Google Apps Script | Gmail to Sheets (and back) | Any Google account | Free, within daily quotas |
Google Workspace Studio | Gmail to Sheets | Eligible Workspace editions; personal accounts through Workspace Experiments | Included where available |
Zapier | Both directions | Gmail, plus a Zapier account | Free for 100 tasks a month, then paid |
Sheets notification rules | Sheets to Gmail | Google Sheets (conditional rules on some work and school accounts) | Free |
Each row is explained, with its source, in the sections below.
Can you connect Gmail to Google Sheets without an add-on?
Yes. Google Apps Script is built into every Google Sheet under Extensions > Apps Script, and it can read Gmail and write rows with no add-on and no extra account. What you give up is the point-and-click setup: you paste a short script and run it yourself. If code is a dealbreaker, Workspace Studio (on eligible plans) or Zapier does the same job without it.
Whichever you pick, the setup starts in Gmail, not in the sheet. A Gmail filter decides which emails count. The filter can apply a label automatically, using the criteria you set under the search options icon in the Gmail search bar, per Google's filter help page. The script, the flow or the Zap then only has to watch that label.
Plan the sheet before you connect anything
The connection is only as useful as the columns it fills. Decide what you'll do with each row, then keep only the fields that help you do it. For a log of inquiries, this is enough:
- Date received, so you can sort oldest first and see what's waiting.
- From, the sender's name and address.
- Subject.
- Snippet, the first couple of hundred characters of the body, not the whole thing.
- Link back to the email in Gmail.
- Status and Owner, which you fill in by hand.
My first inquiry log copied the full body of every email into one column. Within a week the rows were so tall that the sheet was harder to scan than the inbox it replaced. Now the sheet holds a short snippet and a link, and the email itself stays in Gmail where it's readable.
Put the header row in row 1 before you start. Zapier needs it to map fields, and it keeps a script's output lined up.
How to save Gmail emails to Google Sheets with Apps Script (free)
Apps Script can search Gmail, read each message's date, sender, subject and body, and append a row to a sheet, then run on its own every few minutes or hours. It's free on any Google account, inside the daily quotas below.
Step 1: Label the emails you want logged
- In the Gmail web app, open the search options from the Gmail search bar.
- Enter the criteria, such as the address your contact form sends from in From, or a phrase in Subject.
- Click Create filter.
- Tick Apply the label, create a label called tolog, and click Create filter again.
Keep the label name to one word. The script below finds emails with the Gmail search `label:tolog`, the same `label:` operator listed on Google's search operators page, and a one-word name avoids any doubt about how spaces are handled.
Step 2: Paste the script
- Create a Google Sheet, rename the first tab Emails, and add the headers Date, From, Subject, Snippet and Link in row 1. Status and Owner can go after Link; the script leaves them blank for you.
- Click Extensions > Apps Script.
- Delete the sample code and paste the script below.
- Click Save, then Run.
- Approve the permissions. The script asks to read your Gmail and edit the sheet, because it acts as you.
function logLabeledEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Emails');
var toLog = GmailApp.getUserLabelByName('tolog');
var logged = GmailApp.getUserLabelByName('logged') || GmailApp.createLabel('logged');
// Up to 50 conversations per run keeps each run well under the time limit.
var threads = GmailApp.search('label:tolog', 0, 50);
threads.forEach(function (thread) {
var first = thread.getMessages()[0];
sheet.appendRow([
first.getDate(),
first.getFrom(),
first.getSubject(),
first.getPlainBody().slice(0, 200),
thread.getPermalink()
]);
thread.removeLabel(toLog);
thread.addLabel(logged);
});
}Every method in it is documented: GmailApp for the search and labels, GmailThread for adding and removing labels and the thread link, GmailMessage for the date, sender, subject and plain-text body, and Sheet.appendRow, which adds a row below the existing data. After a thread is logged, the script swaps tolog for logged, so the next run doesn't copy it twice.
It reads the first message in each conversation, which is the original inquiry rather than your reply. If you'd rather log every message in a thread, loop through `thread.getMessages()` instead of taking item zero.
Step 3: Make it run on its own
- In the Apps Script editor, click Triggers in the left sidebar.
- Click Add Trigger in the lower-right corner.
- Choose logLabeledEmails, set the event source to Time-driven, and pick an interval, such as every hour.
- Click Save.
A time-driven trigger can fire every minute at its fastest and monthly at its slowest, and an installable trigger always runs under the account of the person who created it, per Google's trigger guide. That second point matters on a shared sheet: the log reads your inbox and runs as you, so before you hand the sheet over or go on leave, tell someone where the trigger lives.
Apps Script limits for Gmail and Sheets
Limit | Personal Gmail account | Google Workspace account |
|---|---|---|
Gmail reads and writes per day (not sending) | 20,000 | 50,000 |
Time per script run | 6 minutes | 6 minutes |
Total trigger runtime per day | 90 minutes | 6 hours |
Triggers per user per script | 20 | 20 |
The numbers come from Google's Apps Script quotas page, which also says any quota can change without notice. An inbox log of a few dozen emails a day sits far below all of them. The 6-minute ceiling is why the script handles 50 conversations at a time: a backlog of thousands gets worked through over several runs instead of timing out in one.
How to log Gmail emails in Google Sheets with Workspace Studio
Google Workspace Studio builds the same connection without code: a When I get an email starter followed by a Sheets Add a row step. It's available on eligible Google Workspace editions, including the Business and Enterprise tiers Google lists, with Gemini turned on by your admin, and personal Gmail accounts need Google Workspace Experiments, according to Google's access page.
- Open studio.workspace.google.com in a desktop browser.
- Click Choose a Starter and pick When I get an email.
- Narrow it with the conditions on offer, such as From, Subject has, Has the words or Has attachment, and tick Skip thread replies to log only new conversations.
- Add the step Add a row, choose the spreadsheet and tab, and fill each column from the email's details.
- Click Test run, then Start.
- When the test row looks right, click Turn on.
Studio has one feature the script lacks: the Gemini Extract step can pull named details out of an email, such as an order number, a company name or a requested date, before the Add a row step writes them, per Google's list of starters and steps. For messy, human-written emails, that saves a column of manual copying.
Custom labels aren't available
The When I get an email starter only offers Gmail's default labels, not your own, and it can't filter by date, per Google's starters and steps page. So a Gmail filter that applies your own label won't help here: put the sender, subject or keyword conditions on the starter instead. Also note that a test run takes real actions, so it adds a real row.
How to connect Gmail and Google Sheets with Zapier
Zapier connects Gmail to Google Sheets with a two-step Zap: a Gmail trigger, such as New Labeled Email or New Email Matching Search, and the Google Sheets action Create Spreadsheet Row. It needs no code, and Zapier's Gmail and Google Sheets page lists the triggers and actions available.
- In Zapier, start a new Zap.
- For the trigger, pick Gmail and the event New Labeled Email, then connect the Gmail account and select the label your filter applies.
- Test the trigger so Zapier pulls in a sample email.
- Add Google Sheets as the action app and choose Create Spreadsheet Row.
- Pick the spreadsheet and worksheet, then match each column header to a field from the sample email, such as the date, sender and subject.
- Test the action, check that the new row appeared in the sheet, and switch the Zap on.
Other Gmail triggers suit other jobs. New Attachment fires on emails with files, New Email Matching Search takes a Gmail search like `from:orders@example.com has:attachment`, and New Starred Email fires when you star a message within two days of receiving it. New Labeled Conversation fires only the first time a label is added to a conversation, so later replies in that thread won't add rows.
What Zapier costs for an email log
The Free plan gives you 100 tasks per month, two-step Zaps only, and Zapier looks for new emails once every 15 minutes. The entry Professional tier is 750 tasks for $29.99 on monthly billing (annual billing brings the monthly rate down to $19.99), and it looks every 2 minutes, per Zapier's pricing page. Only successful action steps use tasks; triggers never do, according to Zapier's task usage guide.
So in a Gmail-to-Sheets Zap, one logged email is one task. Five labeled emails per workday, over a month of 20 workdays, is exactly 100, which is the whole free allowance. When I'm deciding whether a log belongs in Zapier, I count the emails that would hit the label in a normal week and multiply by four. If that number is comfortably under 100, the free plan is fine. If it isn't, the free Apps Script route usually makes more sense than paying for tasks that only copy text between two Google apps.
Zapier earns its fee when the email has to go somewhere outside Google as well, such as a CRM or a project board. For how its pricing compares with Make and n8n, see our look at Zapier alternatives.
How to get a Gmail notification when a Google Sheet changes
Google Sheets can email you whenever the spreadsheet changes, with no script at all. Open the sheet, click Tools > Notification settings > Edit notifications, choose Any changes are made or A user submits a form, then Email - daily digest or Email - right away, and click Save, per Google's notification help page. These rules apply only to you, so each collaborator sets their own.
For alerts about one column only, some work and school accounts also have Tools > Conditional notifications. You pick a column or range to watch, add a condition such as a status cell reading exactly "Urgent", and choose who gets the email, typed in or taken from a column of addresses. Google's conditional notifications page notes that only individual Gmail or Workspace addresses work (no groups, no Outlook or Yahoo), that emails may not be immediate, and that several changes can arrive as one email.
On a shared inquiry log, I set a conditional rule on the Owner column so whoever is named in it gets an email the moment a row is assigned to them. It's the cheapest handoff there is: nobody has to write "this one's yours" in a separate message.
How to send emails from Google Sheets
To send emails from rows in a sheet, such as one personalized message per contact, use a mail merge. Gmail's built-in mail merge can read recipients from a Google Sheet if your Workspace edition includes it, and Google publishes a free Apps Script mail merge sample for any account. Both are covered step by step in our Gmail mail merge guide.
For a single alert per new row, such as emailing a teammate whenever a form adds a line, the Zapier route above works in reverse: a Google Sheets new-row trigger followed by a Gmail send-email action, so each new line in the sheet sends one message.
Why emails aren't showing up in your Google Sheet
When rows stop appearing, work down this list. The first items are the most common culprits.
- The label never got applied. Search for the label in Gmail first. If the email isn't under it, fix the filter's criteria, not the script.
- The tab has a different name. The script looks for a tab called Emails. If yours is still called "Sheet1", rename it or change the name in the script.
- The trigger owner lost access. A trigger runs under the account that created it, so if that account loses access to the sheet or to the Gmail inbox, the log stops for everyone.
- A subject began with an equals sign. `appendRow` treats a cell starting with "=" as a formula, per Google's Sheet reference, so that subject lands as a formula rather than plain text.
- Studio is watching the wrong thing. A flow can't start from a custom label, so conditions on sender or subject have to do the filtering.
- The Zap is waiting. On Zapier Free, a row can trail the email by up to a quarter of an hour, because that's how often the free plan polls. Check the Zap's run history before changing anything.
The most useful habit for testing any of the three: send yourself one email that matches the filter, with a subject you'll recognize, and watch for that single row. When it lands with the right date, sender and link, turn the automation loose on real mail.
Which way to connect Gmail and Google Sheets
- Write down which emails belong in the sheet, and which columns you'll actually use.
- Create a Gmail filter that labels those emails, if you're using Apps Script or Zapier.
- For a gmail.com address, and if pasting code doesn't put you off, use the Apps Script above with an hourly trigger.
- If your company's Workspace edition includes Studio and you want no code, build a Workspace Studio flow, with an Extract step if the details are buried in the body.
- If the same email also has to reach an app outside Google, use a Zapier Zap, and check the monthly task math first.
- Add a Sheets notification rule so the sheet tells you, or the row's owner, when something changes.
Watch for the email, without the spreadsheet plumbing
Sometimes the sheet is only a means to an end: you want to know when a certain kind of email arrives and have it land in the tool you already use. Merlin, our Mac assistant, doesn't write to Google Sheets, but it can run a routine whenever a matching Gmail message comes in, and add a record to an Airtable base or post a summary to Slack once you've connected those apps. You set the routine up by describing it in chat. Because it works in the background, each Slack post or Airtable record is made without asking you to approve it first, so describe the matching email precisely.
Get MerlinFrequently asked questions
Can Gmail automatically export emails to Google Sheets?
Not on its own. Gmail has no export-to-Sheets setting, so you need Google Apps Script, a Google Workspace Studio flow or a connector like Zapier to copy matching emails into rows.
How do I save Gmail emails to Google Sheets for free?
Label the emails with a Gmail filter, then run a few lines of Google Apps Script from the sheet that searches for that label and appends each email's date, sender, subject and link as a row. A time-driven trigger runs it on a schedule at no cost.
Does Zapier's free plan work for Gmail to Google Sheets?
Yes, for low volume. The free plan allows 100 tasks per month and looks for new emails every 15 minutes, and each email copied into a sheet uses one task.
Can Workspace Studio watch a custom Gmail label?
No. Google says the When I get an email starter only offers Gmail's default labels, so filter by sender, subject or keywords in the starter's conditions instead.
How do I get an email when someone edits my Google Sheet?
Open the sheet, click Tools > Notification settings > Edit notifications, choose Any changes are made and either a daily digest or an email right away, then click Save.
Can I send emails from a Google Sheet?
Yes. Use Gmail's mail merge with a spreadsheet where your Workspace edition offers it, Google's free Apps Script mail merge sample, or a Zapier Zap that sends an email for each new row.