PowerApps│Formsと連携した安否確認アプリの作り方②

アイキャッチ

こんにちは、あんこ先生です。

Formsと連携した安否確認アプリの作成を解説した全2回の後編です。

第1回「従業員リストとFormsの作成まで」を読まれていない場合は先にお読みください。


第2回は、いよいよアプリの作成方法を解説します。

使う使わないは別として、仕組みを用意しておくと内部監査やISMSの審査でウケがいいですよ!

Formsと連携した安否確認アプリの作り方


コネクタの準備

アプリ作成に先だって、次の3つを接続します。

  1. Office365Outlookコネクタ
    メール送信に使うため、接続しておきます。
  2. Excel onlineコネクタ
    まず、Formsの回答結果を取得するため、保存されたファイルを指定します。
    保存場所は、SharePointサイト > ドキュメント直下 にあると思います。
    ファイル選択後は Table1 > Excelテーブルにある一意の列を使用する > ID とします。
  3. SharePointコネクタ
    安否従業員リストを指定します。

コネクタの接続が終われば、次はアプリの作成に取り掛かります。

理解しやすいよう、3段階に分けて解説していきます。

安否確認アプリ│タイトルメニュー部分

タイトルやメニューを表示する部分で、8つのコントロールで構成されています。

細かく書くと長くなるので、単純なラベルや枠線などの説明は省略します。


Icon更新

変数とコレクションの作成を行う最も重要な箇所です。

スクリーンのOnVisibleやメール発信後にも同じ処理行わせるため、最初に作成しておきます。

作成される変数およびコレクションは次の通りです。

  1. 変数 _lastUpdate
    最後に更新した時間をNow関数で格納します。
  2. 変数 _now
    更新時間との差を算出するために現在時刻を格納します。
    この変数は、タイマーを使って定期的にNow関数で更新していきます。
  3. 変数 _send
    メール発信コンテナの表示を制御します。
    初期値はfalseです。
  4. Forms回答結果│_Excel
    Excel onlineコネクタで持ってきたデータソースはLookUp関数をサポートしていないため、一度コレクションに格納します。
  5. 回答状況│_ResInfo
    安否確認用従業員リストを基に、上記Forms回答結果の内容を追加したコレクションを作成します。

Now関数は自動で更新されないよ。
タイマーなどで再評価する必要があるよ。

//変数セット
Set(_lastUpdate,Now()); //上記①
Set(_now,Now()); //上記②
Set(_send,false); //上記③

//Forms回答結果をコレクションに複写 上記④
Clear(_Excel);
ForAll(AddColumns(Table1,"ALL氏名",Coalesce('氏名選択(社員用)','氏名選択(派遣用)','氏名選択(パート用)')),
    Collect(_Excel,ThisRecord)
);

//安否確認用従業員リストとForms回答結果を結合 上記⑤
ClearCollect(_ResInfo,
    AddColumns(安否確認用従業員リスト,
        "res",!IsBlank(LookUp(_Excel,ALL氏名=氏名)),
        "resTime",LookUp(_Excel,ALL氏名=氏名,完了時刻),
        "gotoWork",LookUp(_Excel,ALL氏名=氏名,出社可否),
        "arrival",LookUp(_Excel,ALL氏名=氏名,'職場までの予想所要時間(単位:時間)'),
        "free",LookUp(_Excel,ALL氏名=氏名,自由記入)
    )
);


Iconメール表示

押すたびに変数 _sendの値を反転させます。

メール発信コンテナが表示されているん場合はfalse、非表示ならtrueを返します。

Set(_send,!_send)


Label最終更新日時

コレクション等の作成時間を表示します。

変数_lastUpdateを指定します。

_lastUpdate&"現在"


Label更新経過時間

最終更新から何分経ったかを表示します。

変数 _lastUpdateから変数 _nowの差を指定します。

"最終更新から"&DateDiff(_lastUpdate,_now,Minutes)&"分経過"


Label回答状況

分子はFormsの回答人数、分母は安否従業員リストの人数を表示します。

"回答状況 "&CountRows(Filter(_ResInfo,res))&" / "&CountRows(_ResInfo)


Timer繰り返し

指定時間ごとに変数 _nowを更新します。

期間の単位はミリ秒です。5秒間隔とします。

自動開始、繰り返しはオンにしておきます。

設定後は操作する必要はないので非表示にしておきます。

//OnTimerEnd
Set(_now,Now())

安否確認アプリ│回答状況表示部分

基本、コレクションの中身を表示しているだけです。

ギャラリーと7つのコントロールで構成されています。

並びはSortByColumnSで回答者 > 社員番号にしています。

回答有無にかかわらず全員を表示するため、未回答者もかんたんにわかります。

TemplateFillで回答者に色付けすると、よりわかりやすくなります。

//Items 第2ソートキーは項目名が日本語なのでODataに変換された"社員番号"。
SortByColumns(_ResInfo,"res",Descending,"OData__x793e__x54e1__x756a__x53f7_",Ascending)


Icon出社可否

回答があった場合、その出社可否に応じてアイコンを切り替えます。

//Icon
If(ThisItem.gotoWork="はい",Icon.CheckBadge,Icon.CancelBadge)


Label回答時刻

回答があれば回答時間、未回答ならメール発信時間を表示します。

If(ThisItem.res,
    "回答時刻:"&DateAdd(ThisItem.resTime,-9,Hours),
    "発信時刻:"&DateAdd(ThisItem.安否発信日時,0,Hours)
)


Label到着予定

回答があり、かつ出社できる場合は予定到着時間、未回答ならメール発信からの経過時間を表示します。

If(ThisItem.gotoWork="はい",
    Text(DateAdd(ThisItem.resTime,ThisItem.arrival,Hours),"到着予定:dd日hh時頃"),
    !(ThisItem.res),"送信から"&DateDiff(ThisItem.安否発信日時,_now,Minutes)&"分経過"
)

安否確認アプリ│メール発信部分

メールアイコンを押したときに表示されます。

8つのコントロールをコンテナに格納し、ギャラリーの前面に設置します。

Iconキャンセルかもう一度Icon表示を押すと非表示になります。

メール発信対象は、全員または未回答者に限定できるようラジオコントロールを設けています。

別途職種区分を使えば、職種でも対象を絞ることができます。


TextInputURL

TextにFormsのURLを埋め込んでおきます。

メール本文にリンクとして記載されます。

Formsで “URLを短縮” にチェックを入れると文字数を抑えることができます。


TextInput本文

URL以外の本文です。


Iconメール発信

アイコンを押すと、はじめに発信対象のコレクションを作成し、安否確認メールを発信します。

Outlookコネクタを使用しているので、送信元は実行者になります。

また、Outlookに送信履歴が残ります。

メール発信後、その時刻を安否従業員リストに書き込みます。

これにより、発信からの経過時間を算出できます。

最後にSelect関数でIcon更新とIconメール表示を実行させます。

これでデータが更新され、コネクタを非表示に戻します。

//発信先作成
Clear(_SendAddress);
ForAll(If(Radio対象選択.Selected.Value="全員に発信",_ResInfo,Filter(_ResInfo,res=false)),
    Collect(_SendAddress,{num:ThisRecord.社員番号});
    Collect(_SendAddress,{mail:ThisRecord.メールアドレス1});
    Collect(_SendAddress,{mail:ThisRecord.メールアドレス2})
);

//メール発信、未回答者のみを選択した場合は表題が再送付。
Office365Outlook.SendEmailV2(
    Concat(Filter(_SendAddress,mail),mail,";"),
    If(Radio対象選択.Selected.Value="全員に発信","安否確認メール "&Today(),"【再送付】安否確認メール "&Today()),
    TextInput本文.Text&"<BR>"&TextInputURL.Text
);

//発信情報更新
ForAll(_SendAddress As list,
    Patch(安否確認用従業員リスト,LookUp(安否確認用従業員リスト,社員番号=list.num),{安否発信日時:Now()})
);

//データ更新とコンテナ非表示
Select(Icon更新);
Select(Iconメール表示);


アプリ起動時の自動更新

毎回手動で更新させるのはナンセンスなので、ScreenのOnVisibleに下記コードを記載しておきます。

Select(Icon更新);
Set(_send,false)

安否確認アプリ②のまとめ

今回は、安否確認アプリの作成方法を紹介しました。

作成自体はかんたんな部類だと思いますが、コレクションが正しく作成されないとまともに動きません。赤線がついたら項目名を見直してください。

ちゃんと動いたら、実際に安否確認訓練を行ってみましょう。

なお、ひとりが複数回答することを想定していないため、訓練の都度Formsのデータはクリアしてください。

ご支援よろしくおねがいします

この記事を気に入ってくださった方、寄付してあげてもいいよという方がいらっしゃっいましたら、ご支援いただけると助かります。

下記リンクからAmazonギフト券で、金額は15円からお気持ちを入力してください。

受取人のメールアドレスは amazon@anko7793.com までお願いします。

メッセージもいただけるとたいへん喜びます。

よろしくお願いします。

Amazonギフト券(Eメールタイプ) 

1件のコメント

はじめまして。もうちょっと詳しく説明がほうしいです。
コレクションの設定どのようにしているのかもう少し詳しくお願いします。
Icon更新
変数とコレクションの作成を行う最も重要な箇所です。
スクリーンのOnVisibleやメール発信後にも同じ処理行わせるため、最初に作成しておきます。
作成される変数およびコレクションは次の通りです。
変数 _lastUpdate
最後に更新した時間をNow関数で格納します。
変数 _now
更新時間との差を算出するために現在時刻を格納します。
この変数は、タイマーを使って定期的にNow関数で更新していきます。
変数 _send
メール発信コンテナの表示を制御します。
初期値はfalseです。
Forms回答結果│_Excel
Excel onlineコネクタで持ってきたデータソースはLookUp関数をサポートしていないため、一度コレクションに格納します。
回答状況│_ResInfo
安否確認用従業員リストを基に、上記Forms回答結果の内容を追加したコレクションを作成します。
宜しくお願いします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
七草あんこ
非IT系中間管理職やってます。社命によりoffice365を主軸とした業務改善プロジェクトメンバーに任命されたことでPowerAppsと出会えました。いまではビジネス・プライベートを問わず、欠かせないツールになっています。導入初期やアプリ作成時に遭遇した諸問題の解決法とサンプルアプリの作り方を紹介していきます。主にTwitterで情報収集しているので不明点など呟いているとお邪魔するかもしれません。