Basics Above Else
In this chapter, we’ll cover the basics to help you:
With these foundations in place, we’ll be ready to dive into the real fun.
Data Logic Interface
Airtable is like a spreadsheet on steroids. Here’s what makes it special:
The big difference from Excel/Google Sheets:
There are integrations and plenty of things. But saddly, I haven’t use a lot from those, as at the moment of writing this I was focused (at least at the beginning) on JIRA automation.
An interesting feature to get data from other tables outside of your base.
This is an endpoint configuration that allows you to make updates to a page associated with it. Once created from the integrations menu, it will give you a query like this:
curl -X POST "https://api.airtable.com/v0/{baseId}/{tableIdOrName}/sync/{apiEndpointSyncId}" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: text/csv" \
--data 'column1,column2
row1-column1,row1-column2
row2-column1,row2-column2'
That endpoint will be public.
One would expect to have an option to provide a way to upload a file, but no.
My workaround was to cat the CSV file:
curl -X POST "https://api.airtable.com/v0/{baseId}/{tableIdOrName}/sync/{apiEndpointSyncId}" \
-H "Authorization: Bearer YOURAWESOMETOKENHERE" \
-H "Content-Type: text/csv" \
--data "$(cat myspreedsheet.csv)"
And yes, because of this I had to export the table as CSV, but without the descriptions or descriptions updates, as it breaks the format…
But that wasn’t the full extend of the problem! 5 days for us, it’s about 118 records, were more than what it could handle. In theory it was 10.000 characters, I first I fought it was “ah 10K rows”
Rather than rehashing the docs, I’ll only add notes to stuff that’s worth mentioning. Let’s dive in!
The core!
CONCATENATE()
: Joins text stringsLEFT()
, RIGHT()
: Extract charactersFIND()
: Locate substringsSUBSTITUTE()
: Replace textSUM()
, AVERAGE()
: Basic calculationsROUND()
, FLOOR()
, CEILING()
: Number formattingMAX()
, MIN()
: Value comparisonIF()
: Conditional operationsAND()
, OR()
: Multiple conditionsSWITCH()
: Multiple case handling // Get working days between dates (excluding weekends)
WORKDAY_DIFF({Start Date}, {End Date})
// Add business days to a date
WORKDAY_ADD({Start Date}, 10)
// Format date as custom string
DATETIME_FORMAT({Date Field}, 'MMMM D, YYYY')
Complex Text Processing
// Extract domain from email
REGEX_EXTRACT({Email}, '@(.+)$')
// Create slug from title
LOWER(
SUBSTITUTE(
REGEX_REPLACE({Title}, '[^a-zA-Z0-9\\s]', ''),
' ',
'-'
)
)
// Concatenate with conditional formatting
IF(
{Status} = 'Urgent',
CONCATENATE('🚨 ', {Task Name}),
{Task Name}
)
// Weighted average calculation
(SUM({Score} * {Weight})) / SUM({Weight})
// Running total with conditions
ROUND(
SUM(
IF(
{Date} <= TODAY(),
{Amount},
0
)
),
2
)
// Status based on multiple conditions
SWITCH(
TRUE(),
{Progress} = 100, 'Complete',
{Progress} >= 75, 'Almost Done',
{Progress} >= 25, 'In Progress',
{Progress} > 0, 'Just Started',
'Not Started'
)
// Dynamic color coding
IF(
AND({Status} = 'Active', {Days Remaining} < 7),
'red',
IF(
AND({Status} = 'Active', {Days Remaining} < 14),
'yellow',
'green'
)
)
// Unique values from linked records
ARRAYUNIQUE(
ARRAYFLATTEN(
VALUES({Linked Records})
)
)
// Count items matching criteria
COUNTIF(
SPLIT({Tags}, ','),
'priority'
)
# if empty use another field, otherwise use original
IF(
OR({Primary Field} = '', {Primary Field} = BLANK()),
{Backup Field},
{Primary Field}
)
If you ever consider this for personal use, then you need to keep the following in mind: