Concatenate, Upper, Contains, Substitute, Trim, Regex — transform stored values into exactly what you need for display, logic, and data cleaning.
Your columns store raw data — a first name here, a last name there, an email address, a raw description imported from a spreadsheet. Text formulas let you reshape that data for display, drive conditional logic from it, clean imported noise out of it, and extract structured pieces from unstructured strings.
Merge multiple columns into one display value. First + Last → Full Name. Domain + Path → URL.
Strip unwanted whitespace, normalize case, replace stale text — critical when importing from other tools.
Check if a string matches a pattern. Pull a substring or domain from an email. Regex gives you full power.
The most common text operation: combining two or more strings into one. Coda gives you two equivalent ways to do it.
Concatenate(thisRow.[First Name], " ", thisRow.[Last Name])
thisRow.[First Name] & " " & thisRow.[Last Name]
| First Name Text | Last Name Text | Full Name Formula |
|---|---|---|
| Alice | Nakamura | Alice Nakamura |
| Bob | Osei | Bob Osei |
| Carol | Ferreira | Carol Ferreira |
thisRow.[First Name] & " " & thisRow.[Last Name]
Concatenate(a, b, c, d, …) — you can join as many strings as you like. The & operator chains only two at a time, but you can chain multiple & operators in one expression.
These three functions normalize case — invaluable when you have inconsistent input from multiple team members or imported data.
Upper("hello world") → "HELLO WORLD"
All characters to uppercase. Useful for headers, codes, acronyms.
Lower("Hello World") → "hello world"
All characters to lowercase. Useful before comparisons to make them case-insensitive.
Proper("hello world") → "Hello World"
Capitalizes the first letter of each word. Great for display names from raw imports.
Returns true or false depending on whether a string includes a substring. Most useful inside an If().
Contains("hello world", "world") → true Contains("hello world", "xyz") → false // Practical: flag rows where notes mention a client If(Contains(thisRow.[Notes], "Acme"), "⭐ Key account", "")
Returns the position (index) of a substring within a string. Returns 0 if not found. Often used to split strings or validate format.
Find("@", "alice@example.com") → 6 Find("@", "notanemail") → 0 (not found)
Replaces every occurrence of a substring with a new string. Great for cleaning up imported data or updating stale terminology across a column.
Substitute("hello world", "world", "Coda") → "hello Coda" // Remove hyphens from phone numbers Substitute(thisRow.[Phone], "-", "")
Removes leading and trailing whitespace. Critical when importing data — invisible spaces break exact-match filters and look identical visually.
Trim(" hello world ") → "hello world" // Always Trim imported text before comparing Trim(thisRow.[Imported Name]) = "Alice"
Trim() on any text column you'll use in comparisons. Invisible leading spaces are the #1 cause of "why isn't my filter working?" bugs.
When you need only part of a string — the first N characters, the last N characters, or a slice from the middle — these four functions have you covered.
| Function | Syntax | Example | Result |
|---|---|---|---|
Left() |
Left(text, n) |
Left("Coda Rules", 4) |
"Coda" |
Right() |
Right(text, n) |
Right("Coda Rules", 5) |
"Rules" |
Mid() |
Mid(text, start, length) |
Mid("Coda Rules", 6, 5) |
"Rules" |
Len() |
Len(text) |
Len("Coda Rules") |
10 |
A practical combination: extract the domain from an email address using Find() to locate the @, then Mid() to take everything after it.
Mid( thisRow.[Email], Find("@", thisRow.[Email]) + 1, Len(thisRow.[Email]) )
Regular expressions give you surgical control over text matching. Coda exposes them through two functions. You don't need to master regex to use them — a few patterns cover the vast majority of real-world needs.
Returns true or false. Use it inside If() to validate format — emails, phone numbers, URLs, postal codes.
If( RegexMatch( thisRow.[Email], "^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,}$" ), "✓ Valid", "✗ Invalid" )
Returns the first substring that matches the pattern — or empty string if nothing matches. Use it to pull structured data out of messy free-text fields.
RegexExtract( thisRow.[Description], "https?://[^\s]+" ) → "https://example.com" (first URL found in the text)
^[0-9]+$ — digits only ·
^[A-Z]{2,3}$ — 2–3 uppercase letters ·
https?://[^\s]+ — any URL ·
\d{4}-\d{2}-\d{2} — ISO date format
| Name | Email Text | Valid? Formula |
|---|---|---|
| Alice | alice@example.com | ✓ Valid |
| Bob | bob AT example DOT com | ✗ Invalid |
| Carol | carol@co.uk | ✓ Valid |
| Dave | not-an-email | ✗ Invalid |