備忘録というよりほかに方法ないかなというフィードバック待ちの投稿です。
[20232/22追記]
Rezaが非常にスマートなアプローチを紹介してくれてました。なぜこれを思いつかなかったんだ…
このブログは読まなくていいのでぜひRezaの動画をご覧ください。
https://youtube.com/shorts/IGZc022MI_o?feature=share
状況設定とナイーブなアプローチ
今、仮に変数 "sourceFile" base64形式でPDFやテキストファイルのデータが入っているとします。これをSharePointリストの添付ファイルに登録したいというケースを考えます。
Power Apps で撮影した写真やファイルをSharePointリストの添付ファイルに登録したい場合、多くはPower Automateが使われてきました。特にbase64 (文字列) になっていればフローにそれを渡してbase64ToBinaryをすればファイルをリストに追加できます。
これをPower Appsだけでやろうと思うと途端に面倒になります。
例えばよくデータソースに保存する際に使われるPatch関数を使ってみます。
添付ファイルは当然配列(テーブル)なので、Table関数を使ってそれらしいテーブルを構成していますが、"Table(Attachment) 型を期待しているのにTable型が使われているよ"という謎のエラーが発生します。
多分スキーマがおかしい。
とりあえずの解
じゃあどうするかというと、あまり普段使わない "データソースにCollect関数でデータ登録"という方法をとります。
Collect( List1, { Title:"TestData", Attachments:Table({DisplayName:"test.pdf",Id:GUID(),Value:sourceFile}) } )
ここで List1 がSharePointリストです。 上記のようにCollectでデータを登録すると DisplayNameが "test.pdf" で、中身が sourceFile 変数に対応した添付ファイルが追加されます。
登録はひとまずこれでよさそう。
使い道
なぜこんなことやっているかというと、Power Appsに追加されたPDF関数を用いて、ギャラリーの内容をPDF化、ダウンロード可能にするような機能を作りたかったからです。
試しにこのような簡単なレイアウトの画面を作ります。"Generate PDF"ボタンをクリックすると、その下にギャラリーの内容をPDF化したものが表示されるというものです。
Generate PDFボタンには、PDF関数、JSON関数、そして先ほどのCollectを使って、リストの添付ファイルにギャラリーのPDF化したファイルを登録する処理を書いています。
Set(sourceFile,Substitute(JSON(PDF(Gallery3),IncludeBinaryData),"""","")); Set(_lastid,GUID()); Collect(List1,{Title:_lastid,Attachments:Table({DisplayName:"test.pdf",Id:GUID(),Value:sourceFile})})
"ダウンロード可能なファイル"という部分はフォームコントロールになっていて、登録したファイルのタイトルと一致するリストアイテムを表示しています。
これでフローを介さずにPower AppsのギャラリーをPDFにしてすぐさまダウンロードすることができます。
ということで、求改善案!でした。