How to Prevent Power Automate Cannot Read a Person Column
🔍 WiseChecker

How to Prevent Power Automate Cannot Read a Person Column

When you build a Power Automate flow that reads a Person column from a SharePoint list or library, the flow can fail with an error that says the column value is null or cannot be read. This problem occurs because Power Automate treats Person columns as complex objects that contain multiple properties, not as simple text values. The flow cannot access the person’s name or email if you reference the column as a single string. This article explains why the Person column structure breaks the flow and shows you how to fix it by using the correct syntax and flow actions.

Key Takeaways: Reading a Person Column in Power Automate

  • Person column output schema: Always use the “Apply to each” action or the “First” expression to access the object array.
  • Expression @{item()?[‘DisplayName’]}: Extracts the person’s display name from the Person column object.
  • Initialize variable action: Store the person value in a variable to avoid null errors in subsequent steps.

ADVERTISEMENT

Why Power Automate Cannot Read a Person Column Directly

A Person column in SharePoint does not store a single text value. It stores a collection of properties for each selected person. These properties include the display name, email address, account ID, and job title. When Power Automate retrieves a list item, the Person column appears as an array of objects. Each object contains the person’s data.

If you try to use the Person column directly in a condition or a send email action, the flow engine cannot determine which property you want. The result is a null value or a runtime error. The error message often says “The expression is invalid” or “Cannot evaluate the expression.”

The solution is to parse the Person column correctly. You must either iterate over the array using an “Apply to each” loop or use the “First” function to get the first person object. Then you access the specific property you need, such as DisplayName or Email.

Steps to Fix the Person Column Read Error

The following steps assume you have an existing flow that triggers on a SharePoint item and fails when reading a Person column. You will replace the incorrect column reference with the correct expression.

  1. Identify the Person column name and object structure
    Open your flow in edit mode. Select the action that uses the Person column, such as a “Send an email” or “Condition” action. Remove any direct reference to the column name like “PersonField”. Instead, use the dynamic content picker to add the Person column again. Power Automate will show the column as an object with sub-properties. The sub-properties include DisplayName, Email, and Claims. If you do not see sub-properties, the flow schema may be outdated. Run the trigger manually once to refresh the schema.
  2. Add an “Apply to each” action to iterate over the person array
    Insert a new “Apply to each” action from the Control connector. In the “Select an output from previous steps” field, choose the Person column from the dynamic content list. This action will loop through each person object in the column. Even if you expect only one person, the column is still an array. The loop ensures you access the object correctly.
  3. Use the DisplayName property inside the loop
    Inside the “Apply to each” action, add the action that needs the person’s name, such as “Send an email”. In the email body or subject, use the expression @{items('Apply_to_each')?['DisplayName']}. Replace “Apply_to_each” with the actual loop name shown in your flow. This expression extracts the display name from the current person object.
  4. Handle the single-person scenario with the First function
    If your Person column allows only one selection, you can avoid the loop. Use the expression @{first(outputs('Get_item')?['body/PersonField'])?['DisplayName']}. Replace “Get_item” with the name of your “Get item” action and “PersonField” with the internal name of your Person column. The First function returns the first object from the array. Then you access the DisplayName property on that object.
  5. Store the person value in a variable for reuse
    Add an “Initialize variable” action before the loop or after the Get item action. Set the type to String. In the value field, use the expression from step 3 or 4. For a single-person column, use @{first(outputs('Get_item')?['body/PersonField'])?['DisplayName']}. For multiple persons, initialize an array variable and append each name inside the loop. Then reference the variable in all subsequent actions. This approach prevents null errors if the column is empty.
  6. Test the flow with a list item that has a person value
    Save the flow. Select the trigger and run the flow manually. Choose a list item that has a person assigned to the Person column. Verify that the flow reads the display name correctly and does not throw an error. If the flow still fails, check the column internal name. The internal name may differ from the display name. Use the SharePoint REST API to find the internal name: https://yourtenant.sharepoint.com/sites/yoursite/_api/web/lists/getbytitle('YourList')/fields.

ADVERTISEMENT

If Power Automate Still Cannot Read the Person Column

Person column returns null even with the correct expression

The column may be empty for the selected item. In SharePoint, a Person column that is not required can have no value. When the column is empty, the array is null. The First function or the Apply to each loop will fail because there is no object. Add a Condition action before reading the Person column. Check if the column is equal to null. If it is null, skip the actions that depend on the person data. Use the expression @empty(outputs('Get_item')?['body/PersonField']) to test for emptiness.

Flow uses the wrong column internal name

Power Automate sometimes shows the display name of the column, but the underlying internal name may contain spaces or special characters. The dynamic content picker usually maps correctly, but if you manually typed the expression, you might use the wrong name. Open the “Get item” action output from a run history. Expand the body object and look for the Person column. Copy the exact property name and use it in your expression. The internal name often ends with “Id” for the person’s ID field. Use the DisplayName property instead of the Id property for readable names.

Multiple persons cause duplicate actions

If the Person column allows multiple selections, the Apply to each loop runs once per person. This can send multiple emails or create duplicate entries. To send a single email with all names, collect the names into a string variable. Inside the loop, append each DisplayName to the variable with a semicolon separator. After the loop ends, use the variable in the email action. This method consolidates all person names into one value.

Single-Person Column vs Multi-Person Column: Expression Differences

Item Single-Person Column Multi-Person Column
Column structure Array with one object Array with one or more objects
Recommended action Use First function to get the object Use Apply to each loop to iterate
Expression for DisplayName @{first(outputs('Get_item')?['body/PersonField'])?['DisplayName']} @{items('Apply_to_each')?['DisplayName']} inside loop
Empty column handling Check with @empty() before First Check with @empty() before loop

Now you can build Power Automate flows that read Person columns without errors. Always treat the Person column as an array of objects. Use the First function for single-person columns or an Apply to each loop for multi-person columns. Store the person’s display name in a variable to simplify your flow logic. If the column is empty, add a condition to skip the dependent actions. These techniques eliminate the “cannot read a Person column” error and make your flows reliable.

ADVERTISEMENT