[FREE] AirtablePro Extension Only for Airtable lovers

🧩 AirtablePro

An extension for MIT App Inventor 2.
Airtable Pro – Full featured extension

:memo: Specifications


:package: Package: com.jsr.airtablepro
:floppy_disk: Size: 46.53 KB
:iphone: Minimum API Level: 14
:date: Updated On: 2025-12-10T18:30:00Z
:computer: 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.


:blue_book: AirtablePro User Guide

For Kodular & MIT App Inventor

:key: Prerequisites

  1. Create an Airtable account and a Base (database).
  2. Get your Base ID (from URL: https://airtable.com/appXXXXXXXXXXXXXX/...)
  3. Generate a Personal Access Token (PAT) from Airtable Account Settings
  4. Add the AirtablePro extension to your project

:gear: 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"

:white_check_mark: Tip: Store these in variables so you can change them easily.


:pushpin: 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.GetAllRecords block
  • Handle result in GotAllRecords event:
    • records: List of rows (each row is a list)
    • columns: List of column names

:bulb: 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.FilterByFormula with a text block
  • Handle result in FilteredByFormula event

:white_check_mark: 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 SearchFound event β†’ 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"

:white_check_mark: 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"]

:warning: 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"

:white_check_mark: 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

:inbox_tray: Result: CellRead(value, duration) β†’ value is text


8. DeleteRow(rowNumber)

Purpose: Delete a row.

Parameter Block Type Example
rowNumber Number 7

:warning: 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"]

:white_check_mark: 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

:inbox_tray: Events: GotRow and GotColumn


11. SortBy(columnName, ascending)

Purpose: Sort records.

Parameter Block Type Example
columnName Text "Due Date"
ascending Boolean false (for descending)

:inbox_tray: Result: GotAllRecords with sorted data


:vertical_traffic_light: 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

:hammer_and_wrench: Pro Tips for Users

:white_check_mark: Building Lists Correctly

  • Use make a list block (not join)
  • For field-value pairs, nest lists:
    make a list
      └── make a list β†’ [field, value]
    

:white_check_mark: Handling Large Tables

  • Use autoLoadAll = false for quick previews
  • Use ProgressUpdate to show loading status

:white_check_mark: Debugging

  • Check LastApiCall property β†’ copy URL into browser to test
  • Always handle ErrorOccurred β€” Airtable returns clear error messages

:white_check_mark: Column Numbers

  • 1 = first data column (Record ID is hidden in clean functions)
  • Use GotAllRecords β†’ columns to see column order

:paperclip: 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

:question: 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

:gift: Final Advice

:small_blue_diamond: Start small: Use GetAllRecords β†’ display in a ListView
:small_blue_diamond: Test formulas in Airtable first
:small_blue_diamond: Always handle ErrorOccurred β€” it shows exactly what went wrong!


Compilation was done with no error

APK also works fine

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.,

:white_check_mark: 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'

2 Likes