【PowerApps】アプリから直接リンク付きのメールを送り、承認機能を実装するやり方(Param関数、アクセス権管理)
今日はPowerAppsのアプリから直接ハイパーリンク付きのメールを送り、承認業務を自動化する機能とデータのアクセス権管理機能の作り方をお見せします。
(動画時間:10:25)
Udemy.comでオンラインコースを運営しています。
マイクロソフトPowerApps 中級編【SharePointで、実務で使える業務アプリの作り方:勤怠管理アプリ編】
⇒ 半額になる「ディスカウントリンクページ」へ
アプリから直接リンク付きのメールを送信する方法(「Office365Outlook」コネクター)
こんにちは、リーンシグマ、ブラックベルトのマイク根上です。
業務改善コンサルをしています。
二つ前の動画で画像承認アプリで
承認してもらう画像を保存する機能まで作りました。
⇒「【PowerApps】 画像承認アプリの作り方:前編(フォームで選択されている画像をギャラリーに表示する方法)」
今日はその続編で、その承認者に自動でメールを送り、
その中のURLをクリックするとアプリの管理者承認画面が開いて
承認決裁ができる機能の作り方をお見せします。

上図が承認を受ける画像を選択したところの画像提出画面のイメージです。
その後のメールの送り方ですが、提出ボタンの「OnSelect」属性では、
SubmitForm関数で、フォームの入力内容の保存だけしています。
出ボタンの「OnSelect」属性
=SubmitForm(Form1)
メールを送る機能はフォームの「OnSuccess」属性に入れています。
Launch関数を使ってメールを送る事もできますが、
それだとリンク付きのメールは送れません。
⇒「PowerAppsのLaunch関数でアプリから直接、メール、テキスト、通話をし、Webページを開く」
そこで「Office365Outlook」コネクターを使うのです。
それを使うためにはまず、画面左の「データ」アイコンから、
「データの追加」で、検索ボックスに「Office」とタイプして、
「Office 365 Outlook」コネクターを追加します。
それで「OnSuccess」や「OnSelect」などの動作の属性内で使える様になります。
その属性内で「Office365」とタイプすると
サジェスチョンに使える沢山の機能が表示され、
その中で「SendEmailV2」関数を使います。

数式バー上の引数の説明を見て頂いて(上図参照)、
第一引数に送信先のメルアド、第二引数に件名、第三引数に本文を入れます。
フォームの「OnSuccess」属性 =Office365Outlook.SendEmailV2 First( Filter( Tbl_Employees, Department=ユーザー行.Department && Role=”Y” ) ).Email, ”製品番号の修正の承認依頼”, ”<a href='[画像承認アプリへのURL]’>これ</a>をクリックして確認画面へ” );
上のコードがその「SendEmailV2」関数の数式です。
第一引数の送信先(First関数内)ですが、
この式でユーザーのメルアドとユーザー管理画面の情報から
所属部署の管理者のメルアドを取得しています。
これはアクセス権管理の一部で、この記事の後半でもっと詳しく説明します。
PowerApps内でHTMLのハイパーリンクの作り方
第三引数でメールの本文に今日のテーマの、
指定のアプリ画面へのリンクの作成をしています。
まず大前提として、ここではHTMLのコードを
半角の「”」で挟んで使っています。
HTML難しいーと思う方もいるかもしれませんが、
これから伝えるコードをテンプレとしてお使い下さい。
そのテンプレが次のコードですが、その後に説明をします。
ハイパーリンク付きのメールのテンプレ
“<a href='[アプリのURL]?[パラメータ名]=“ & [パラメータ値] & “’>[リンクのテキスト]</a>[残りの文章]”
そして次のコードがそのテンプレを使った今回のメール本文のコードです。
今回のメール本文のコード
“<a href='[アプリのURL]?記録ID=“ & Form1.LastSubmit.ID & “’>これ</a>をクリックして確認画面へ”
HTMLでリンクを作成するのに始めに「<a href=’」と入れて、
その後にリンクさせたいアプリのURLを入れます。
URLを半角の「’」で挟むのを忘れないで下さい。
アプリのURLは画面右上の「共有」から、
次の画面の「Webリンク」からコピぺできます。
そのオリジナルのURLだけだと、
承認者がそのリンクをクリックすると
そのアプリが普通に起動するだけです。
ここでは更に管理者承認画面に行き、
その申請者が申請したデータを直接見れるようにします。
その方が遥かに良いですよね。
それに必要な情報、パラメーターと言いますが、
それをこのURLの後に繋げます。
それは「?」から始まり、ここの「記録ID」をパラメーターと言い、
ご自分の好きな名前を使えます。
その後に半角「=」を入れて、
パラメータに入れる値を指定します。
これ全体はテキスト型なので半角の「”」と「&」で繋げていきます。
次の「Form1.LastSubmit.ID」の式で
直前にフォームからデータソースに保存された
レコードのID列の値を取得します。
そのID値をパラメーター「記録ID」に代入したことになるのです。
その後にまた半角の「&」と「”」で次のテキストに繋げて、
「‘>」で、リンクのURLの完成です。
そしてこのリンクを入れたいテキストを入れて、
ここでは「これ」にしています。
その次の「</a>」でHTMLのハイパーリンクの完成です。
そして残りのメールの本文に入れたい文章を入れます。

それで上図の様なメールが作成されます。
このリンクの入った「これ」をクリックすると
ブラウザが開いてアプリの中で(下図参照)
さっきのパラメーター「記録ID」に代入されたIDのデータが表示されるのです。

Param関数を使てアプリ起動後の表示画面を制御し、指定のレコードのデータの表示の仕方
上図が管理者承認画面のイメージです。
指定のレコードの情報の見せ方を見てみましょう。
管理者承認画面は実はさっきの画像提出画面と
同じアプリ内で作っています。
わざわざアプリを分けて作る必要はありません。
アプリが起動してどの画面を最初に見せるかを
Appコントロールの「StartScreen」属性で制御ができます。
Appコントロールの「StartScreen」属性
=If(IsBlank(Param(“記録ID”)), 画像提出画面2, 管理者承認画面3)
これがその式でIf分の条件式にあるParam関数ですが、
アプリ起動時のURLからパラメータ「記録ID」内の値を取得できるのです。
もしオリジナルのURLからアプリを起動したら記録IDはありません。
その場合はこのParam関数の結果は空白になります。
その時は第二引数にある「画像提出画面2」に行きます。
もし記録IDに値が入っていたら、
空ではないので第三引数の「管理者承認画面3」に飛びます。
その場合、管理者承認画面の「OnVisible」属性の式が重要です。
管理者承認画面の「OnVisible」属性
=UpdateContext(
{記録行:LookUp(
D01Tbl_Modification_Records,
ID=Param(“記録ID”)*1
)}
)
Param関数からの記録IDとLookUp関数を使って
対象のレコード全体を変数「記録行」に入れています。
それをギャラリーの「Items」属性で、
「記録行.添付ファイル」の式でそのレコードの
「添付ファイル」列にある全提出画像を見せています。
ギャラリーの「Items」属性
=記録行.添付ファイル
更に、テキストラベル内でその変数を使って、
見せたい列のデータを表示しています。
テキストラベルの「Text」属性
=”修正日:” & 記録行.Date & “、修正者:” & LookUp(
Tbl_Employees,
Email = 記録行.Operator_Email,
Employee
) & “、既存の製品番号:” & 記録行.Pre_Product_Num & “、新しい製品番号:” & 記録行.New_Product_Num
それらの情報を見て管理者は今回の画像申請を
合格か再提出させるかの決裁をして、
「送信」ボタンを押すのです。
その「OnSelect」属性のPatch関数で
同じレコード内の決裁列(Result)にその結果を記録して、
またユーザーにその結果を知らせるメールを送信するのです。
送信ボタンの「OnSelect」属性
=Patch(
D01Tbl_Modification_Records,
記録行,
{Result: If( Toggle1.Value, “合格”, “再提出”)}
);
ユーザー管理画面でPowerAppsでも多様なアクセス権限管理ができる。
最後にアクセス権管理の仕方もお見せしましょう。
下図がそれに使うユーザー管理画面です。

ここでユーザー登録をしていないと
そのユーザーがアプリを起動した時に、
画面いっぱいのテキストラベルが開いて、
アプリを使えない様にしたり、
所属部署のデータしか見えない様にするなど、
会社の実情に合わせたデータアクセス権管理機能を
作る事ができるのです。
今日のシナリオではまず、
- ユーザーのメルアドからユーザーの所属部署を取得して、
- その同じ部署で管理者列にチェックが入っているユーザーを探して、
- そのユーザーのメルアドを取得しています。
それがそのユーザーの承認者のメルアドとなり、
その人に承認依頼のメールを送るのです。
それを実行するのに二つの式を使います。
一つ目はAppコントロールの「OnStart」属性の式です。
Appコントロールの「OnStart」属性
=Set(ユーザー行, LookUp(Tbl_Employees, Email = User().Email))
ユーザーのメルアドからそのユーザーのレコードを
丸ごと変数「ユーザー行」に入れています。
この変数を使って、アプリの色んな所で
このユーザーの情報を簡単に使える様になります。
そして二つ目の式がさっきの提出画面の
メールを送信する数式の第一引数です。
フォームの「OnSuccess」属性 =Office365Outlook.SendEmailV2 First( Filter( Tbl_Employees, Department=ユーザー行.Department && Role=”Y” ) ).Email, ”製品番号の修正の承認依頼”, ”<a href='[画像承認アプリへのURL]?記録ID=“ & Form1.LastSubmit.ID & “’>これ</a>をクリックして確認画面へ” );
それはFirst関数から始まりますが、
まず、Filter関数を使ってユーザー管理データベース内で、
そのユーザーと同じ部署(Department)で
管理者列(Role)が「Y」である、
つまりチェックが入ったユーザーを特定しています。
Filter関数のままだとデータ型はテーブル型なので
列の値が取得できませんので、
First関数を使って一レコードにして、
そのEmail列からそのユーザーのメルアドを取得しています。
つまりそれが承認者のメルアドになるのです。
今回の内容は非常に高度な内容でしたね。
この内容を応用するとPowerAppsだけで、
非常に複雑なアクセス権管理や各種承認業務、
そして多様な情報のやり取りをする業務システムを構築する事ができるのです。
実際に僕のクライアントさんで
ユーザーが100人以上で拠点別でのアクセス管理が必要なシステムを
PowerAppsで作りました。
全てクラウドベースにできるので、
今後既存のマイクロソフトアクセスで作った
レガシーシステムもこのPowerAppsで作り変えていく
必要が出てくると思います。
⇒「MS Accessの終焉?デスクトップでもPowerApps【PowerApps+MS Teams】」
もしそのようなシステムが必要な方は
ご連絡を頂ければお手伝いをする事もできます。
「こちらの記事も読まれてます。」