PowerAutomateで指定したフォルダを作成してファイルを保存するフロー

#概要
- Power Automateを使ってSharePointのライブラリに指定のフォルダを作ってファイルをアップロードするフローを作成してみました。
- Flowボタンから実行するインスタントフローを使って、フォルダ名の指定やファイルの登録を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/e43bef65-56d9-5ab5-69c0-ec46ec206654.png)


#背景
- SharePoint上に社内ExcelテーブルのIDと紐づくフォルダを作って、その中に数枚写真を保存するという作業がありました。
    - 主にPower BIからフォルダにリンクしたり、サムネイル表示したり。
- 職場のネットワーク環境が悪く、手作業でSharePointにフォルダを作るのも遅いし、Automateで少しでも楽できないかと考えました。
- 覚え書きとして投稿してみます。
    - 結論的にはローカルでフォルダを作ってフォルダごとアップロードする方が早かったですが・・
 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/86515e97-a92d-8f0e-c6dc-869f59edee91.png)

#フローの解説

##全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/96908c9e-d6b9-1c8e-66b4-d5651e730234.png)

##ポイント

SharePointにファイルを保存するにあたり、File1～3に設定した引数からファイル名、ファイルコンテンツを取得する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/ccdcc06d-0fcc-2f4a-306c-27d4fa475175.png)
ただ、普通にトリガーの出力にある「File1」の中身を確認しても、以下のようにファイルコンテンツしか無く、ファイル名がありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/4a50ed2c-8d7b-2b7e-534a-b76160f90ec5.png)
クリックしたときに「本文(triggerBody)」から以下の参照が設定されるからですね。
```triggerBody()?['file']?['contentBytes']```


そこで、出力にある「本文」の中身を確認してみます。
fileはcontentBytesとnameがあり、それぞれコンテンツとファイル名が格納されていますね。
File1~3の内部名は、file、file_1、file_2となっているのでちょっとややこしいですね。
※作成アクションで本文を設定してテストし中身を確認。Firefoxだとjsonをいい感じに整形してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/63514122-e52b-f141-aaf6-4322a7a921c0.png)

ということで以下のようにしてファイル名、コンテンツを取得するようにします。

```JavaScript:
triggerBody()?['file']?['name']
triggerBody()?['file']?['contentBytes']
```
実際には、ファイルの数だけ関数を書くのは非効率なので、先に引数名の配列を作成し、Apply to eachで回して動的に参照する工夫を行います。

```JavaScript:
outputs('作成_Body')?[items('Apply_to_each')]?['name']
```

##解説
**トリガー**
入力の追加で実行時の引数を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/a07f04c5-ad86-ab40-9158-9bd5524f03a3.png)

**作成 Body**
これは本文の出力確認用なので無くてもOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/c78a2c9a-4fd7-1ed2-cdb4-7dae38526199.png)

**作成 FolderPath**
フォルダを作成するフォルダ(親)のパスを入力。/DocLib以降のパスです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/93992cdd-6429-c686-39f4-3926810ee334.png)

**新しいフォルダーの作成**
concat関数で文字列を結合してファイルパスを生成。
既にあるフォルダを作成してもエラーにならず、中身も消えないので事前の存在確認は不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/501ffd6f-e245-e945-1beb-3e0d2d69c2a3.png)

**引数名の配列**
トリガーの引数であるFile1~3の内部名は、file、file_1、file_2なので配列形式で指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/8be3c08f-51d9-8467-9f94-3fa9cda150df.png)

**Apply_to_each**
先程の配列をApply_to_eachで一要素ずつ参照し、値をもとにtriggerBody()を参照しそれぞれのファイル情報を取り出します。
ループの現在のアイテムは```items('Apply_to_each')```で参照できるため、以下のようにすると、トリガーの本文から動的に値を取得できます。
```triggerBody()?[items('Apply_to_each')]```

**条件 引数の空判定**
ファイルが必ず3つ添付されるとは限らず、空の引数を参照するとエラーとなります。
条件アクションでfile引数が指定されているかチェックします。
```Empty(triggerBody()?[items('Apply_to_each')])```

**はいの場合**
ファイルの作成アクションでファイルの作成を行います。

ファイル名
```triggerBody()?[items('Apply_to_each')]?['name']```
ファイルコンテンツ
```triggerBody()?[items('Apply_to_each')]?['contentBytes']```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/387ad6e3-3ef9-7b18-a419-ba7be889824d.png)

以上です。
ファイル登録後にFlowBotからTeamsチャットへファイルの作成の出力「アイテムへのリンク」を使って保存先を通知してもいいですね。