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.

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.
