> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.lido.app/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Actions: how spreadsheet automation works

An **Action** is a Lido formula that doesn't just calculate a value — it *does* something. `=SENDGMAIL(...)` sends an email. `=COPYFILE(...)` copies a file. `=EXTRACTFROMFILETOROW(...)` runs AI extraction. Actions are how a spreadsheet becomes a tool that takes real-world action on a schedule or on demand.

---

## What makes a formula an Action

A regular formula like `=SUM(A1:A10)` returns a value. An Action formula compiles into an executable operation. When you put `=SENDGMAIL(...)` in a cell, the cell shows the formula text — not a "result" — until something triggers it. When triggered, the operation runs.

This means the same formula serves as both **documentation** (the cell shows what will happen) and **implementation** (it actually happens when run).

---

## Two ways to trigger an Action

| Trigger | How |
| --- | --- |
| **Manually** | Right-click the action cell → **Run** |
| **Automated** | Right-click the action cell → **Create Automation** → set a schedule or other trigger |

You can also chain actions together with `CHAIN(...)` (sequential) or `BATCH(...)` (parallel) so a single trigger runs many operations.

---

## When to use an Action vs. a Workflow

| You want… | Use… |
| --- | --- |
| To send one email per row in a table on demand | **Action** (`SENDGMAIL`) on a button or in a column |
| To run a chain of 3–5 operations from a single button | **Action** with `CHAIN` |
| To run when a file appears in a folder, a webhook fires, or an email arrives | **Workflow** with the appropriate trigger |
| To branch based on conditions | **Workflow** (If/Filter/Switch nodes are easier than nested IF formulas) |
| To handle errors with retries | **Workflow** (Error Catcher + node-level error outputs) |

Actions are great for spreadsheet-anchored work. Workflows are great for event-driven and multi-step work.

---

## Common Action formulas

| Formula | What it does |
| --- | --- |
| `SENDGMAIL` | Send an email via Gmail |
| `SENDOUTLOOK` | Send an email via Outlook |
| `SENDSLACK` | Post a message to a Slack channel |
| `SENDSMS` | Send an SMS via Twilio |
| `EXTRACTFROMFILETOROW` | AI-extract data from a file into a row |
| `EXTRACTTOTABLE` | AI-extract structured data from content into a table |
| `CREATEPDF` | Create a PDF from a template |
| `CREATEGOOGLEDOC` | Create a Google Doc from a template |
| `COPYFILE` | Copy a file from one location to another |
| `COMBINEPDFS` | Merge multiple PDFs into one |
| `OCRMYPDF` | Add a searchable text layer to a scanned PDF |

For the full list and parameter reference, see the Lido docs Spreadsheet → Formulas section.

---

## Step-by-step: build a "send invoice email" action

You have a table called `Invoices` with columns Vendor Name, Invoice Number, Total Amount, Email, and Status.

1. In the column to the right of the table, add a computed column called `Send Email` with a formula like:

   ```
   =SENDGMAIL("gmail-credential-id", Invoices[@Email], "Invoice " & Invoices[@Invoice Number], "Total: " & Invoices[@Total Amount])
   ```

2. Each row's `Send Email` cell now shows the action formula.

3. To send for one row: right-click the cell → **Run**.

4. To send for all rows on a schedule: select the column → **Create Automation** → choose a trigger (daily at 9am, when Status changes to "Send", etc.).

5. Add a `status_ref` parameter to write the send result back to a column so you can track which emails went out.

---

## Step-by-step: chain actions

A single trigger can run multiple actions in sequence using `CHAIN`:

```
=CHAIN(
  EXTRACTFROMFILETOROW("openai-cred", File[@URL], Output[@A1]),
  SENDSLACK("slack-cred", "#ap-inbox", "New invoice processed: " & Output[@A1]),
  COPYFILE(File[@URL], "/Processed/")
)
```

When this cell runs, Lido executes each step in order, only continuing if the previous step succeeded.

For parallel execution, use `BATCH` instead.

---

## Tips

- **Use `status_ref` parameters** wherever they exist. They write the operation's success/failure into a cell so you can track results without scrolling through logs.
- **Add an Action column to a table, not a single cell.** A computed column with `SENDGMAIL` per row gives you bulk operations for free.
- **Test on one row before automating.** Right-click → Run on a single cell first.
- **Use `CHAIN` for sequential dependencies, `BATCH` for independent operations** that can run in parallel.

---

## Common mistakes

- **Forgetting that Action cells show the formula, not a result.** This is intentional. The cell only "does" something when triggered.
- **Setting up an automation without testing manually first.** Always right-click → Run on a single row before scheduling.
- **Hardcoding values instead of using table references.** `=SENDGMAIL(..., "alex@example.com", ...)` only sends to one address. Use `Invoices[@Email]` to send per row.
- **Reaching for an Action when a Workflow would be cleaner.** If the trigger is "a file landed in a folder", that's a Workflow, not an Action. Actions are best for spreadsheet-anchored work.

---

## Related articles

- Tables: how columns work
- Build your first workflow
- Triggers: how workflows start
- AI columns and formulas
- Send extracted data to email or Slack