Airtable Attachments in Google Sheets: What Actually Syncs

Airtable attachment fields sync to Google Sheets as filename plus URL text, and those URLs stay live for as little as 2 hours. Here is exactly what lands in the cell.

Title card for the post, showing an Airtable table panel connected by a downward arrow to a Google Sheets panel on a dark background

The short answer

An Airtable attachment field syncs to Google Sheets as text: the filename, then the file URL in parentheses. Multiple files in one field become one comma-separated cell. The files themselves are not copied anywhere. They stay in Airtable, and the URL that lands in your spreadsheet stops resolving within hours.

That last part surprises people, so it is worth being exact about what is happening and what to do instead.

What an attachment field actually holds

In Airtable, an attachment field is not a link. It is an array of objects, one per file. Each object carries id, url, filename, size, type (the MIME type), and, for images, width, height, and a thumbnails object holding small, large, and full variants, each with its own url, width, and height.

A record with two files attached returns something shaped like this:

[
  { "id": "att1", "filename": "brief.pdf", "url": "https://.../brief.pdf" },
  { "id": "att2", "filename": "spec.png", "url": "https://.../spec.png" }
]

A spreadsheet cell holds one value. So every sync tool has to decide how to flatten that array into a single string, and the decision it makes is the whole story of how usable your synced attachment column will be.

Two panels side by side. On the left, an Airtable attachment cell holding a JSON array of two file objects, each with id, filename and url. On the right, the single Google Sheets cell it becomes, reading brief.pdf and spec.png with each URL in parentheses, separated by a comma.

What Airtable to Sheets writes into the cell

The add-on flattens each file to filename (url) and joins the files with a comma and a space. From the field transformer:

function attachmentValue(value: unknown): string {
  const named = value as NamedValue;
  if (named.filename && named.url) {
    return `${named.filename} (${named.url})`;
  }
  return named.filename ?? named.url ?? namedValue(value);
}

So a record with two attachments produces one cell containing:

brief.pdf (https://example.com/brief.pdf), spec.png (https://example.com/spec.png)

Three details follow from that code, and each one matters more than it looks:

The filename comes first. If a file has no filename in the API response, the cell falls back to the bare URL. The filename is the durable part of the value, and putting it first is deliberate. It is the part that still means something after the URL dies.

The value is plain text, not a clickable formula. The add-on does build =HYPERLINK() formulas for one field type, the Airtable button field, because a button's target URL is stable. Attachment URLs get no such treatment. A link that breaks the same afternoon should not look like a permanent link in your sheet.

Nothing is downloaded. No copy is made in Google Drive. No image is embedded. The cell references a file that lives in Airtable, and only Airtable holds the file.

Attachment fields are also flagged as not writable, so no edit made in the spreadsheet can add, replace, or remove a file in Airtable. Your files are never at risk from a bad paste in a synced sheet.

Why the URLs expire

Airtable serves attachment files from signed, time-limited URLs. Airtable commits to keeping a download URL active for at least 2 hours after its API returns it, and states plainly that it may change that window. Treat 2 hours as a floor, not a promise of exactly how long you have. Open the link right away and you get the file. Open it tomorrow and you get an error.

This is Airtable platform behavior, not a defect in any sync tool, and no tool can work around it. Every product that reads attachments through the Airtable API receives the same short-lived URLs. Anyone advertising permanently mirrored attachment links is either copying your files to their own storage or is not telling you the whole picture.

To be fair to Airtable, the design is reasonable. Permanent public URLs to every file in every base would be a serious data-exposure problem. Short-lived signed URLs mean a leaked spreadsheet does not leak your files.

The practical consequence is simple. Treat a synced attachment URL as valid for the sync run that produced it, and not much longer.

Two bars over one shared timeline. The URL bar is solid green from the sync run until a few hours later, then switches to red hatching for the rest of the timeline. The filename bar stays green from the sync run through to next quarter.

What to do instead

Sync the filename, and rely on it. The filename is the stable half of the value. Q3-contract-signed.pdf still identifies the right file next quarter. The URL next to it does not. If you only need to know which record has which document, filename alone answers the question forever.

Keep Airtable as the system of record for files. Sheets is the reporting surface. Airtable is where the files live. Pull the record ID or a primary-field value into the sheet alongside the filename, so anyone reading the report can find the record in Airtable and open the current file from there.

Use the URL for short-lived work only. Fetching images into a fresh dashboard, running a one-off batch download the same day, spot-checking that files exist: all fine. Sync, use, done.

Count instead of listing, when counting is the real need. Plenty of reports do not need the files at all. They need to know whether a record has any. A helper column such as =IF(D2="",0,COUNTA(SPLIT(D2,","))) over the synced attachment column gives you a rough per-record file count you can pivot and chart on, and it never expires. Verify the split against filenames that themselves contain commas before trusting it.

Do not build IMAGE() formulas on synced URLs. =IMAGE(...) pointed at an Airtable attachment URL renders once and then breaks. A grid of broken image icons is worse than no images, because it looks like your sheet is failing rather than like the design working as intended.

What this means for reports and dashboards

If you are building anything that people will open more than once, assume the URL column is dead on arrival for them.

Design around the fields that stay true between syncs: filenames, counts, whether a file exists, the record it belongs to. Those support every chart, filter, and pivot you would reasonably want. A "Has attachment" column and a filename column carry almost all the analytical value of an attachment field, with none of the expiry problem.

Reserve URLs for pages that get generated, read, and discarded inside the same day. If a stakeholder needs to open files regularly, send them to Airtable. That is not a workaround. It is the correct place for the file to be opened from, and it means permissions stay where you set them.

FAQ

Does syncing copy my Airtable files into Google Drive? No. The sync writes the filename and the URL as text. The files stay in Airtable and no copy is created in Drive.

How long do Airtable attachment URLs work? Within hours of the sync, they stop resolving. Airtable serves attachments from signed, time-limited URLs. Plan for the URL to be useful only right after the sync that fetched it.

Can I make the attachment links clickable? You can wrap the URL in =HYPERLINK() yourself, but the link will break on the same schedule as the raw URL. The add-on deliberately writes attachments as plain text for that reason.

What happens with multiple files in one attachment field? They all land in the same cell, comma-separated, each as filename (url).

Can I edit the attachment column in Sheets to change files in Airtable? No. Attachment fields are not writable, so edits in the spreadsheet do not reach your Airtable files.

Do image thumbnails come through? No. Only the filename and the main file URL are written to the cell.

Related reading

  • How to sync Airtable to Google Sheets covers the full setup, including the two methods that do not need an add-on.
  • Support answers questions about field mapping, scheduled syncs, and reconnecting an expired Airtable connection.
  • Pricing is flat per account, with no per-user charge and no record cap.