Getting Maps data into Google Sheets
Sheets is the best free cleaning room a Maps export can land in, once the data arrives. Here is the import done right, the cleaning steps as Sheets operations, and the honest place Apps Script holds.
Last reviewed
The route that works: extract, then import
Extraction happens outside Sheets, by whatever route fits your volume; Sheets' job begins at the CSV. Import via File > Import > Upload, separator set to comma. Sheets reads UTF-8 correctly by default, which is precisely where Excel corrupts accented business names, so make Sheets the first opener even when the list's final home is elsewhere. The export guide covers the Excel-side traps if the file continues its journey.
The cleaning sequence, as Sheets operations
- De-duplicate on place ID. Data > Data cleanup > Remove duplicates, ticking only the place-ID column. Expect 15-30% of rows to collapse from grid overlap; that shrinkage is correct.
- Filter closures. Create a filter on the closed/status column and delete permanently-closed rows before anything else reads the sheet.
- Normalise phones to E.164. A helper column like
="+44"®EXREPLACE(TEXT(A2,"0"),"[^0-9]","")pattern (adjust country code and leading-zero handling per market) gets most rows; paste-as-values when done. Keep the original column; parsing occasionally needs the source string. - Band review counts. A simple
=IFS(F2<10,"0-9",F2<51,"10-50",TRUE,"51+")column turns the export into the segmented list the workflow calls for. - Stamp the extraction date in a column, not a cell comment, so every downstream copy inherits it.
Refresh diffs in Sheets
Quarterly re-extractions become delta lists with one function: import the new pull to its own
tab, then =ISNUMBER(MATCH(placeID, old_tab_ids, 0)) flags survivors, leaving new
listings (this quarter's openings, the hottest prospects) and vanished IDs (closures, the
do-not-dial list) as filterable rows. Sheets is genuinely good at this join, and it is the
step that makes an extracted list outrun
any bought one.
Where Apps Script honestly fits
Apps Script calling the Places API and writing to a sheet is a real pattern with a narrow sweet spot: small, automatically refreshed datasets, a few hundred places on a dashboard. It inherits every Places API constraint (billing, the ~60-result cap, storage terms), so scaled to lead-list volumes it rebuilds the API problem with worse ergonomics. Use it for monitors, not for metros; and if you are writing serious code anyway, the Python build-vs-buy page is the fuller version of that decision.
Sheets limits worth knowing
Ten million cells per spreadsheet sounds infinite and is not: a 15-column export meets it around 650,000 rows, and performance degrades well before then. Metro lists fit comfortably; multi-country masters belong in a database, with Sheets as the working-segment surface. Which is, per the rationing discipline, how working lists should be handled anyway.