業務改善と標準化を同時に実現:MS 365業務システム開発

PowerAppsでユーザーのアクセス権を管理する3つの方法( IN演算子の使い方)

  
PowerAppsでユーザーのアクセス権を管理する3つの方法( IN演算子の使い方)
\ この記事を共有 /
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関数の部分をカーソルでなぞると
数式バー下部にその計算結果が表示されます。

数式バー株の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

  1. temp mail より:

    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.