Connect GeoNames to Google Sheets

Enrich your data with geographical reference data — countries, cities, postal codes and coordinates — from the GeoNames database.

What you can pull from GeoNames

GeoNames exposes 1 object you can pull, each as its own job. Every run pulls the records into a flat table, so nested fields arrive as ordinary columns that Google Sheets can sort, filter and total without further work.

Country information

The default endpoint: one row per country, with population, area, currency and language codes. Useful as a reference table to join your own data against.

Columns returned by country information
ColumnTypeNotes
countryCodestringISO 3166-1 alpha-2 — the usual join key
countryNamestring
isoAlpha3string
fipsCodestring
continentstring
continentNamestring
capitalstring
populationinteger
areaInSqKmfloat
currencyCodestring
languagesstringComma-separated locale codes
geonameIdintegerGeoNames’ own stable identifier

Options you can set

endpoint
Which GeoNames endpoint to call — defaults to countryInfoJSON
base_url
GeoNames API base URL. Validated against SSRF rules before the job saves — defaults to http://api.geonames.org
timeout
Request timeout in seconds, up to 300 — defaults to 30

How it lands in Google Sheets

Google Sheets accepts append and overwrite writes. Overwrite replaces the target range, which suits a snapshot; append adds rows underneath, which suits a log you are accumulating. There is no upsert here, so rows are added or replaced rather than merged.

  • Append adds rows below existing content; overwrite replaces the target range.
  • No upsert: a spreadsheet has no primary key, so there is nothing to merge on. Use Airtable or Postgres if rows must be updated in place.
  • Google caps a spreadsheet at 10 million cells across all tabs. Filter before writing rather than after.

Authentication

GeoNames authenticates with an API key held as a stored connection, so it never appears in a spreadsheet cell, a formula, or a shared copy of a sheet.

Keeping runs incremental

Not for this source: Each run fetches the configured endpoint in full. Where that is expensive, narrow the job itself and run it less often.

Because Google Sheets has no upsert, decide what a re-run should mean before you schedule it. Overwrite keeps a current snapshot; append accumulates history and will grow without bound.

Limits and pacing

These are the provider-side ceilings that shape a schedule, not ours. Knowing them up front is the difference between a job that runs quietly every morning and one that starts failing the week your data grows.

LimitValueApplies to
Credits GeoNames throttles by username; a free account is generous for reference data, not for per-row lookups.per-account daily and hourly capsGeoNames

Common gotchas

Most of what goes wrong with a scheduled sync is not a bug — it is a detail of how one side behaves that nobody wrote down. These are the ones that come up for this pair.

It is reference data, not a per-row lookup service

Pull the country table once a week and join against it, rather than calling GeoNames once per row of your own data. The credit limits are sized for the former.

The base URL is SSRF-validated

Pointing it at an internal address is rejected at config time, not at run time, so a bad value fails when you save the job.

An open-ended range beats a padded one

Writing to A2:D is better than A2:D1000 for appends: the padded form reserves rows you may not need and makes the append boundary ambiguous.

Set it up in four steps

  1. 1

    Connect GeoNames

    A GeoNames username, stored as a connection. The free tier needs registration and an activated account.

  2. 2

    Connect Google Sheets

    Connect your Google account once. Paste a spreadsheet URL or ID.

  3. 3

    Shape the data

    Select the columns you want, filter rows, cast types and add computed fields. Everything else is dropped before it reaches the destination.

  4. 4

    Schedule it

    Run once, or on a cron. Every run refreshes Google Sheets with the latest GeoNames data.

Do I need an add-on or extension for this?

No. The job runs server-side and writes into Google Sheets through its API, so there is nothing installed in the spreadsheet itself. It keeps running when nobody has the file open, and a copy of the file does not need anything installed to work.

How often does the data refresh?

On whatever schedule you set with a cron expression — hourly, daily, or a specific time on specific days. Each run pulls the latest from GeoNames.

Do I need to write any code?

No. You connect both sides, map the fields in a wizard and set a schedule. Computed fields accept small expressions — abs, round, min, max, len — but there is nothing to host or maintain.

Is GeoNames free?

The web service is free for registered users, with per-account daily and hourly credit limits. You supply your own username, so the quota is yours rather than shared.

What is this actually for?

Enrichment. Country and place reference data is the sort of thing every team ends up pasting into a tab by hand; pulling it on a schedule means the join key is consistent and nobody is maintaining it.

Do I have to give access to my whole Google Drive?

No. Only the spreadsheets scope is requested. The Drive scope that most spreadsheet tools ask for is a restricted scope granting read access to every file you own; it is deliberately not requested here, which is why you paste a spreadsheet URL rather than browsing Drive.

Will this keep working if I copy the sheet?

The job writes to a specific spreadsheet ID, so a copy will not receive data until you point a job at it. Nothing is installed in the file itself, though, so copying never breaks the original.

Is the GeoNames connector free to use?

You can connect GeoNames and start syncing on the free plan.