By Raj
Part of our Google Workspace Automation guides. Need this built for your team? Hire a Google Apps Script developer.
Estimated reading time: 10 minutes
Parse Incoming Gmail with Apps Script: Extract Data to Sheets
Gmail parsers extract order numbers, tracking IDs, or invoice totals from email bodies into structured Sheet rows. Regex on plainTextBody works for predictable templates; HTML bodies need stripTags or parseHtml if structured.
Mark processed threads with Gmail label processed to keep idempotency. Search unprocessed queue each run with label:parser-queue -label:processed.
Combine with /blog/apps-script-gmail-automation for labeling and Drive attachment saves.
Thread search window
GmailApp.search('from:vendor@example.com subject:Shipment newer_than:2d', 0, 100) caps batch size.
Store last run timestamp in Properties to use after:YYYY/MM/DD in query.
Regex extraction
const m = body.match(/Order\s+#(\d+)/); if (m) orderId = m[1]; Handle multipart messages by reading last message in thread.
Log parse failures to Exceptions sheet with snippet first 200 chars—not full body PII.
Sheet writes
Append [date, from, orderId, amount] with setValues single row. Dedupe if orderId already in column A.
Use LockService if webhook and parser might race.
HTML emails
getBody() returns HTML—strip tags with crude regex or XmlService if table layout predictable.
Prefer vendors sending structured JSON attachments when possible.
Example code
function parseShippingEmails() {
const threads = GmailApp.search('from:shipping@carrier.com -label:parsed', 0, 30);
const sh = SpreadsheetApp.openById('OPS_ID').getSheetByName('Shipments');
threads.forEach(function (t) {
const body = t.getMessages().pop().getPlainBody();
const tracking = (body.match(/Tracking:\s*(\w+)/) || [])[1];
if (!tracking) return;
sh.appendRow([new Date(), tracking, t.getFirstMessageSubject()]);
t.addLabel(GmailApp.getUserLabelByName('parsed') || GmailApp.createLabel('parsed'));
});
}| Approach | Best for | Tradeoff |
|---|---|---|
| Apps Script native | Google Workspace-centric workflows | 6-min limit, quotas |
| Zapier / Make | No-code, many connectors | Per-task cost, vendor lock-in |
| Python + Cloud | Heavy data / ML | Hosting cost, separate auth |
| Google Workspace automation | Production custom logic | Build cost, you own code |
FAQ
Why plain body empty?
Some senders HTML-only—use getBody() and strip tags or request text multipart from vendor.
Can AI parse instead?
OpenAI classification possible—see /blog/apps-script-openai-integration—cost vs regex maintenance tradeoff.
Attachment CSV parse?
getAttachments()[0].getDataAsString() then Utilities.parseCsv—often cleaner than body regex.
Shared mailbox?
Delegate access or central mailbox with delegation—Script runs as authorized user.
Errors in production?
See /blog/google-apps-script-debugging-guide for execution transcripts.
Need this done for you? I handle this as part of my consulting work — fixed-price quote within 24 hours.
Book a call with Raj →Get the full Parse Incoming Gmail with Apps Script script template
I'll email you a production-ready, commented version you can deploy in 10 minutes.
Continue reading
Gmail, Drive & Workspace
Sync Google Calendar to Sheets: Events and Availability
Gmail, Drive & Workspace
Sync Google Calendar with Microsoft Outlook (Apps Script + Graph)
Gmail, Drive & Workspace
Gmail Automation with Google Apps Script: Filters, Labels & Auto-Reply
From another topic
How to Automate Google Sheets with Apps Script (Beginner Guide) →Need help with this? I handle this as part of my Google Workspace Automation service.
Gmail, Drive, Docs, Forms, and Calendar automation.
See how it works →