π§© AirtablePro
An extension for KodularAirtable Pro β Full featured extension
Specifications
Package: com.jsr.airtablepro
Size: 46.53 KB
Minimum API Level: 14
Updated On: 2025-12-10T18:30:00Z
Built & documented using: FAST v5.2.0-premium
Extension V1 : com.jsr.airtablepro_v2.0.aix (46.5 KB)
Special Thanks to @JEWEL for his wounderful platform for building extension
Events:
Say goodbye to complex API integrations and hello to seamless Airtable connectivity! AirtablePro is a powerful, user-friendly extension that lets you create, read, update, delete, search, filter, sort, and manage your Airtable data directly from your app β all with simple drag-and-drop blocks. Whether youβre building a to-do list, inventory tracker, CRM, or data dashboard, AirtablePro gives you full control over your Airtable base with real-time feedback, progress tracking, error handling, and precise cell-level operations
Absolutely! Below is a comprehensive user guide for your AirtablePro extension, tailored for Kodular and MIT App Inventor users.
This guide explains exactly how to use each function β including which blocks to use, how to structure lists, and what data types to provide.
AirtablePro User Guide
For Kodular & MIT App Inventor
Prerequisites
- Create an Airtable account and a Base (database).
- Get your Base ID (from URL:
https://airtable.com/appXXXXXXXXXXXXXX/...) - Generate a Personal Access Token (PAT) from Airtable Account Settings
- Add the
AirtableProextension to your project
Set Up Your Component (Designer View)
| Property | How to Set | Example |
|---|---|---|
BaseId |
Text block | "appXXXXXXXXXXXXXX" |
TableName |
Text block | "Tasks" |
Token |
Text block | "patXXXXXXXXXXXXXXXXXXXX" |
ViewName |
(Optional) Text block | "Grid view" |
Tip: Store these in variables so you can change them easily.
Core Functions & Block Setup
1. GetAllRecords(autoLoadAll)
Purpose: Fetch all records from your table.
| Parameter | Block Type | Example |
|---|---|---|
autoLoadAll |
Boolean | true (to get all pages) or false (first 100 only) |
How to use:
- Use a
call AirtablePro.GetAllRecordsblock - Handle result in
GotAllRecordsevent:records: List of rows (each row is a list)columns: List of column names
Note: Row 1 = ID + all field values. Column 1 = Record ID (you can ignore it).
2. FilterByFormula(formula)
Purpose: Filter using Airtable formula logic.
| Parameter | Block Type | Example |
|---|---|---|
formula |
Text | "{Status}='Done'" or "FIND('John', {Name})>0" |
How to use:
- Use
call AirtablePro.FilterByFormulawith a text block - Handle result in
FilteredByFormulaevent
Pro Tip: Test your formula in Airtableβs βFilterβ UI first!
3. SearchInColumn(columnName, text)
Purpose: Find rows where a column contains text.
| Parameter | Block Type | Example |
|---|---|---|
columnName |
Text | "Name" |
text |
Text | "John" |
How to use:
- Use
call AirtablePro.SearchInColumn("Name", "John") - Handles case-insensitive search automatically
- Result in
SearchFoundevent β returns row numbers and matching rows
4. CreateRecord(fieldValuePairs)
Purpose: Add a new record.
| Parameter | Block Type | How to Build |
|---|---|---|
fieldValuePairs |
List of Lists | Use make a list β inside, add make a list for each field |
Example:
make a list
βββ make a list
βββ "Name"
βββ "John"
βββ make a list
βββ "Age"
βββ "30"
Result: Triggers
RecordCreated(rowNumber, duration)
5. UpdateRecordByRow(rowNumber, fields)
Purpose: Update an entire row.
| Parameter | Block Type | Example |
|---|---|---|
rowNumber |
Number | 5 |
fields |
List of Lists | Same format as CreateRecord |
Example:
UpdateRecordByRow
βββ 5
βββ make a list
βββ make a list β ["Status", "Done"]
βββ make a list β ["Priority", "High"]
Validation: Field names must match your Airtable column names exactly
6. UpdateCellByNumbers(row, col, newValue)
Purpose: Update a single cell.
| Parameter | Block Type | Example |
|---|---|---|
row |
Number | 3 |
col |
Number | 2 (1 = first data column, not Record ID) |
newValue |
Text | "Completed" |
Safer: No need to know field names β just row & column numbers.
7. ReadCellByNumbers(row, col)
Purpose: Read a single cell value.
| Parameter | Block Type | Example |
|---|---|---|
row |
Number | 4 |
col |
Number | 1 |
Result:
CellRead(value, duration)βvalueis text
8. DeleteRow(rowNumber)
Purpose: Delete a row.
| Parameter | Block Type | Example |
|---|---|---|
rowNumber |
Number | 7 |
Irreversible! Confirm before deleting.
9. BatchCreateRecords(recordsList)
Purpose: Create up to 10 records at once (faster).
| Parameter | Block Type | Structure |
|---|---|---|
recordsList |
List of Records | Each record = make a list of field pairs |
Example:
make a list
βββ make a list
βββ make a list β ["Name", "Alice"]
βββ make a list β ["Age", "25"]
βββ make a list
βββ make a list β ["Name", "Bob"]
βββ make a list β ["Age", "30"]
Result:
BatchCreated(count, duration)
10. GetRow(rowNumber) & GetColumn(colNumber)
GetRow(3)β returns clean row data (no Record ID)GetColumn(2)β returns entire column as a list
| Parameter | Block Type |
|---|---|
rowNumber / colNumber |
Number |
Events:
GotRowandGotColumn
11. SortBy(columnName, ascending)
Purpose: Sort records.
| Parameter | Block Type | Example |
|---|---|---|
columnName |
Text | "Due Date" |
ascending |
Boolean | false (for descending) |
Result:
GotAllRecordswith sorted data
Events: How to Handle Results
All events include duration (in seconds). Always use:
when AirtablePro.GotAllRecords
βββ records β set to a global variable
βββ columns β use to build column headers
βββ duration β show "Loaded in 2.3 sec"
Key Events:
| Event | Returns |
|---|---|
GotAllRecords |
Full table data |
FilteredByFormula |
Filtered records + row numbers |
RecordCreated |
New row number |
CellRead |
Cell value |
ProgressUpdate |
For large operations: (operation, currentPage, totalPages, recordsSoFar, duration) |
ErrorOccurred |
Always check this! Shows API errors |
Pro Tips for Users
Building Lists Correctly
- Use
make a listblock (notjoin) - For field-value pairs, nest lists:
make a list βββ make a list β [field, value]
Handling Large Tables
- Use
autoLoadAll = falsefor quick previews - Use
ProgressUpdateto show loading status
Debugging
- Check
LastApiCallproperty β copy URL into browser to test - Always handle
ErrorOccurredβ Airtable returns clear error messages
Column Numbers
- 1 = first data column (Record ID is hidden in clean functions)
- Use
GotAllRecordsβcolumnsto see column order
Example: Create a New Task
when Button.CreateTask click
call AirtablePro.CreateRecord
βββ make a list
βββ make a list β ["Task", "Buy groceries"]
βββ make a list β ["Status", "Pending"]
when AirtablePro.RecordCreated
βββ show "New task at row " + rowNumber
Common Mistakes to Avoid
| Mistake | Fix |
|---|---|
| Using wrong column name | Check GotAllRecords β columns |
Forgetting to set Token |
Set in Designer or via block |
Using " instead of ' in formulas |
Airtable formulas use 'single quotes' |
| Assuming row 1 = first data row | Row numbers are 1-based and include all records |
Final Advice
Start small: Use
GetAllRecordsβ display in aListView
Test formulas in Airtable first
Always handle
ErrorOccurredβ it shows exactly what went wrong!
FilterByFormula usage table
- Name given inside { and } are the field names. In the below table the table field (table headers) names used are Name, Age, Status, Email etc.,
Clean, Copy-Paste Ready Table
| Purpose | Formula String (paste exactly) |
|---|---|
| Name = βJohnβ | {Name} = 'John' |
| Age > 25 | {Age} > 25 |
| Status is βDoneβ OR βPendingβ | OR({Status}='Done', {Status}='Pending') |
| Name contains βalexβ (case insensitive) | FIND('alex', LOWER({Name})) > 0 |
| Email ends with @gmail.com | RIGHT({Email}, 10) = '@gmail.com' |
| Date is today | IS_SAME({Date}, TODAY()) |
| Date is in last 7 days | DATETIME_DIFF(TODAY(), {Date}, 'days') <= 7 |
| Cell is blank | {Priority} = BLANK() |
| Cell is NOT blank | {Priority} != BLANK() |
| Multiple conditions | AND({Age} >= 18, {Country} = 'India', {Active} = 1) |
| Name starts with βAβ | LEFT({Name}, 1) = 'A' |

