はじめに
Power AutomateではSharePointコネクタを用いて多くの操作を標準アクションとしてSharePointに対して行うことができます。
しかし現時点(2023/10/21)では、SharePointのドキュメントフォルダにあるファイルのファイル名を変更することはできません。
そこでこの記事では、Power Automateを用いてファイル名やファイルの種類(拡張子)を変更する方法をいくつか紹介します。
今回テストで利用するファイル
今回は以下のような「Sample.csv」というファイルに対して操作を行っています。
ファイル名の更新ができそうでできないアクション
標準アクションではファイルのプロパティの更新というものがあり、これを利用すれば一見ファイルのプロパティを更新するわけですから、ファイル名の変更ができそうですが、これではファイル名の更新はできません。
更新できるのは
- タイトル
- 説明
- 画像タグ
の3種類であり、タイトルがファイル名に当たるのではないか?と思われるかもしれませんが、ファイルのプロパティを見てもらえればわかる通りファイルの名前とタイトルは別のプロパティとして扱われています。
よって、「ファイルのプロパティの更新」アクションではファイル名の変更はできないので気を付けてください。
ファイル名を変更する
今回の説明ではトリガーには「手動でフローをトリガーします」を利用しています。
SharePoint REST APIを用いて変更する
フローの全体としては以下のようになっています。
まず、「パスによるファイル メタデータの取得」でファイルの情報を取得しています。
ここで欲しいのはファイルのIdである ItemId
です。
Id
ではなく、ItemId
なのでご注意ください。
続いて、先ほど取得した ItemId
をSharePoint REST APIを用いてファイルの情報を取得しています。
「先ほどもファイルの情報取得したのに?」と思われるかもですが、ここでは取得したい情報が異なります。
これにより欲しいのは、"SP.Data.Shared_x0020_DocumentsItem"というファイルのmetadataにあるtypeです。
これは「パスによるファイル メタデータの取得」では得られなかった結果です。
そして、SharePoint REST APIでファイル(アイテム)の情報を取得するためには ItemId
が必要だったのでこのようなことを行っているわけですね。
設定項目ですが、以下のように設定しています。
方法
GET
_api/web/GetListUsingPath(DecodedUrl='/sites/[Your Site]/[Your Documents library]')/items(@{outputs('パスによるファイル_メタデータの取得')?['body/ItemId']})
[Your Site]と[Your Documents library]の箇所はご自身のサイト名とドキュメントライブラリ名の内部名にそれぞれ置き換えてください。
URLより確認することができます。
他にもURIには以下のように記載することもできます。
_api/web/lists/GetByTitle('[ドキュメントライブラリ名]')/items(@{outputs('パスによるファイル_メタデータの取得')?['body/ItemId']})
[ドキュメントライブラリ名]の箇所はこちらの場合は、表示名で指定することになります。
どちらでも取得される情報は同じですのでお好きな方法で。
内部名で指定したほうが、変更がされないのでフローが急に動かなくなったみたいなことは避けられるかな?
最後にこれまでのアクションで得られた情報を用いてファイル名の変更を行います。
方法
POST
_api/web/GetListUsingPath(DecodedUrl='/sites/[Your Site]/[Your Documents library]')/items(@{outputs('パスによるファイル_メタデータの取得')?['body/ItemId']})
先ほどのGETでファイル情報を取得したときと同じURIでOK。
ヘッダー
{ "Content-Type": "application/json;odata=verbose", "Accept": "application/json;odata=verbose", "If-Match": "*", "X-Http-Method": "MERGE" }
ボディ
{ "__metadata": { "type": "@{body('SharePoint_に_HTTP_要求を送信します(Get_File)')?['d']?['__metadata']?['type']}" }, "FileLeafRef": "[変更したいファイル名].csv" }
ボディにて先ほどGETで取得した情報が必要になってくるわけですね。
なおこの方法ではファイルの拡張子までは変更できませんのでご注意ください。
Graph APIを用いて変更する
ファイルの種類(拡張子)も変更したい場合はこちらを利用することになります。
フローの全体としては以下のようになっています。
アクションは変わらず「SharePoint に HTTP 要求を送信します」を利用します。
ただし今回実行したいのはSharePoint REST APIではなくGraph APIですので、以下公式ドキュメントのようにGraph APIを介したSharePoint REST APIの実行を行います。
まずは、DriveId
と ItemId
が必要なので取得を行います。
ItemId
は先ほどSharePoint REST APIで用いていた ItemId
とは異なる値となりますのでお気をつけ下さい。
Graph APIでのファイル操作はこちらの公式ドキュメント、もしくは私がまとめているこちらのサイトが参考になるかな?と思います。
DriveId
は以下で取得します。
方法
GET
_api/v2.1/drive
続いて ItemId
は以下で取得を行います。
方法
GET
_api/v2.1/drives/@{body('SharePoint_に_HTTP_要求を送信します(Get_DriveId)')?['id']}/items/root:/[Your Folder Path]:/children?$filter=name eq '[Your File Name].[Your File Extension]'&$select=name,id
[Your Folder Path]には対象のファイルがあるフォルダのパスに変更してください。
例えば今回ですと以下のようになりますね。
root:/General/TestFile:/children
?$filter
では得られる結果を絞っています。
[Your File Name].[Your File Extension]ではファイル名を変更したいファイルの拡張子付きのファイル名を設定してください。
ちなみにDriveId
や ItemId
は「ファイルのプロパティの取得」アクションの{Thumbnail}に設定されているURLの値を分解すればそれぞれ取得することもできますが、面倒なのでAPI使ってそれぞれ取得したほうが良いと思います。
最後にこれまでのアクションで得られた情報を用いてファイル名の変更を行います。
方法
PATCH
_api/v2.1/drives/@{body('SharePoint_に_HTTP_要求を送信します(Get_DriveId)')?['id']}/items/@{body('SharePoint_に_HTTP_要求を送信します(Get_ItemId)')?['value']?[0]?['id']}
ヘッダー
{ "Content-Type": "application/json" }
ボディ
{ "name": "[変更したいファイル名].[変更したいファイルの拡張子]" }
この方法ですと、拡張子(ファイルの種類)を変更することも可能です。
おわりに
APIを直で叩くことによりファイル名の変更を行うことが可能です。
ただし、拡張子(ファイルの種類)を変更したい場合はGraph APIを実行する必要があるのでお気を付けください。
ファイル名の変更はよく行われる操作だと思いますので、標準アクションとしてファイル名の変更ができるようになるといいですねー