【Power Automate】SharePointサイト間のファイルコピー自動化

異なるサイト間のファイルコピーをPower Automateで自動化する方法をご紹介します。
例えば、サイトAにファイルが作成されたらサイトBにコピーします。あるいは、ファイルを配置したフォルダーがアップロードされたら、サイトBに同じ構成でコピーすることで、自動的にバックアップを取ることができます。

本記事では、Power AutomateでSharePointサイト間のファイルコピーを自動化する手順を解説します。

## Power Automateフローの全体像
今回作成するPower Automateフロー（以下フロー）の全体像です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/34dc478c-5736-4172-b788-0559a6fc4a60.png)

## フローの作成手順
1.　Power Automate (https://make.powerautomate.com/) を起動し、メニューの「作成」から「自動化したクラウド フロー」 を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/568f592d-6922-4cb8-9758-44355f5dd78c.png" width="450">

2.　任意のフロー名を入力し、トリガーからSharePointの「ファイルが作成されたとき（プロパティのみ）」を選択し、[作成]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/ac3c752b-7c67-4284-9bf3-693652beaf97.png)

3.　トリガーを以下のとおり設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/83905ecc-f526-4ea2-94c8-2fa4cb671677.png" width="450">

【設定値】
| No.| 設定項目名        | 設定値                | 備考 |
|---|-------------------|----------------------|------|
| ① | サイトのアドレス * | コピー元 SharePointサイトを選択 | 必須 |
| ② | ライブラリ名 *     | コピー元 ライブラリ名を選択     | 必須 |

4.　アクション「変数を初期化する」を４つ追加し、以下のとおり設定します。
　　①と④の値は式に設定してください。種類はすべて「文字列」を設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/9c594aa6-9ab4-43ff-b086-d8fb78d98ac6.png" width="450">

【設定値】
| No.&nbsp;&nbsp;| 用途                   | 名前                |値 |
|----------------|-------------------|-------------------------|------|
| ①              | コピー元<br>フォルダー名  | CopyFromSourcePath | slice(triggerOutputs()?['body/{Path}'],0, lastIndexOf(triggerOutputs()?['body/{Path}'], '/')) |
| ②              | コピー先<br>サイトURL | CopyToSite     | /sites/"コピー先 サイトURL" |
| ③              | コピー先<br>ライブラリ名 | CopyToLibrary | "コピー先 ライブラリ名" |
| ④              | コピー先<br>フォルダー    | CopyToPath    |if(contains(variables('CopyFromSourcePath'),'/'), last(split(variables('CopyFromSourcePath'), '/')), '') |

【解説】
- ①の式：
フローが起動するトリガーとなったファイルパスの先頭から最後のスラッシュ(/)より前の部分を抽出します。（例: "Folder01/test.xlsx" → " Folder 01"）
- ④の式：
変数「CopyFromSourcePath」で取得したファイルパスの、最後のスラッシュ(/)以降の部分を抽出します。（例: " Folder01/test.xlsx" → " test.xlsx "）
スラッシュ(/)がない場合は、空白を返します。（例: “test.xlsx”→ ””）

5.　アクション「条件」を追加し、作成されたのがフォルダーかを判定します。以下のとおり設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/860b0da0-fe06-4e9c-8088-b805f3cf30c7.png" width="450">

【設定値】
| 条件 | 設定値                                  |
|:-------:|-------------------------------------|
| 左      | トリガーから「フォルダーである」を選択  |
| 中央    | 次の値に等しくない                    |
| 右      | true                                |

6.　アクション「条件」の「はいの場合」、つまりフォルダーではない場合の処理にSharePointアクション「SharePoint に HTTP 要求を送信します」を追加し、以下のとおり設定します。これを設定することで、コピー先サイトから、指定したライブラリ内のフォルダー一覧を取得することができます。※ 手順５の条件分岐において「いいえの場合」では処理を実行しないため、何も設定しません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/15f17b3c-c8c6-4342-9dbf-3e7e900ee940.png" width="650">

【設定値】
|No.&nbsp;|設定項目名 | 設定値 |
|---------|---------|---------|
| ① | サイトのアドレス * | コピー先 SharePointサイトを選択 |
| ② | 方法 * | GET |
| ③ | URI * | _api/web/GetFolderByServerRelativeUrl('変数「CopyToSite」/変数「CopyToLibrary」')/Folders?$expand=Folders |
| ④ | ヘッダー | Accept：application/json;odata=verbose<br>Content-Type：application/json
|

7.　手順６の直下にアクション「条件」を追加し、フォルダーの存在チェックを行います。以下のとおり設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/31d4bf27-bb53-4dde-a92b-e1c896968862.png)


【設定値】
| 条件 | 設定箇所 | 設定値                       |
|----|:-------:|--------------------------|
And|-|
| ①     | 左      | トリガーから「本文」を選択  |
|       | 中央    | 次の値を含まない           |
|       | 右      | 変数「CopyToPath」          |
| ②     | 左      | 変数「CopyToPath」          |
|       | 中央    | 次の値に等しい             |
|       | 右      | （ブランク）               |

8.　手順7で追加した条件が「はいの場合」を設定します。フォルダーが存在しない、つまりライブラリ直下にファイルが配置された場合にファイルをコピーします。
SharePointアクション「ファイルのコピー」を追加し、以下のとおり設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/4aabaaa3-5557-4402-99ac-1db0f8c80d58.png" width="550">


【設定値】
|No.&nbsp;&nbsp;|項目 | 設定値 |
|---------------|-----------------------|---------|
| ①             | 現在のサイト アドレス * | コピー元 SharePointサイトを選択 |
| ②             | コピーするファイル *    | アクション「SharePoint に HTTP 要求を送信します」で取得した「識別子」を選択 |
| ③             | 送信先サイト アドレス * | コピー先 SharePointサイトを選択 |
| ④             | インストール先フォルダー * | /変数「CopyToLibrary」  |
| ⑤             | 別のファイルが既に存在する場合 * | Copy with a new name|

9.　「いいえの場合」を設定します。ファイルが格納されたフォルダーが配置された場合に、フォルダーを作成してからファイルをコピーします。
SharePointアクション「新しいフォルダーの作成」を追加し、以下のとおり設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/713b7191-eb18-44c1-a727-d07e274ecc9c.png" width="550">

【設定値】
|No.&nbsp;&nbsp;|項目 | 設定値 |
|---------------|-----------------------|--------------------------|
| ①             | サイト アドレス *      | コピー先 SharePointサイトを選択 |
| ②             | 一覧またはライブラリ *  | 変数「CopyToLibrary」     |
| ③             | フォルダーのパス *     | 変数「CopyToPath」         |

10.　アクション「新しいフォルダーの作成」の下に、SharePointアクション「ファイルのコピー」を追加し、以下のとおり設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/e1d298a6-99f9-446b-9865-9c1abbcd9b88.png" width="550">

【設定値】
|No.&nbsp;&nbsp;|項目 | 設定値 |
|---------------|-----------------------|---------|
| ①             | 現在のサイト アドレス * | コピー元 SharePointサイトを選択 |
| ②             | コピーするファイル *    | アクション「SharePoint に HTTP 要求を送信します」で取得した「識別子」を選択 |
| ③             | 送信先サイト アドレス * | コピー先 SharePointサイトを選択 |
| ④             | インストール先フォルダー * | /変数「CopyToLibrary」/変数「CopyToPath」  |
| ⑤             | 別のファイルが既に存在する場合 * | Copy with a new name|

設定は以上です。

## フローの動作確認
フローを保存後、動作確認を行います。
1.　サイトAのライブラリにファイルと、ファイルを格納したフォルダーを配置します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/9b949293-1df6-4b2d-b982-0f830f10974d.png" width="350">


2.　サイトBのライブラリを確認します。
※ フローが起動するまで数分の遅延が発生する可能性があります。ファイルがコピーされていない場合は、少々時間をおいてから再度確認してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992089/eae2e015-931c-4925-aa4b-3ee495bc901d.png" width="350">

指定したライブラリ配下に、ファイルとフォルダーがサイトAと同様の構成でそれぞれコピーされたことが確認できました。

## まとめ
本記事では、Power Automateを使ってSharePointのサイト間でファイルコピーを自動化する手順について解説しました。
バックアップの自動取得や、部門やチーム間でのファイル共有の自動化などに活用してみてはいかがでしょうか。

## 最後に
テンダでは、「こんなプロジェクトに挑戦したい」「こんなチームで働きたい」「理想のチームを創りたい」と願う仲間を求めています。
カジュアル面談も随時受付中です。ぜひ一度お話ししましょう:angel:
- [募集職種一覧](https://hrmos.co/pages/tenda/jobs)
- [カジュアル面談の申込](https://hrmos.co/pages/tenda/jobs/031002/apply)
- [テンダで働く人や社風について](https://note.com/tenda_recruit)
- [テンダのMicrosoftサービス](https://mssp.tenda.co.jp/)