When you build a Power Automate flow to read a Person column from SharePoint, the flow may return an error or show empty values. This happens because Power Automate handles Person columns differently than other column types. The flow receives a complex object with metadata instead of a simple text string. This article explains why the error occurs and gives you two concrete fixes: using the Parse JSON action or the Apply to Each action to extract the person's display name.
Key Takeaways: Fixing Person Column Read Errors in Power Automate
- Parse JSON action with schema: Converts the Person column object into a readable format so you can use the display name directly.
- Apply to Each loop: Iterates over the Person column's array of user objects to extract each person's email or display name.
- Compose action with expression: Uses
first(outputs('Get_item')?['PersonColumnName'])['DisplayName']to get a single person's name without a loop.
Why Power Automate Returns an Empty or Error Value for a Person Column
SharePoint stores Person columns as objects, not plain text. When you use the Get item or Get items action in Power Automate, the Person column appears as an array of objects. Each object contains properties such as DisplayName, Email, Claims, and Department. Power Automate cannot display these nested properties automatically in dynamic content. If you try to use the column name directly in a Send an email action, the flow either fails or outputs [object Object].
The root cause is the data structure. Power Automate expects a string value, but the Person column provides an array. The flow does not know which property to extract. You must explicitly tell Power Automate which property to read, such as DisplayName or Email.
Person Column Data Structure Example
When you run a Get item action on a list with a Person column named Approver, the output for that column looks like this:
[
{
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
"Claims": "i:0#.f|membership|user@domain.com",
"DisplayName": "Jane Smith",
"Email": "jane.smith@domain.com",
"Department": "Marketing"
}
]
The flow sees this array. It does not automatically flatten it into a single string. You must use one of the methods below to extract the value you need.
Method 1: Use the Parse JSON Action to Extract a Person Column
The Parse JSON action converts the Person column object into a structured object that Power Automate can read. This method works best when the Person column allows only one value.
- Add the Get item action
In your flow, add the Get item action for the SharePoint list that contains the Person column. Select the site address and list name. Provide the item ID. - Add the Parse JSON action
Add a new action and search for Parse JSON. Set the Content field to the Person column output from Get item. For example, select Approver from the dynamic content list. - Generate the JSON schema
Click the Generate from sample button. Paste a sample JSON payload that matches the Person column structure. Use this sample:[ { "DisplayName": "Jane Smith", "Email": "jane.smith@domain.com", "Department": "Marketing" } ]Click Done. Power Automate creates the schema automatically.
- Use the parsed output
After Parse JSON, you can use the DisplayName or Email properties from the parsed output. In a Send an email action, select DisplayName from the dynamic content under Parse JSON. The flow now sends the person's display name correctly.
Method 2: Use an Expression in the Compose Action
If you prefer not to use Parse JSON, you can write an expression in a Compose action. This method is faster for single-person columns.
- Add the Get item action
Same as Method 1. Get the item that contains the Person column. - Add the Compose action
Add a new action and search for Compose. - Enter the expression
Click inside the Inputs field. Open the Expression tab. Paste this expression, replacing PersonColumnName with the internal name of your Person column:first(outputs('Get_item')?['PersonColumnName'])?['DisplayName']If your Person column is called Approver, the expression becomes:
first(outputs('Get_item')?['Approver'])?['DisplayName']Click OK.
- Use the Compose output
In any subsequent action, select Outputs from the Compose action. This returns the display name as a plain string.
Method 3: Use Apply to Each for Multi-Value Person Columns
When the Person column allows multiple selections, the column returns an array with multiple user objects. You must loop through each item.
- Add the Get item action
Get the item that contains the multi-value Person column. - Add an Apply to Each action
Search for Apply to Each. Click inside the Select an output from previous steps field. Select the Person column from the dynamic content list. - Add actions inside the loop
Inside the Apply to Each, add a Compose action. Set the Inputs to the DisplayName property from the dynamic content. Power Automate shows the property as PersonColumnName DisplayName. - Collect the names
If you need to send all names in one email, use a Select action before the loop or use a string variable to concatenate each DisplayName with a semicolon.
If Power Automate Still Cannot Read the Person Column
Flow Returns an Empty String for the Person Column
If the flow runs but the Person column value is blank, the column may be empty in SharePoint. Open the list item and confirm that the Person column has a value. If the column contains a person but the flow shows empty, check the column internal name. Power Automate uses the internal name, not the display name. To find the internal name, go to the list settings, click the Person column, and look at the URL. The internal name appears after Field=.
Flow Fails with InvalidTemplateException
This error occurs when you use the Person column directly in a string field. For example, you set the To field in Send an email to the Person column output. The email action expects a string, but the Person column provides an array. Use the Compose action with the expression shown in Method 2 to convert the array into a string.
Flow Works in Test but Fails in Production
If the flow works during testing but fails on a production item, the Person column may be empty on some items. Use a Condition action to check if the Person column is null before parsing it. Add a Condition action after Get item. Set the condition to PersonColumnName is not equal to null. If the condition is true, run the Parse JSON or Compose action. If false, skip the action.
| Method | Best For | Complexity |
|---|---|---|
| Parse JSON action | Single-person columns when you need multiple properties | Medium |
| Compose with expression | Single-person columns when you need only one property | Low |
| Apply to Each loop | Multi-person columns | Medium |
You can now read a Person column in Power Automate using Parse JSON, an expression, or a loop. Test each method with a single item first. For a quicker fix, use the Compose action with the first expression. If your column allows multiple people, use the Apply to Each loop and collect the display names into a string variable. Remember to check the column internal name if the flow returns an empty value.