【Office365】PowerApps+FlowでOffice365運用を楽にする!

皆さんこんにちは、Miyaです。

今回はOffice 356の運用の一つである”オブジェクト運用”の改善をテーマにPowerApps+Flowでアプリケーションを作成してみたいと思います。

ここでの”オブジェクト運用”とは、Office 365におけるユーザー、メーリングリスト、Office365Groupsなどのオブジェクトを”作成”、”変更”、”削除”することを意味します。

本記事では、PowerAppsとFlowの知見を深めるために筆者が試行錯誤した結果のメモ書きになりますので、参考程度にお読みいただけますと幸いです。

スポンサーリンク:

課題点を定義

まずは、”Office365のオブジェクト運用”を問題として挙げているわけですが、そこを少し具体的に定義しておきます。尚、ここではよくある運用フローを例に話を進めていきます。

以下のようにITBeginnerGroupでは、各社の担当者が定められたフォーマットに従って作成したいユーザーの人事情報を入力してヘルプデスクに申請した後に、ヘルプデスクがPowerShellでユーザー作成・ライセンスを割り当てています。

PowerAppsヘルプデスクはExcelに記入された申請データーの確認・作業が必要になり、担当者は申請内容作業のために出社したり、その作業工数が発生したり・・・、と色々と問題があります。

そこで、申請手段をExcelではなくPowerAppsで申請アプリを作成しヘルプデスクの作業をFlowで自動化することで上記の問題を解決したいと思います。

なぜPowerAppsとFlow?

なぜ、問題点に対する解決手段としてPowerApps/Flowを選択したのか?ですが、スクラッチで開発するよりもメリットが盛りだくさんのためです。

  • スイート版ライセンスに製品ライセンスが含まれているため(ランニングが安価)
  • Office365とのコラボレーション機能が豊富なため
  • アプリケーションの機能追加を簡単に追加実装できるため
  • Office365の仕様変更に伴う改修が簡単なため

マルチクラウド連携のソリューションはFlow以外にもありますが、それらに比べてPowerAppsと連携したデータ入出力、ランニングの安さがポイントかと思います。

FlowからMicrosoft Graph APIを叩くのには、Premiumライセンスを必要としますが、利用するユーザー数分だけで済みますし、価格もそれほど高くはありません。

システム構成

本システムでは、PowerAppsとFlowの接続データベースとして、Azure SQLを選択しました。

PowerAppsPowerApps/Flowでは、様々な種類のデータソース(SQL Server、SharePoint Online、Excel…など)に接続して、レコードを操作することが出来ます。

今回はPowerAppsの”委任”をサポートする関数が多いことと、私が単純に触りたかったため、Azure SQLをデータソースとして使っています。
参考:キャンバス アプリでの委任について
参考:PowerApps でキャンバス アプリのパフォーマンスを最適化する
*本システムでは、現時点はFilter関数ぐらいしか委任を利用しないので、SharePoint Onlineでも問題ございません。

また、本記事ではとりあえず新規ユーザー作成までを実装するところまでとします。今後の記事で追加実装していくスタイルで進めたいと思います。

それでは、早速作成していきたいと思います。

Azure SQL

まずは、データソースとなるAzure SQLを新規作成します。

Azureポータルの[SQL データベース]-[追加]で新規のデータベースを作成します。試験的にされるのであればBasicサイズで構いません。

PowerAppsリソースのデプロイが完了したら、[概要]メニューにあるサーバー名をコピーしておきます。

PowerApps作成したデータベースにSQL Server Management Studioから接続します。

PowerApps*Azure SQLにはNSGとは異なるFW設定が在ります。[サーバーファイアーウォールの設定]から必要に応じて許可IPを設定してください。

今回作成するデータベースは列構成は以下の通りです。SharePoint Onlineで試す方も同じようなテーブル構成してみてください。

列名

制約 用途
PRIMARY NOT NULL

UNIQUE

GUID

CHAR

 –  – オブジェクト固有の識別ID

No

INT  –  –

申請No

Status

CHAR  –  –

申請状況

CreateDate

DATETIME  –  –  – 初回申請日時
LastUpdate DATETIME  –  –  –

最終更新日時

Applicant

CHAR  –  – 申請者

SurName

CHAR  –  –

GivenName

CHAR  –  –

DisplayName CHAR  –  –

表示名

EmailAddress

CHAR  – メールアドレス
Comment CHAR  –  –

備考

Reason

CHAR  –  –  –

差戻理由

Authorizer CHAR  –  –  –

承認者

Management Studioから列を追加するデータベースを選択した状態で[新しいクエリ]から、以下のクエリを実行して列を追加します。

CREATE TABLE TABLE01 (
GUID NVARCHAR(100) UNIQUE PRIMARY KEY,
No INT NOT NULL IDENTITY(1000000,1),
Status NVARCHAR(100) NOT NULL,
CreateDate DATETIME,
LastUpdate DATETIME,
Applicant NVARCHAR(100) NOT NULL,
SurName NVARCHAR(100) NOT NULL,
GivenName NVARCHAR(100) NOT NULL,
DisplayName NVARCHAR(100) NOT NULL,
EmailAddress NVARCHAR(100) UNIQUE NOT NULL,
Comment NVARCHAR(300),
Reason NVARCHAR(300),
Authorizer NVARCHAR(100)
);

作成されたテーブルを右クリックして、[上位200行の編集]をクリックします。

PowerAppsPowerAppsからテーブル参照出来ているか否かのチェックのために、サンプルデータを一行追加しておきましょう。

PowerApps以上でデータソースの準備は完了です。

アプリケーション登録

今回は、Graph APIでユーザーを新規作成するため、Flowから直接アクセストークンの取得・更新ができるよう管理者委任でアプリケーションを登録します。

Azureポータルの”アプリケーションの登録”メニューから、[新規登録]します。

登録後、[概要]ページに表示される”アプリケーションID”と”ディレクトリID”の値はFlowで使用するので控えておきます。

PowerApps[APIのアクセス許可]から、Graph APIのUser.ReadWrite.Allを”アプリケーションの許可”として追加しておきます。

PowerApps最後に、シークレットキーを発行してこれも控えておきます。

PowerApps以上で、アプリケーション登録は完了です。

PowerApps

次はPowerAppsで入力フォームを作成するために、キャンパス型アプリを新規作成します。

データを使用して開始”メニューの”“アイコンをクリックして、先ほど作成したAzure SQLをデータソース(Office365CreateUser)として接続し、テーブル(TABLE01)を選択します。

PowerAppsPowerAppsがひな形のアプリケーションとしてビルドしてくれるので、プレビュー再生(F5)でサンプルレコードが参照できることを確認します。

PowerApps

さて、まずは”EditScreen1“の”EditForm1“を選択して、”フィールドの編集“から各種フィールを追加していきます。

PowerAppsGUID

レコードの主キーになります。PowerAppsでは、GUID()関数を使うことで一意な値を生成することができます。

GUIDカード配下の”DataCardValue“を選択して、”Default“プロパティにGUID()を記述します。

PowerApps

プロパティ 内容
Default Text(GUID())

参考:PowerApps の GUID 関数

参考:PowerApps の Text 関数

各種カードは既定で編集できないようブロックされています。プロパティを編集する際はロックを解除してから編集してください。PowerApps

このフォームはユーザーが直接入力するのではないため、ユーザーが編集できないようにする必要があります。このように特定アイテムを非表示したい場合、GUIDカードの”Visible“プロパティをFalseに設定することで実現できます。

PowerApps

プロパティ 内容
Visible False

参考:PowerApps のコアのプロパティ

CreateDate/LastUpdate

レコード情報が生成・更新された日時情報になります。PowerAppsのNow()関数を使って現在日時を入力するようにします。

PowerAppsは、型に応じた入力フォームで自動作成してくれるので、↓画像のような形式で生成されています。

PowerAppsこれだと不便なので”MinuteValue“,”HourValue“,”DateValue“,”Separator“を削除します。×アイコンが出てきますが一旦は無視しておいてください。

挿入“タブから”テキスト入力“を追加し、Defaultプロパティを↓のように設定します。

PowerApps

プロパティ 内容
Default Text(Now(), “yyyy/mm/dd hh:mm”)

参考:PowerApps の Now、Today、および IsToday 関数

次に、エラーを無くすためにErrorMessageの”Y“プロパティの値をクリアします。ErrorMessageのY座標は、先ほど削除した”HourValue“のY座標と高さを参照していたためにエラーが表示されていたのですね。

PowerAppsもう一つのエラーはCreateDateカードの”Update“プロパティです。これも削除したアイテムをデータソースとしているためエラーが発生していました。

Updateプロパティでは、先ほど追加したテキスト入力の値をデータソースとするよう↓のように書き換えます。

PowerApps

プロパティ 内容
Update TextInput2.Text

*TextInput2は環境に沿って変更してください。

参考:PowerApps のカード コントロール

LastUpdateも同様の手順で変更していきます。

Applicant

申請者のEmail情報になります。ここではPowerAppsのUser()関数からEmailアドレス情報を引っ張り、それをフォームに入力します。

PowerApps

プロパティ 内容
Default User().Email

参考:PowerApps の User 関数

Comment

申請時の備考欄になります。既定では一行テキストの形式であるため、”フィールドの編集“から複数行テキストに変更しておきましょう。

PowerApps最後に、CreateDate、LastUpdate、Reason、Authorizer、Statusはユーザーが直接編集する項目ではないため、VisibleプロパティをFalseにして非表示にしておきましょう。

PowerAppsAccept Icon

既定で用意されているAcceptIconは、クリックすることで各種データソースの値をSQLへレコード追加するようOnSelectプロパティに構成されています。

プロパティ 内容
OnSelect SubmitForm(EditForm1);ResetForm(EditForm1);

参考:PowerApps のコアのプロパティ
参考:PowerApps の EditForm 関数、NewForm 関数、SubmitForm 関数、ResetForm 関数、ViewForm 関数

そのため、特に手を加える必要はないのですが、必須項目が入力されていない状態でボタンを押された場合にエラーが表示されることを防ぐために↓のように変更します。

プロパティ 内容
DisplayMode If(Or(IsBlank(DataCardValue16.Text),IsBlank(DataCardValue12.Text),IsBlank(DataCardValue14.Text),IsBlank(DataCardValue13.Text)),DisplayMode.View,DisplayMode.Edit)
Color If(Or(IsBlank(DataCardValue16.Text),IsBlank(DataCardValue12.Text),IsBlank(DataCardValue14.Text),IsBlank(DataCardValue13.Text)),RGBA(145,142,142,1),RGBA(255, 255, 255, 1))

これで、必須項目が入力されていない場合、AcceptIconがグレーアウトされ、押せなくなるようになります。

Flow

さて、次はFlowを使って承認ワークフロー、Graph APIでAzure ADにユーザーを作成する処理を構成します。

フローでは、Approvalを使った承認フローと、Microsoft Graph APIを使ったユーザー作成・ライセンス割り当てを実現します。

Flowの実行トリガーはPowerAppsによる申請ボタンのため、トリガーを”PowerApps“に設定しておきましょう。

PowerApps初期変数の宣言

まずは、Azure ADユーザー作成に必要な”初期パスワード”と”mailNickName”を生成するための初期変数を宣言します。

Graph APIでユーザーを新規作成する場合、パスワードはJSONの中で指定する必要があります。PowerAppsの入力フォームにパスワードの入力規則を定義するのは大変なので、FlowのRand()を使って初期パスワードを自動生成することにしました。

また、mailNickNameは作成するユーザーのEmailAddressの”@”を”-“に置換した文字列を設定することとします。

PowerApps

名前 種類
Alphabet アレイ [“A”,  “B”,  “C”,  “D”,  “E”,  “F”,  “G”,  “H”,  “I”,  “J”,  “K”,  “L”,  “M”,  “N”,  “O”,  “P”,  “Q”,  “R”,  “S”,  “T”,  “U”,  “V”,  “W”,  “X”,  “Y”,  “Z”,  “a”,  “b”,  “c”,  “d”,  “e”,  “f”,  “g”,  “h”,  “i”,  “j”,  “k”,  “l”,  “m”,  “n”,  “o”,  “p”,  “q”,  “r”,  “s”,  “t”,  “u”,  “v”,  “w”,  “x”,  “y”,  “z”]
Symbol アレイ [“@”,  “#”,  “$”,  “%”,  “^”,  “&”,  “*”,  “–”,  “_”,  “!”]
Password 文字列 Null
EmailAddress 文字列 Null
mailNickName 文字列 Null

SQLレコードの取得

PowerAppsの申請によって追加されたレコード情報をFlowから参照します。SQL Server の”複数行を取得”からレコードのGUIDをキーに対象のレコードを取得します。

PowerApps対象レコードのGUID値はPowerAppsからFlowへ受け渡す必要があるので、”PowerAppsで確認“としておきます。一応レコード取得前に待ち時間を設定していますが、ここは好みでどうぞ。

承認ワークフロー

レコードから申請情報を取得したら、それをもとに申請フローを開始します。まずは申請者への受付メールと、管理者への承認要求にApprovalを使用します。

PowerAppsあとは承認/却下それぞれのフローを作成していくだけです。承認/却下いずれもレコードの更新が発生します。

PowerAppsLastUpdateには現在日時を取得して更新します。

formatDateTime(convertTimeZone(utcNow(), ‘UTC’, ‘Tokyo Standard Time’),’yyyy-MM-dd hh:mm’)

Azure ADのユーザー作成

最後に、申請が承認されたと同時にAzure ADへユーザーをGraph APIで作成します。

Graph APIでユーザーを作成する場合、PowerShellと違ってパスワード・mailNickNameをJSONで渡す必要があるため、始めに宣言した変数を使って値を生成します。

PowerAppsmailNickNameは、ユーザーのアドレス値の”@”を”-“に変更した文字列を設定します。

replace(variables(‘EmailAddress’),’@’,’-‘)
パスワードはアルファベット・数字・記号を組み合わせたランダム値を設定します。
concat(variables(‘alphabet’)[rand(0,51)],variables(‘alphabet’)[rand(0,51)],variables(‘alphabet’)[rand(0,51)],variables(‘alphabet’)[rand(0,51)],variables(‘alphabet’)[rand(0,51)],rand(0,9),rand(0,9),variables(‘Symbol’)[rand(0,9)])
あとは、Azure ADにJSONでユーザー情報を渡すだけです。
参考:Microsoft Graph REST API v1.0 リファレンス
参考:ユーザーを作成する
PowerApps
この時、Azure ADのアプリケーション登録によって発行されたアプリケーションID・ディレクトリID・シークレットキーを入力しておきましょう。
正しく応答が返ってきたら、最後にライセンス割り当てをします。
これもHTTPアクションを使ってGraph APIで作業します。
参考:assignLicense
PowerApps
これで、ユーザー生成・ライセンス割り当てが完了しました。あとは申請者に初期パスワードを添えて通知するだけです。
PowerApps
完成したらFlowを保存しておきましょう。

PowerAppsとの連携

最後にPowerAppsから申請したと同時にFlowが開始するよう設定します。

申請ボタンの”OnSelect”を選択した状態で、アクションタブの”Flow“から、先ほど作成したFlowを選択します。

すると、OnSelectの内容が<Flow名>.Run()に書き換わり、Flow側でGUIDを渡すよう設定しているため、引数が要求されているのが分かります。

PowerAppsのGUIDカードの値を引数として設定し、OnSelectの内容を更新します。これで、申請と同時にFlowが実行されるようになりました。

以上でベースは完了です。細かい画面の作りや機能を追加することで最初に掲載した動画のように作りこむことも出来ますので是非参考にしてみてください。

ちなみに、StatusがRemandの時のみ再承認させることで、差戻フローも簡単に作成することが出来ます。

おわりに

PowerApps、Flowって調べてもあまりまとまった情報がないので若干の毛嫌いをしていたのですが、何か作成したいアプリケーションをテーマにやってみると案外作れちゃうので感動しました。すばらしいですね。

Office365のスイート版ライセンスであれば、一部Premiumが必要ですが、無料で使える魅力的にサービスだと思いますし、Office365の主軸サービスとして今後も活躍するでしょう。

それでは、よいOffice365ライフをっ♪

 

スポンサーリンク