The Scenario
Your marketing ops analyst ran a deduplication report last week. The output is a Google Sheet with 300 rows — a mix of bounced email addresses, exact duplicate contacts, and records that got created twice when the webinar platform synced without checking for existing entries. All 300 need to be deleted from Google Contacts before the next CRM sync runs, or you'll import garbage into the new system.
The list is already in the sheet. Column A has the email addresses. You need them gone from Google Contacts, and you need confirmation that they're gone so you can close the ticket.
The bad version:
- Search Google Contacts for each email one at a time, open the contact, click the three-dot menu, click Delete, confirm, go back, type the next email — for 300 rows
- Export all contacts, delete the 300 rows in the CSV, then try to figure out how to make Google Contacts reflect the deletions (it doesn't: re-importing a CSV doesn't delete existing contacts)
- Write a script using the People API batchDeleteContacts endpoint, debug the authentication, figure out why it's only processing 25 contacts per call and how to handle pagination, and track which rows failed
The CRM sync is scheduled for Friday. This needs to be done Thursday night at the latest.
The Easy Way: One Prompt in SheetXAI
SheetXAI is an AI agent that lives inside your Google Sheet. It can find each contact by email address, delete them from Google Contacts, and write back a status for every row — in a single pass.
For each email address in column A of my "Contacts to Delete" sheet, search Google Contacts for a match and delete that contact — write "deleted" or "not found" back to column B for each row
What You Get
- Each email in column A looked up against Google Contacts to find the contact's resource name
- Matching contacts deleted from Google Contacts using the batch delete endpoint
- Column B written back with "deleted" for each successful deletion and "not found" for any email that had no matching contact
- Any errors (rate limit, malformed resource name) written to column B so you know exactly which rows need a second look
- A clean audit trail you can attach to the ticket
What If the Data Is Not Quite Ready
You want to review before deleting — you need the contact's display name and organization written to the sheet first
For each email in column A of my "Contacts to Delete" sheet, look up the Google Contact and write their display name to column B and their organization to column C — do not delete yet, just populate the review columns
Some rows have resource names in column B already (from a previous lookup) — use those directly instead of re-searching by email
Delete all Google Contacts whose resource names are listed in column B of my "Contacts to Delete" sheet in a single batch delete operation — write "deleted" or the error to column C for each row
You want to skip contacts that have been updated in the last 30 days — only delete older stale records
For each email in column A of my "Contacts to Delete" sheet, find the Google Contact and check their Last Updated date — delete only contacts last updated before 2026-04-14, write "deleted", "skipped – recent", or "not found" to column B
You want a combined cleanup + delete: deduplicate by email first, then delete the lower-quality record
Look at column A of my "Contacts to Delete" sheet — if any email appears more than once, keep only the first occurrence and mark the rest as "duplicate – skip" in column B — then for each remaining unique email, find the Google Contact and delete it, writing "deleted" or "not found" to column C
The deduplication and the deletion happen in one instruction, not two separate passes.
Try It
Get the 7-day free trial of SheetXAI and open your list of contacts to remove — a single email-per-row column is all you need — then ask SheetXAI to find and delete the matches from Google Contacts. For related tasks, see Export All Google Contacts to a Google Sheet and the Google Contacts overview.
