はじめに
この記事はPower Apps でローカルからアップしたファイルをSharePoint のドキュメントライブラリに保存する ~その1~の続きです。
Power Apps でローカルからアップしたファイルをSharePoint のドキュメントライブラリに保存する ~その1~
Power Apps でローカルからアップしたファイルをSharePoint のドキュメントライブラリに保存する ~その3~
参考文献
Power Apps Easiest Way To Upload Files To A SharePoint Document Library
Power AppsからExcelファイルを取り込んでDataverse for Teamsにデータ登録 - MoreBeerMorePower
Power Appsにおける画像の扱いについて - Qiita
Power Apps からアップロードされたファイルをSharePoint ドキュメントライブラリに保存する
ファイルのコンテンツ情報をdatauri に変換してドキュメントライブラリに保存
続いての方法は慣れていない人にとってはちょっと難しいかもです。
処理としては以下のようになります。
- 添付ファイルコンテンツをdatauri に変換
- 1で取得したdatauri 形式でPower Automate にファイルコンテンツを渡す
- Power Apps から受け取ったファイルコンテンツ(datauri)をbinary に変換
- ファイルをSharePoint ドキュメントライブラリに作成
1~2がPower Apps で3~4がPower Automate の処理になります。
Power Apps 側の処理
まずはPower App に添付ファイルコントロールを配置します。
前回紹介したように、コンポーネントを利用すると便利ですので是非お試しを。
さて、この添付ファイルコントロールからアップロードされたファイルですが、どこに保存されるか皆さんご存じでしょうか?
実際にファイルコントロールからファイルをアップロードして、アップロードされたファイルのValue をみてみましょう。
appres://blobmanager/XXXX/1
となっています。
これはPower Apps のコントロールから読み取ったファイルが保存される場所となっています。
データの種類 - Power Apps | Microsoft Docs
このときの形式はURI テキスト文字列となります。
この結果をPower Automate に渡しても(Power Apps で特に何もせず扱おうとしても)テキストなのでファイルを想定通りに作成してくれることはありません。
このURI テキスト文字列をdatauri 形式に変換するためには、画像コントロールを利用してあげる必要があります。
Power Apps の画像コントロールでURI テキストを読み込むと初めてBinary としてデータを読み込んでくれます。
ここまできて初めてファイルコンテンツをdatauri に変換するための準備ができました。
この画像コントロールのデータ( Image1.Image
) をラベルなどで表示させてもまだ先ほどと出力結果は変わりません。
ではどうするのかというとJSON 関数を用います。
JSON 関数にBinary データを渡し、フォーマットに IncludeBinaryData
を指定することでdatauri 形式の結果を取得することができます。
1点注意として、このJSON 関数は非動作関数ですので、ラベルなどのコントロールでは設定することができません。
一度変数などに格納してあげてください。
最後に、このJSON 関数の戻り値は文字列ですので、ダブルクォーテーション(")が付与されています。
このままPower Automate に渡してしまうと文字列として扱われてしまうので除去します。
Substitue 関数を用いてダブルクォーテーションを置換しましょう。
Substitute(JSON(Image1.Image, IncludeBinaryData), """", "")
さて、これで1の処理が実現できるわけですが、今回はもう少し先をいって複数ファイルを処理できるようにしましょう。
上で添付ファイルコントロールからアップしたファイルがどこに保存されるのかを確認するために、First 関数を利用していましたが、これは添付ファイルコントロールが複数のファイルを受けとる性質上テーブル形式となっているため、First 関数を使って1レコード取得していたのです。
当然ですが、1つの画像コントロールに複数のファイルコンテンツを設定することはできません。
よって、添付ファイルの数だけ画像コントロールが必要になってきます。
コントロールを添付ファイルの数だけ(レコードの数だけ)増やす。
となると、ギャラリーコントロールを使えばいいですね。
ギャラリーを配置し、その中に画像コントロールを追加します。
設定値はそれぞれ以下のようになります。
Gallery1.Items
AttachmentComponent_1.Attachments
Image1.Image
ThisItem.Value
先ほど説明したようにJSON 関数は非動作関数なので、次の処理でdatauri に変換します。
ボタンを配置し、 OnSelect
に以下処理を記載します。
Button1.OnSelect
Set( attachmentFiles, ForAll( Gallery1.AllItems, { name:Name, content:Substitute(JSON(Image1.Image, IncludeBinaryData), """", "") } ) );
datauri に変換する処理は、ギャラリーのアイテム数分行いたいので、ForAll 関数を用いています。
ForAll の結果はテーブルを返しますので、各レコードには名前(name)とdatauri 変換されたファイルコンテンツ(content)が含まれるようにしています。
このテーブルのままではPower Automate に渡すことができないので、テキスト形式にします。
この際に使用するのもJSON 関数です。
JSON(attachmentFiles, IndentFour)
とすることで、テーブル(コレクション)をJSON 形式に変換することが可能です。
これはよく使うので覚えておくと便利です。
実際のPower Automate に渡す処理は以下です。
Button1.OnSelect
Create_DocumentFile_to_SharePoint.Run(JSON(attachmentFiles, IndentFour))
Power Automate 側の処理
Power Automate の全体フローは以下のようになっています。
まず、Power Apps からはJSON 形式でデータが渡ってきているので、その中の情報を抜き出します。
"JSON の解析"アクションを追加し、以下のように設定します。
{ "type": "array", "items": { "type": "object", "properties": { "content": { "type": "string" }, "name": { "type": "string" } }, "required": [ "content", "name" ] } }
これで、先ほどForAll で作成したようなテーブルの情報がこのフロー内でも扱えるようになりました。
続いて"ファイルの作成"アクションを追加します。
ファイル名にはJSON の解析で取得した name
( @{items('Apply_to_each')['name']}
) を設定します。
name には添付ファイルのファイル名を設定するように先ほどレコードを作成しましたね。
続いてファイルコンテンツに設定する式ですが、Power Apps から渡したdatauri 形式のまま設定してもファイルが想定通り作成されません。
ここに設定するのは、Binary 形式です。
そこで、dataUriToBinaryという関数を利用します。
これを利用することでdatauri 形式を Binary 形式に変換することが可能になります。
dataUriToBinary(items('Apply_to_each')['content'])
以上でファイルのコンテンツ情報をdatauri に変換してドキュメントライブラリに保存する方法の纏めは完了です。
おわりに
実際に処理を作成するときに、考えそうなやり方にそって記事を作成しましたが、大分冗長てきな書き方になってしまいました。。。
長くなってしまいましたが、最後まで読んで頂きありがとうございましたー
次はPower Apps V2 コネクタを利用したやり方の紹介になります。