Keep Excel in Sync with a SharePoint List (Beginner-Friendly, No Filter Query) This post shows you—step by step—how to sync a SharePoint list to an Excel table withou

 

Keep Excel in Sync with a SharePoint List (Beginner-Friendly, No Filter Query)

This post shows you—step by step—how to sync a SharePoint list to an Excel table without using the Excel “Filter Query.” We’ll use Filter array + Condition instead, which is more reliable for beginners.

  • SharePoint list: tjmax

    • Columns: vendorspo (single line of text), summary (single line of text)

  • Excel: worksheet Clients, table tblClients

    • Columns: clientname, details

👉 Grab the ready-to-use Excel file (already formatted as a table):
Download: tjmax_clients.xlsx


What you’ll build

Whenever an item is created/edited in the tjmax list, the flow checks if that item’s vendorspo already exists in the Excel table’s clientname column.

  • If not found, it adds a new row to Excel with:

    • clientname = SharePoint vendorspo

    • details = SharePoint summary

You’ll also see an optional scheduled version that loops all SharePoint items daily/weekly.


Prerequisites (5 minutes)

  1. SharePoint list tjmax

    • Columns: vendorspo, summary (both Single line of text)

  2. Excel file stored in OneDrive for Business or a SharePoint document library

    • Make sure the data is a real Excel Table (not loose cells).

    • Table name: tblClients

    • Columns: clientname, details

    • Use the provided template above or create your own.

✅ Tip: Table/column names are case-sensitive for the connector. Keep them exactly as shown: tblClients, clientname, details.


Flow overview (no Filter Query)

Trigger: SharePoint (item created or modified)
  ↓
Initialize varVendorPO = trigger ‘vendorspo’
  ↓
Compose VendorPO_Trimmed = trim(varVendorPO)
  ↓
Excel: List rows present in a table (no filter; Pagination ON)
  ↓
Filter array → keep rows where toLower(trim(clientname)) = toLower(VendorPO_Trimmed)
  ↓
Condition: length(Filter array) = 0 ?
   ├─ Yes → Excel: Add a row (clientname=VendorPO_Trimmed, details=summary)
   └─ No  → Do nothing

Part 1 — Automated Flow (recommended)

Step 1 — Create the flow

  • Power Automate → CreateAutomated cloud flow

  • Trigger: SharePointWhen an item is created or modified

  • Site Address: your site

  • List Name: tjmax

(Optional) Trigger condition — fire only when vendorspo has a value:
Open the trigger ⋯ → Settings → Trigger conditions and paste:

@not(empty(triggerBody()?['vendorspo']))

Save the trigger.


Step 2 — Normalize the key (vendor PO)

  1. Initialize variable

    • Name: varVendorPO

    • Type: String

    • Value: Dynamic content → vendorspo

  2. Compose — VendorPO_Trimmed

trim(string(variables('varVendorPO')))

Step 3 — Read Excel rows (no Filter Query)

  • Action: Excel Online (Business)List rows present in a table

    • Location: where the file lives (OneDrive for Business or SharePoint Site)

    • Document Library: e.g., Documents

    • File: browse to your Excel file

    • Table: tblClients

Important: Turn Pagination ON in this action’s Settings, and set Threshold to something safe like 5000.
(Without pagination, Excel usually returns only the first ~256 rows.)


Step 4 — Filter array (match case/space-insensitive)

  • Action: Filter array

    • From:

      body('List_rows_present_in_a_table')?['value']
      
    • Advanced mode:

      @equals(
        toLower(trim(item()?['clientname'])),
        toLower(outputs('VendorPO_Trimmed'))
      )
      

This keeps only the Excel rows whose clientname equals the SharePoint vendorspo (after trimming and lowercasing both).


Step 5 — Condition: does it exist in Excel?

  • Action: Condition

    • Left (Expression):

      length(body('Filter_array'))
      
    • Operator: is equal to

    • Right: 0

If Yes (not found) → add the row to Excel:

  • Action: Excel Online (Business)Add a row into a table

    • Location/File/Table: same as above (tblClients)

    • clientname:

      outputs('VendorPO_Trimmed')
      
    • details:

      coalesce(triggerOutputs()?['body/summary'], '')
      

If No → do nothing (or add a small log with a Compose).


Step 6 — Save & Test

  • Save your flow.

  • Create or edit an item in tjmax with vendorspo populated.

  • Confirm a new Excel row appears only when it didn’t already exist.


Reliability Tips (Excel + Flows)

  • Close the Excel file during runs to avoid locks.

  • Concurrency: In the flow’s Settings, set Concurrency to 1 (disable parallelism) if many updates could happen at once—this reduces write conflicts.

  • Big tables: Keep Pagination ON and consider scheduled syncs during off-hours.


Part 2 — Optional: Scheduled Catch-Up Sync

Use this when you want a daily/weekly sweep to backfill anything missed.

Step A — Create a Scheduled flow

  • Power Automate → CreateScheduled cloud flow (e.g., daily 7:00 AM).

Step B — Get SharePoint items

  • Action: SharePointGet items

    • Site Address / List Name: tjmax

    • (Optional) Filter Query (for SharePoint, not Excel):

      vendorspo ne null
      

Step C — Loop each item

  • Apply to eachvalue

Inside the loop:

  1. Compose — VendorPO_Trimmed

trim(string(items('Apply_to_each')?['vendorspo']))
  1. Excel — List rows present in a table (same as Part 1)

    • Pagination ON, Threshold e.g. 5000

  2. Filter array (same expression as Part 1)

@equals(
  toLower(trim(item()?['clientname'])),
  toLower(outputs('VendorPO_Trimmed'))
)
  1. Condition: length(body('Filter_array')) = 0

    • If YesAdd a row:

      • clientname = outputs('VendorPO_Trimmed')

      • details = coalesce(items('Apply_to_each')?['summary'], '')

Loop Concurrency: turn OFF (set degree to 1) to avoid Excel write conflicts.


Troubleshooting & FAQs

Q: The table/columns don’t show up in the Excel actions.
A: Ensure your data is a real Excel Table and the file is closed. Verify the Table Name is exactly tblClients and headers are exactly clientname, details.

Q: I still get duplicates.
A: Confirm your filter logic is aligning with real values (no leading/trailing spaces). Keep the trim + toLower approach exactly as shown.

Q: It only reads a small portion of my rows.
A: Turn Pagination ON and set a Threshold (e.g., 5000) in List rows present in a table.

Q: Values contain special characters.
A: We’re not using OData Filter Query, so escaping isn’t needed. The Filter array approach handles raw text well.


Copy-Paste Expressions (Reference)

  • Trigger condition (optional)

    @not(empty(triggerBody()?['vendorspo']))
    
  • VendorPO_Trimmed

    trim(string(variables('varVendorPO')))
    
  • Filter array — Advanced mode

    @equals(
      toLower(trim(item()?['clientname'])),
      toLower(outputs('VendorPO_Trimmed'))
    )
    
  • Condition — Left

    length(body('Filter_array'))
    
  • Excel Add Row — details (Automated)

    coalesce(triggerOutputs()?['body/summary'], '')
    
  • Excel Add Row — details (Scheduled)

    coalesce(items('Apply_to_each')?['summary'], '')
    

Bonus: Starter Excel File

Use this table-ready workbook to skip setup:

  • Sheet: Clients

  • Table: tblClients

  • Columns: clientname, details



I

Comments

Popular posts from this blog

Bridging the Impossible: Connecting Jira On-Prem to Power Automate & Copilot Studio — The Solution Nobody Built Until Now"

How I Automated My Entire SharePoint Tenant with 150 MCP Tools and Claude Desktop

Azure Management MCP Server