PowerAppsでユーザーのアクセス権を管理する3つの方法( IN演算子の使い方)
今日は業務システム開発で必須な、ユーザーのアクセス権を管理する3つの方法をご紹介します。ご自分のシナリオに合わせて使い分けられる様になります。
(動画時間:10:37)
Udemy.comでオンラインコースを運営しています。
マイクロソフトPowerApps 中級編【SharePointで、実務で使える業務アプリの作り方:勤怠管理アプリ編】
⇒ 半額になる「ディスカウントリンクページ」へ
ユーザーのメールアドレスを使ってのそのユーザーのデータだけをギャラリーに表示する。
こんにちは、リーンシグマブラックベルトのマイク根上です。
業務改善コンサルをしています。
今日はこの動画リクエストからです。
「いつも参考になります!
ユーザー毎にアクセス権を変える方法知りたいです!」
こちらのコメントはPowerAppsの承認ワークフローのアプリで、
ユーザーの役割によってボタンが表示されたり非表示にする事で
アクセス権を変える動画に対して頂きました。
⇒「PowerAppsだけで承認ワークフローアプリを作る。Power Automate無しで!」
その方法と合わせて今回は3つの方法をご紹介しますので、
ご自分のシナリオに合わせて使い分けて下さい。
まずは一番簡単なギャラリー内で
そのユーザーのデータしか見せない方法です。
上図がその承認ワークフローのアプリで、
この画面に自分で提出した申請だけが表示されます。
ここでは他の人の申請は関係ないし、
セキュリティ上載せたくないですよね。
そこでそのギャラリーの「Items」属性を見みましょう。
ギャラリーの「Items」属性
=Filter(
Tbl_Receipt_Approval,
Submitter_Email=ユーザーメール
)
Filter関数でそのデータソースには
申請者Eメール(Submitter_Email)列があり、
その列で変数「ユーザーメール」で絞り込みをしています。
Appコントロールの「OnStart」属性でアプリが起動した時に
そのユーザーのメールアドレスをその変数に入れています。
Set関数を使っているので、このアプリのどの画面でもその変数を使えます。
Appコントロールの「OnStart」属性
=Set(
ユーザーメール,
Lower(User().Email)
)
ユーザーの役割や部署によって使えるボタンや機能を制限する。
次にユーザーの役割や部署によって
使えるボタンや機能に制限をつけるやり方をお見せします。
今回のリクエストされた方はこのやり方を聞かれてたのです。
先ほどと同じ画像ですが、
このアプリは今は承認者用の設定で、
ギャラリー内に「承認」と「却下」のボタンが表示されていて、
画面下に「承認者登録」ボタンが使える事にご留意下さい。
それをクリックすると「承認者登録」画面に行き、
ここで登録者の追加ができます。
ここのチェックボックスのチェックを外すと無効となり、
そのユーザーの承認者権限が無くなるのです。
その「OnSelect」属性の式を見てみます。
チェックボックスの「OnSelect」属性
=Patch(
Tbl_Approver_List,
ThisItem,
{
Active: If(
Self.Value,
”有効”,
”無効”
)
}
)
チェックが入っている時は、
Patch関数でデータソースの有効性(Active)列に「有効」が入り、
チェックが外れている時には「無効」が入る様にしています。
そして「Text」属性を見てみると
下記の式で「有効」か「無効」が正しく表示されます。
チェックボックスの「Text」属性
=ThisItem.Active
また、チェックボックスでは「Default」属性が
「true」ならチェックが入り、
「false」ならチェックが外れる様に表示されるので、
下記の式で正しくチェックが表示されるのです。
チェックボックスの「Default」属性
=ThisItem.Active = “有効”
チェックを外して僕の承認者権限を無効にしました。
最初の画面に戻るとさっき表示されていた承認、却下と
下のボタンが非表示になりました。
今は僕は一般ユーザーの権限しかないので、
それらのボタンが使えません。
これにより、使える画面も制限する事ができるのです。
権限の制御は各ボタンの「Visible」属性で行っています。
ここでは「承認者」という変数が入っています。
下のボタンの「Visible」属性
=承認者
この画面の「OnVisible」属性で、
この画面に毎回来る度に変数「承認者」を
定義し直しているのです。
この画面の「OnVisible」属性
=Set(
承認者,
LookUp(
Tbl_Approver_List,
Approver_Email=ユーザーメール
).Active=”有効”
)
まず、LookUp関数で
承認者データベース(Tbl_Approver_List)内のそのユーザーの行を取得して、
その有効性(Active)列に「有効」の値が入っていれば
変数「承認者」にtrueが入って、
「無効」やそのデータベースにそのユーザーのメルアドが
入っていなければ「false」が入るのです。
それにより、各ボタンの「Visible」属性に
その変数を入れるだけでこの権限制御ができるのです。
僕は「Visible」属性の他にテキスト入力コントロールなどで
「DisplayMode」属性も同じ様な理屈でアクセス権限制御で使います。
今回の例で言えば承認者権限では編集可能だが、
一般権限では閲覧のみにするみたいにです。
担当部署のアクセス権を与え、その部署だけのデータをギャラリーに表示する。
次にユーザー管理画面を備えた
もっと実践的なやり方をお見せしましょう。
上図のシステムではユーザー管理画面があり、
これではユーザーの役割を「一般」、「承認者」、「管理者」など、
もっと複雑に定義ができます。
そして役割で「承認者」や「管理者」を選んだ時は
承認担当部署を選択するコンボボックスが出てきて、
そのユーザーがどの部署の承認を担当するかを
複数部署でも設定ができる様にしています。
このコンボボックスの詳しい説明は
次の記事でやりますので今回は割愛します。
そして下記の保存ボタンの「OnSelect」属性の式内で、
「CB_承認担当部署2」がそのコンボボックスです。
保存ボタンの「OnSelect」属性
=Patch(
K01Tbl_Users,
ThisItem,
{
Dep_In_Charge: If(
DD_役割2.Selected.Value=”一般”,
””,
Concat(
CB_承認担当部署2.SelectedItems,
ID,
”;”
)
)
}
)
それとこのConcat関数の部分をカーソルでなぞると
数式バー下部にその計算結果が表示されます。
その結果は選択された全部署の部署IDを
半角「;(セミコロン)」で繋げた文字列になり(1;4;2)、
データ型は「テキスト」です。
この様にConcat関数はテーブル、その中の列、
そして区切り文字を指定して、
その列内の値をその区切文字で繋げて文字列を作ってくれます。
それをPatch関数でユーザーデータベース(K01Tbl_Users)の
担当部署列(Dep_In_Charge)に保存しています。
次の説明のためにまず一部署(営業部)だけ選択しておきます。
因みに役割で「一般」が選択されている時は空欄「””」を保存します。
再掲:保存ボタンの「OnSelect」属性
=Patch(
K01Tbl_Users,
ThisItem,
{
Dep_In_Charge: If(
DD_役割2.Selected.Value=”一般”,
””,
Concat(
CB_承認担当部署2.SelectedItems,
ID,
”;”
)
)
}
)
今回は担当部署を事例にしていますが、
同じ方法で担当商品や、担当地域などでも同じ様に行えます。
同じ保存ボタンの「OnSelect」属性には他の式もあり
最後のSet関数を見て下さい。
保存ボタンの「OnSelect」属性内のSet関数
=Set(
ユーザー行,
LookUp(
K01Tbl_Users,
User_Email=ユーザーメール
)
)
LookUp関数とユーザーメールを使って、
ユーザーデータベース(K01Tbl_Users)から
そのユーザーのデータをレコードごと、
変数「ユーザー行」に代入しています。
ですからこの変数のデータ型はレコード型です。
これについてはまた後で詳述します。
次に上図が「承認決裁画面」で、
ここで自分が決裁する担当部署だけの申請が出ていて、
さっき「営業部」を選んだので
その部署に所属するユーザーの申請だけが表示されています。
下記のギャラリーの「Items」属性の式で
さっきの変数「ユーザー行」が使われています。
ギャラリーの「Items」属性内のSet関数
=Filter(
K01Tbl_Expense_Record,
Department_ID=ユーザー行.Dep_In_Charge
)
このレコード型の変数は便利で、
その変数の後で半角「.(ピリオド)」を入れると
そのレコードの全列が数式バー下のサジェスチョンに表示され、
一つを指定する事で指定した列の値として使えるのです。
ここでは「担当部署(Dep_In_Charge)」を選んで、
先ほどユーザー管理画面で設定した
そのユーザーの担当部署のIDとなるのです。
ですので、ここでやっている事はFilter関数で
「経費申請記録データベース(K01Tbl_Expense_Record)内の
部署ID(Department_ID)の値と
(これは申請者が所属している部署のIDです)
この承認者の担当部署IDと同じものだけでの絞り込みをしているのです。
このアクセス権の手法もよく使えるので覚えて下さい。
複数の担当部署のアクセス権を与え方(IN演算子使用)
しかし、一つ問題があります。
さっきのユーザー管理画面に戻って
承認担当部署を複数選んでみます。
すると最初の画面で何も出てこなくなります。
今回は「ユーザー行.Dep_In_Charge」の値が
複数の部署IDが連結された文字列だからです。
ギャラリーの「Items」属性の式を下記の様に変えると
その複数の部署からの申請がちゃんと出てきました。
ギャラリーの「Items」属性内のSet関数
=Filter(
K01Tbl_Expense_Record,
Department_ID in Split(
ユーザー行.Dep_In_Charge,
”;”
)
)
Split関数はさっきのConcat関数と全く逆の働きをします。
さっきの文字列(1;4;2)を第二引数の半角の
「;(セミコロン)」を区切り文字として分割して、
列名「Value」の一列だけの小さなテーブルにしてくれます。
すると「in」演算子が使えて、
各行の部署IDがそのテーブル内にあれば「true」を返して、
そのtrueの行(レコード)を全て表示します。
これでやりたい事が達成できるのです。
このアクセス権管理の手法は
本格的な業務システムを開発する時に必須になります。
逆に言うとこの手法を使う事で、
今までマイクロソフトアクセス等で作っていたレガシーシステムを
PowerAppsで多ユーザーへの対応も、
リモート運用も可能にする業務システムに
バージョンアップする事ができるのです。
もし皆さんでその様な業務システムが必要でしたら、
下のボタンからお問合わせ下さい。
「こちらの記事も読まれてます。」
Comment
Your blog’s layout is absolutely stunning. How long have you been blogging? You make it appear effortless. Both the appearance and the content of your site are excellent.