重すぎる画像を弾く!Power Appsで添付ファイルのサイズや枚数を制限する方法

添付ファイルのサイズ制限は、Power Apps側で作るしかない

スマホで撮影した写真を何枚も添付されて、保存時にエラーが出る、Power Appsで添付ファイルを扱うアプリを作ったことがある人なら、一度は経験するトラブルです。SharePointには列ごとのファイルサイズ上限はありますが、Power Appsは標準状態ではその上限を超える添付を止めてくれません。つまり、制限の仕組みはアプリ側で作る必要があります。

この記事では、添付ファイルの枚数制限・拡張子チェック・送信ボタンの制御という3つの観点から、実用的なバリデーション設計を解説します。

なぜ添付ファイルのバリデーションが必要なのか

私が開発した現場報告アプリでも、運用開始直後に同じ問題が起きました。スマホで高解像度の写真を5〜6枚添付した状態で送信ボタンを押すと、SharePointへの保存が途中でタイムアウトし、データが中途半端な状態で残ってしまうのです。しかも、エラーメッセージが分かりにくいため、保存できたと思い込んで離席するユーザーも出てきました。

こうした問題を未然に防ぐには、添付時点でファイルをチェックする仕組みが必要です。添付コントロールには OnAddFile という専用のプロパティがあり、ここにバリデーション処理を書くことでファイル追加のタイミングで制御できます。

枚数制限の実装

CountRowsで添付数をカウントする

添付ファイルコントロールの .Attachments プロパティは、添付されているファイルのテーブル(コレクション)を返します。これを CountRows 関数に渡せば、現在の添付枚数をリアルタイムに取得できます。

枚数制限を実装する基本的な考え方は次の通りです。

  1. 添付コントロールの OnAddFile プロパティを開く
  2. CountRows で枚数を確認し、上限を超えていたら Notify でエラーを表示しつつ Reset で追加をキャンセルする
  3. 送信ボタンの DisplayMode も添付枚数の条件に連動させる

OnAddFile プロパティに書く数式の例です。

If(
    CountRows(DataCardValue5_1.Attachments) > 3,
    Notify("添付ファイルは3枚までです", NotificationType.Error);
    Reset(DataCardValue5_1)
)

Reset 関数を呼ぶことで、追加しようとしたファイルをその場でキャンセルできます。ユーザーには Notify のポップアップでメッセージが表示されるため、なぜ添付できなかったのかが一目でわかります。

拡張子チェックの実装

OnAddFileにSplit関数で拡張子を取り出す

枚数だけでなくPDFしか添付できないといった拡張子の制限も、同じく OnAddFile プロパティで実装できます。ファイル名から拡張子を取り出すには Split 関数を使います。ファイル名をドット(.)で分割して末尾の要素を取れば、拡張子だけを抽出できます。Split 関数についてはテキスト関数の解説記事でも触れていますが、この使い方は特に実用的です。

拡張子チェックの実装例です。

If(
    CountRows(Filter(DataCardValue5_1.Attachments, Last(Split(Name, ".")).Value <> "pdf")) > 0,
    Notify("PDFファイルのみ添付可能です", NotificationType.Error);
    Reset(DataCardValue5_1),
    Set(varValidationAttachment, true)
)

この数式の動きを分解すると次の通りです。

  1. Filter で拡張子がpdfでないファイルを絞り込む
  2. CountRows で該当ファイルが1件でもあるか判定する
  3. あれば Notify でエラーを出し、Reset でキャンセルする
  4. 問題なければ変数 varValidationAttachment を true にする

許可する拡張子は「pdf」の部分を変更するだけです。「xlsx」や「png」など複数許可したい場合は Filter の条件を And や Or で組み合わせます。

送信ボタンの制御

変数と DisplayMode を連動させる

バリデーションが通ったかどうかを変数(varValidationAttachment)で管理することで、送信ボタンの DisplayMode と連動させられます。

// 送信ボタンの DisplayMode
If(varValidationAttachment, DisplayMode.Edit, DisplayMode.Disabled)

ここで注意したいのが、変数の初期化タイミングです。画面の OnVisible プロパティで Set(varValidationAttachment, false) を実行しておくことで、画面を再訪問したときに前回の状態が引き継がれる問題を防げます。変数の設計パターンについては変数の使い分けガイドも参考にしてください。

添付ファイル制限のまとめと応用

3つの制御をセットで実装する

添付ファイルのバリデーションは、次の3つをセットで実装するのがおすすめです。

制御の種類実装場所主な関数
枚数制限添付コントロールのOnAddFileCountRows / Reset / Notify
拡張子チェック添付コントロールのOnAddFileSplit / Last / Filter / Reset
ボタン制御送信ボタンのDisplayMode変数(varValidationAttachment)

バリデーション設計全体の考え方については、Power Apps入力ミス防止ガイドの記事で4つのアプローチをまとめています。添付ファイル制限はその中のアプローチ③:UI・選択制御の延長線上にある実装です。

また、カメラコントロールを使って写真を撮影してSharePointに保存するパターンとの違いも押さえておくと、設計の幅が広がります。カメラ撮影の実装についてはカメラコントロールと添付ファイル保存の記事を参照してください。

なぜ添付できないのかをユーザーに伝える

エラーメッセージは「エラーが発生しました」だけでは、ユーザーは何をすれば解決するかわかりません。PDFファイルのみ添付可能です・添付ファイルは3枚までですのように、制約と理由が1文でわかるメッセージを設定することが大切です。Notify 関数で表示するメッセージは NotificationType.Error(赤)・NotificationType.Warning(黄)・NotificationType.Information(青)から選べます。

まとめ

添付ファイルのバリデーションは、OnAddFile プロパティを使うことでファイル追加のその場で制御できます。

CountRows による枚数確認、Split と Last による拡張子チェック、変数と DisplayMode による送信ボタン制御。この3つを組み合わせれば、ファイルサイズ起因のエラーや不正形式の添付をアプリ側でほぼ防ぎきれます。

仕組みを作るのは最初の1回だけです。あとは要件が変わったときに数式の一部を修正するだけで対応できます。市民開発とはこういう地道な積み上げだと思っています。

Xでフォローしよう