はじめに
Power Platformを使用して開発する際、ほぼ100%で立ちはだかる壁は 「Sharepointの容量問題」 だと思います。
★実装経緯
今回のSharepoint容量問題は、フォームコントロールからファイルを添付→その添付ファイルをPower Automateの処理に使用する際、30MBを超過するとアプリ全体のパフォーマンスに影響し、処理が重くなったりエラーが発生したりする確率が上がるといったものでした。
であれば、フォーム添付の時に30MB未満の制限をかけちゃえばいいじゃん!となり、チェックを実装した次第です。
★注意
ちなみに30MB未満にしなさいという公式なドキュメントは存在しません。
ただし、添付ファイルをハードに使用したい & パフォーマンスも低下させたくないアプリを作成する場合は、Base64膨張・フローの同期応答(約8MB)・および下流コネクタ(Outlookなど)のメッセージ/添付制限などが重なることから、実質30MB制限をかけることが推奨されます・・・
この記事はTDCソフト株式会社Advent Calendarの16日目です。
前提(この記事での解説は省きます)
- SharepointリストをDBとする
→TDCソフト株式会社Advent Calendar 17日目の記事を参考にしてください!
- 上記リストに紐づくフォームコントロールが存在するアプリの画面があること
- フォームには添付ファイルコントロールが存在すること
※以下キャプチャのようにフォームを作成すると以降の作業がスムーズです。

ギャラリーコントロールを使用!
なぜ?
- ギャラリーのImageを使用することで、JSON文字列化→Base64文字列長からバイト数を算出し、サイズ計算を安定かつ正確に実行できる
- 元ファイルのまま計算した際の容量取得の誤差・計算ミスや環境差によるブレを回避でき、再現性が高い
- ファイル形式を問わず同一ロジックで処理でき、上限チェックなどのバリデーションやログ出力が簡素化され、保守性も向上する
どうやって設定?
-
画面内に垂直ギャラリーを設置
ギャラリーのItemsプロパティに以下処理を設定If( !IsBlank(DataCardValue8.Attachments), colFiles )注意
※1「DataCardValue8」は添付ファイルコントロールの値に変更してください。
※2 colFilesは以下「添付ファイルコントロールへの設定」でコレクション化を行っていますので、先にこの処理を設定するとエラーになります(後続で設定するのでスルーして問題ないです)。 -
ギャラリー内のSubtitleコントロールのTextプロパティに以下処理を設定
"ファイルサイズ合計:" & Text(Round(totalSize / 1024 / 1024, 2)) & " MB" -
ギャラリー内のTitleコントロールのTextプロパティに以下処理を設定
totalSize -
ギャラリー内のImageコントロールのTextプロパティに以下処理を設定
ThisItem.Content -
ギャラリー全体を非表示に設定
ギャラリーのVisibleプロパティに以下処理を設定false注意
※手順3, 4, 5はこの段階ではエラーになりますが、以降「添付ファイルコントロールへの設定」の手順を踏むと解消されます。
添付ファイルコントロールへの容量チェック処理追加
MaxAttachmentsプロパティ
デフォルト値の「6」を適当な大きめの数値に変更(私は10000に設定しています。)
MaxAttachmentSizeプロパティ
デフォルト値の「10」を適当な大きめの数値に変更(私は250に設定しています。)
OnAddFileプロパティ
-
添付ファイルコントロールに追加されたファイルをコレクション化
※コレクション化とは・・・
Power Apps内で一時的にテーブルを作成し、そのテーブルの情報をアプリ内で一意に使用できる機能です。随時使用したコレクションに対し、テーブル値をクリアしたりコレクトすることでテーブルのデータを動的に変更することができます。// 添付ファイルをコレクションに格納 // ファイルサイズは0で初期化 Clear(colFiles); ForAll( DataCardValue8.Attachments As addFile, Collect( colFiles, { Name: addFile.Name, Content: addFile.Value, Size: 0 } ) ); -
ギャラリーに添付ファイル情報を詰める
★ 記事上部のギャラリーコントロールを使用!>どうやって設定?を参照。 -
ギャラリーを経由して添付ファイルサイズを正しく取得
★ ギャラリー使用の経緯は、記事上部のギャラリーコントロールを使用!>なぜ?を参照。// ギャラリー経由でサイズを取得してcolFilesを更新 ForAll( 'Gallery1(容量計算に使用のため非表示)'.AllItems As File, Patch( colFiles, // ギャラリーとcolFiles内のファイルコンテンツで一致するものを取得 LookUp(colFiles, Content = File.Content), With( { // ギャラリーのImageに格納したファイルコンテンツをJSON文字列化→Base64文字列化 Base64: Substitute( Substitute( Match( JSON(File.Image1.Image, JSONFormat.IgnoreBinaryData), "(?<=base64,).*" ).FullMatch, """", "" ), "=", "" ) }, { // 上記でBase64文字列化したファイルのサイズを定義 Size: Len(Base64) * 6 / 8 } ) ) ); -
totalSize(グローバル変数)各ファイルのサイズ(ギャラリーで計算したサイズ)を合計
// 合計サイズを取得 Set( totalSize, Sum(colFiles, Size) ); -
④の合計サイズが30MB超えていればエラーポップアップを表示
30MBを超えていなければOKの旨のバナーをアプリ上部に表示// 30MB制限チェック If( totalSize > 30 * 1024 * 1024, Notify("添付ファイルの合計サイズが30MBを超えています。", NotificationType.Error); UpdateContext({showPopUp: true}), Notify("ファイルサイズは問題ありません。", NotificationType.Success) );
添付ファイルコントロール全体の挙動をあわせるため、下記プロパティにも同様の設定を行ってください。
・OnRemoveFileプロパティ
→一度追加した添付ファイルを削除するときに走る処理
・OnUndoRemoveFileプロパティ
→一度追加し、削除したファイルを再度復活させるときには走る処理
ファイルサイズの可視化
概要
以下のようにファイルサイズの合計を添付ファイルコントロールの上部に表示します。

設定方法
- 添付ファイルのデータカード内にテキストコントロールを追加
-
1で追加したテキストコントロールのTextプロパティに以下処理を追加
If( IsEmpty(colFiles), "ファイルサイズ合計:0.00MB", Subtitle1.Text )
上記処理の簡易説明
IsEmpty(colFiles):ファイルが添付されていない場合を指します。
colFilesが空だった場合は0.00MBを、添付ファイルが存在する場合は、ギャラリーのSubtitleの値を表示するようにしています。
実際の挙動
何も添付されていない場合
30MB未満のファイルが添付されている場合
30MBを超えたファイルが添付されている場合
(※ポップアップの実装方法は後日記事にしたいと思います・・)
さいごに
最初は添付ファイルの制限をコントロールのMaxAttachmentSizeプロパティで実装しようと思っていました。
しかし、このプロパティで制限できるのは1ファイルのファイルサイズだったため、複数ファイルが添付された時に適用されないことが判明し、上記ロジックを組んでチェックする経緯となりました・・。
かなり複雑なステップを踏んでいますが、これでファイルサイズを簡単に制限することができます!
是非使ってみてください。
(もっと簡単な実装方法があればコメント等でご教示いただけますと幸いです。。。)
Power Appsでは他にもこんな機能を実現できます!




