#PowerApps + #PowerAutomate でSharePointライブラリへのドキュメントアップロード

#はじめに
Power Appsでは残念ながらSharePointライブラリへのドキュメントアップロードには対応していません。
本投稿ではPower Automate(旧Flow)を通じて、Power AppsからSharePointライブラリへファイルをアップロードする方法を紹介します。

なお、写真のアップロードは[#PowerApps のJSON関数を利用した写真の一括登録](https://qiita.com/h-nagao/items/1e89e16fe59d458bd4d1)こちらで解説しています。

**今回は！！写真じゃない！オフィスドキュメントも！アップロードします！！！**


#準備
Power Appsでローカルのファイルを扱うコントロールは2つです。1つはフォームコントロールの添付ファイル。もう一つが今回用いる、**写真の追加**コントロールです。
ファイルを扱えたとしても、単純にはFlowに渡せないので、**JSON関数**を利用してFlowに渡せる形式に変換します。上の記事でも紹介していますが、```JSON(XXXXX,IncludeBinaryData)```で、XXXXXのDataUriを取り出すことができるので、これでファイルをDataUriに変換。Flowに渡してあげます。

#Power Apps
スクリーンに設置するコントロールは４つです。
- 写真の追加
- テキストボックス
- ボタン
- ラベル(格納先を表示する用)
　![Screen.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/ccf680df-f6ed-e86a-89c8-f0a58f66efd6.png)
このうち、ボタン以外は特になにもしていません。
ボタンのOnSelectには以下を設定しています。

```Button.OnSelect
/*JSON関数の結果、得られるDataUriを変数にセット*/
Set(docJson,
    JSON(UploadedImage1.Image,IncludeBinaryData);//変換対象は写真部分(UploadedImage)
    ); 
/*Flow実行の結果をSet*/
Set(response,    
    uploadFromPowerApps.Run(
        Substitute(docJson,"""",""), //DataUriの先頭と末尾のダブルクォートを削除
        TextInput1.Text, //ファイル名
        User().Email //アップロードした人のEmail
        )
    );
/*アップロードが終わったら変数・コントロール初期化*/
Reset(AddMediaButton1);
Set(docJson,Blank());
```

Flowに渡している最後の変数はなくても大丈夫です。Power Apps側は終わりです。
参考までに、下図はExcelファイルをJSONで変換した場合の変数です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/a407dbdf-bd85-b7eb-cdef-9d43cd163a7a.png)

さらっと行きましたが、とっても重要なのは、**画像の追加コントロールは、画像ファイル以外も選べる**、**JSON関数で一般的なファイルもdataUriに変換できる**の２点が重要になります。

#Power Automate
次にFlow側です。上の記事にもある通り、FlowではdataUriToBinaryの関数を使うことで、SharePointにファイルを生成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/eec9a322-a3c7-8a96-57ef-3f2c5d35d879.png)

あとはPowerAppsへの応答で、生成されたファイルのパスを返せば完了です。

#まとめ
- 画像の追加コントロールのUploadedImage.Imageをターゲットにして、JSON()を実行
- できたDataUriをFlowに渡す
- FlowではdataUriToBinaryでファイルに戻す

**(注意)**ファイルを選択する際に、既定では画像ファイルしか選択できないので、すべてのファイル から選んでください。

#おまけ
「ライブラリに直接投稿権限はつけたくないけど、ファイルを登録だけはさせたい」という要望をたまに聞きます。ここでは最後に、上のアップロードを応用して、権限がないライブラリにファイルをアップロードする方法を紹介します。

##Flow
変更するのはFlow側だけです。ソリューションの中でだけ利用可能な、Flowの中での子Flowの呼び出しを使います。

##子Flow側
だいぶ長いですが、以下のステップで実行します。
1. Instant flowのマニュアルトリガーで開始(これは子Flowにする条件)
2. 入力をつかって、ファイル生成
3. ファイルのメタデータに作成者(Power Appsから実行した際の最後の変数)をセット
4. 親Flowに結果を返す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/4a7435ea-66b8-1c9e-1761-645795c2ccb2.png)

##親Flow側
親Flowのほうが簡単です。基本は子を呼び出して終了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/0f3baa22-1751-4f28-adbe-adad807af44c.png)

##ポイント
子Flowはインスタントフローのうち、マニュアルトリガーのFlowなので、実行のみユーザーの設定が可能です。これを利用すると、子Flowの中で触っているライブラリに直接権限をもっていなくても、アップロードをすることができます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/47e999b5-9199-8b48-9510-ba61f08c67f6.png)

#追記
[Shane](https://twitter.com/ShanesCows) のYoutubeが公開されたのですが、https://youtu.be/3QaiM8SeWfM こちらで、添付ファイルのコントロールからJSONでdatauriを取得する方法が紹介されていました。
1. まずEditフォームから添付ファイルのコントロールだけをコピペで引っ張ってくる
2. AttachmentコントロールのItemsは空でよい
3. Imageコントロールを1つ用意する
4. ImageコントロールのImageプロパティには ```Last(DataCardValuexx.Attachments).Value```を設定する(これはまだdatauriではない)
5. JSON関数をつかって、Set(xxx, JSON(Image1.Image, IncludeBinaryData))で変数にセットする(この段階でdatauri)
本人も「なんでかわからないがー」と言っていましたが、JSON関数はImageを引数にして、IncludeBinaryDataするとDataUriがとれます。
ほかのコントロールから純粋に参照できるのがImageコントロールくらいなので、このような方法になります。
よくわからないかたは、サンプルのmsappファイルを置いておきましたので、[こちら](https://pamofumofu.blob.core.windows.net/files/GenerateDataUri.msapp)から取得してください。




ということで、JSONはとっても素敵な関数で、JSONはわからない！という方でも使えます。（JSONを書くわけではない）ぜひ活用してみてください！