MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

実行専用のアクセス許可で直接権限を持たないリスト・ファイルを読み書きする

Power Apps で何らかのデータソースを利用してアプリを作成する場合、よくある要望に『データには利用者に直接アクセス権限を与えたくない』というものがあります。

例えば人事情報など、利用者にはデータの一部を見せたいけど全体にアクセス権を与えられないようなケースが想定されます。(他の人の人事情報をみせたくない)

通常、Power Apps から直接データソースにアクセスしてデータの読み書きをする場合には、利用者それぞれがデータソースに何らかのアクセス権を持っていなければなりません。

SharePointリストであればHidden属性を有効にすることでサイトコンテンツから隠すという方法や

Power Automate を使って SharePoint リスト管理する (非表示設定) (SharePoint Technical Notes)

これと併せて、アイテム個別権限を設定して、個々のアイテムにアクセス権限を割り当てるという方法もとられます。

【SharePoint】固有の権限を設定する方法 | BEGIN-PROG

データソースがExcelファイルの場合、アイテム(テーブルの行)ごとのアクセス権というものはないので、上記のような方法では対応ができません。

そこで今回は、Power Automateを仲介させ、実行専用のアクセス許可を設定することで Power Apps の利用者に直接アクセス権限を与えずにデータの読み書きを行う方法を紹介します。

イメージはこんな感じ。

フローの作成

ここでは例として、Excelファイルから利用者に該当する行のみを取得しアプリで表示し、同時にアクセス記録を残すためにSharePointリストに実行したユーザーを記録していくことを考えます。

フロー自体はそれほど難しくはありません。

ポイントはトリガーに "Power Apps (V2)" を利用することです。無印の "Power Apps" トリガーだと実行専用のアクセス許可を管理できないので今回の方法が機能しません。

また、Excelファイルから該当の行を抽出する際、適切なフィルター条件を加えてあげないと対象のデータが取れないことがあります。

ここではフィルターとして、 Email 列 が Power Appsトリガーで得られた Email の値に等しいという設定をしています。

Excelの行取得アクションの結果は配列(テーブル型) なので、これをfirst()関数を使ってレコード型に置き換えます。(使っているアクションは Compose (作成))

first(outputs('List_rows_present_in_a_table')?['body/value'])

first(....)の中身は動的コンテンツから挿入してください。

最後にComposeアクションの結果から、対象の行を指定して結果をPower Appsに返します。 (outputs('Compose')?['対象の列名']のような式を入れる)

作成するフローは以上です。

フローの共有 (実行専用アクセス許可)

ここが今回の方法のキモです。利用者にはフローの実行権限 (Power Appsから呼び出せるようにする) のみを与えます。そしてこの際利用されるデータ接続を、作成者のものにします。

つまり、利用者Bさんはフローを実行できるけど、その時の各データソースへのアクセスには作成者であるAさんの権限を使うということです。

フローの概要画面右下にある『実行専用ユーザー』を編集します。

編集画面ではこのフローを実行するユーザー (=Power Appsの利用者)を追加します。

また、利用する接続情報には、フローの作成者の接続を利用するようにしてください。これで利用者に直接アクセス権限を与えずにデータ取得が可能になります。

おまけ:アプリ側

アプリ側ではフローを実行して、その結果をいったん変数に入れてやります。どのようなタイミングでもいいですが、ここではボタンをクリックしたときのアクションに設定します。

あとはラベルか何かに取得した結果を表示してあげれば完了です。(result.新給与など)

アプリを利用者に共有すればOK

注意事項

今回の仕組みでフローの中でデータの登録/編集を行う場合、登録/編集者はフロー作成者であるAさんになる点に注意してください。

おわり

今回はよくあるお悩み『Power Appsでデータの読み書きをさせたいけど、データには利用者に直接アクセス権限を与えたくない』をPower AutomateとPower Apps (V2)トリガーを利用することで解決する方法をご紹介しました。

特に行ごとのアクセス制御ができないようなデータソースを利用する場合に有効な方法になるかと思います。

フローを介する分、直接読み書きするよりは遅くなる、テーブル形式のデータをPower Appsに返すには一工夫必要など、必ずしも万能ということではありませんが、一つのテクニックとして覚えておくとよいでしょう。