Let’s say you have a SharePoint list with folders organized by continent and you have as well a choice column with the continent name in this. You want to move automatically all the list items with the chosen continent to the specific continent folder.
The first idea would be to use a Power Automate Flow to do that, but there is no out-of-the-box action that moves list items to folders. At the moment of writing this post, there is an action to move files but nothing for list items. Even thinking about using SharePoint Rest API with the ‘Send an HTTP request to SharePoint’ connector there is no endpoint to move list items to a folder.
This is not clear in the Microsoft documentation, but actually, the same Rest API endpoint and action that is available for files can be used for list items by using the item file property. In this post, it will be shown how to use SharePoint Rest API to move items with a Flow, so as soon as an item is created or edited, it will be moved to the right location.
Basically, this Flow will do after being triggered:
1. Get current list root folder path
2. Get current item file name and the current path
3. Build a new file path
4. Check if the path is actually new and if so move the item
To better understand the following steps, knowledge on SharePoint Rest API and Flow expressions is helpful.
To start building the flow, the trigger used is ‘When an item is created or modified’.
In this example, variables are used to store the list title, destination folder name and the site Url. Because the same values will be used in different connectors, it is a better practice to not let them hard-coded in the actions. For example, if this flow is exported to another environment or copied to be used in a different list, the changes to the flow will be minimal, only the initial variables and the trigger, instead of updating a bunch of connectors with hard-coded values.
Next step is to get the list folder Url using the SharePoint Rest API, using the ‘Send an HTTP Request to SharePoint’ action with the GET method. The action was renamed to ‘GetRootFolder’ so it is easier to access its output later in expressions. All the variables actions in this example are renamed as well, just for easier maintenance.
After this action, a new variable is initialized to store the list root folder Url with the following formula (use expressions to access the JSON content that is returned by the SharePoint Rest API, with the body function and the action name you can access the content):
Next action is to get the current list item File Server relative Url using SharePoint rest API like it was done with the list Root folder. In this case, it is needed to explicitly tell the Rest endpoint to load the ‘FileRef’ and ‘FileLeafRef’ properties.
The following variables are used to build the new list item folder Url, so the below formulas are used to assign values to the proper variables:
- Item file name (Set with current file name only, used to build final destination path): body(‘GetItem’)[‘d’][‘FileLeafRef’]
- Item Url (Set with current item server relative Url, using the expression): body(‘GetItem’)[‘d’][‘FileRef’]
- New item Url (Root Folder/New Folder/Item File Name): concat(variables(‘RootFolder’),‘/’,variables(‘MoveToFolderName’),‘/’,variables(‘ItemFileName’))
Then, the SharePoint ‘Send an HTTP connector to SharePoint’ is used again, to call the Files REST endpoint and move the item to the new location (yes, the same endpoint used for files).
It is validated if the File new folder path is different then the current one:
If it is, then a call to the API for the File/moveTo method is done in order to do the move:
This time a POST request is sent because we actually will request a change in this call to the endpoint, which will take care of the item move (also renamed the action to ‘MoveItem’).
After this last action is called, the item is moved to the proper folder.
The final flow will look like this:
With this flow, regardless of where the items are saved, they will be moved to the proper folder after being created/edited.