PowerApps の処理を Flow で記述する

[PowerApps で SharePoint リストを更新](https://qiita.com/afujie/items/58539ddb6dd56785e77f)　の続きです。
フリー　アドレスの席に座った時に座席を登録する想定です。
前回、作成したアプリは登録したユーザーを上書きできますが、クリアできません。更新画面でUsed項目を空白にしてAcceptボタンを押しても上書きをしないようです。

# これまでの構成

座席表のレイアウト表示は、Power BIを使用しました。
座席情報は、SharePoint Onlineリストを使用しました。
座席情報の登録は、PowerAppsのウィザードで作ったアプリを使用しました。

# 今回の構成

先に述べたようにユーザー項目をクリアできないため空いている席は前日に座った人のユーザー情報が残ったままになります。
更新画面で以前座っていた座席情報をクリアして新たな座席情報に更新することにします。この処理をFlowで記述してPowerAppsから呼び出します。

# 進め方

はじめにMicrosoft Flowでフローを記述します。
このフローをPowerAppsのAcceptボタンを押した時の処理で置き換えます。
Microsoft Flowについても、ユーザーまたはグループ型の項目をクリアできないようです。そのため前日に登録した座席情報を削除し、Usedが未入力の座席情報を新しく作成します。

# 手順

1. PowerAppsから呼び出せるフローを作成
    1. Office 365のアプリランチャーでFlowをクリック
    2. マイ フロー画面で[新規]-[一から作成]メニューをクリック
    3. 画面下の[多数のコネクタやトリガーを検索する]をクリック
    4. 検索ボックスで「PowerApps」を検索
    5. トリガー一覧の[PowerApps]をクリック
    
    >　「PowerApps」トリガーでPowerAppsから呼び出せます。

2. フローで前日に登録した座席情報を再作成
    1. 下の[新しいステップ]をクリック
    2. 検索ボックスで「SharePoint」を検索
    3. アクション一覧から[複数の項目の検索]をクリック
    4. [サイトのアドレス]と[リスト名]で座席表のリスト(Floor)を指定
    5. [詳細オプションを表示する]をクリック
    6. [フィルター クエリ]ボックスをクリック
    7. 表示されたバルーンの[PowerAp...]パラメータをクリック
    8. 追加されたパラメータを囲むように「Used/EMail eq '[複数の項目の取得_$filter]'」と記入
    　　<img width="584" alt="スクリーンショット 2019-02-10 20.43.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/184453/a80f878d-aed4-9e0e-241c-1b67f4f131b2.png">

3. フローをテスト
    1. [保存]ボタンをクリック
    2. [テスト]ボタンをクリック
    3. 「フローのテスト」ペインで[トリガー アクションを実行する]を選択して[保存&テスト]ボタンをクリック
    4. 「フローの実行」ダイアログで接続先を確認して、[続行]ボタンをクリック
    5. [複数の項目の取得_$filter]にメール　アドレスを入力して[フローの実行]をクリック
    6. 「フロー実行が正常に開始されました」ダイアログで[完了]をクリック
    <img width="569" alt="スクリーンショット 2019-02-10 22.08.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/184453/0ef8fe10-8f6c-2d4f-cda6-1381b2e82d73.png">

    > 出力の本文を確認して情報が取得できているかを確認。
    > 座席表リストのUsedへメール アドレスを追加や削除して動作を確認。
    > 以降、アクションやステップを変更するごとにこまめに[テスト]する。

4. フローで前日に登録した座席情報を再作成
    1. 　[編集]をクリックして編集画面に戻る
    2. 　一番下の[新しいステップ]ボタンをクリック
    3. 　[組み込み]タブをクリック
    4. 　「アクション」一覧の[Apply to each]をクリック
    5. 　[以前の手順から出力を選択]のバルーンで「複数の項目の取得」の[value]をクリック
    6. 　「Apply to each」枠内の[アクションの追加]をクリック
    7. 　検索ボックスで「SharePoint」を検索
    8. 　アクション一覧で[項目の削除]をクリック
    9. 　[サイトのアドレス]と[リスト名]で座席表のリスト(Floor)を指定
    10. 　[ID]でバルーンから「複数の項目の取得」から「ID」をクリック
    11. 　再度、「Apply to each」枠内の[アクションの追加]をクリック
    12. 　検索ボックスで「SharePoint」を検索
    13. 　アクション一覧で[項目の作成]をクリック
    14. 　[サイトのアドレス]と[リスト名]で座席表のリスト(Floor)を指定
    15. 　[タイトル]テキスト　ボックスをクリックして表示されたバルーンの「複数の項目の取得」の[タイトル]をクリック

5. フローで当日の座席情報を更新
    1. 一番下の[新しいステップ]ボタンをクリック
    2. 検索ボックスで「SharePoint」を検索
    3. アクション一覧から[複数の項目の検索]をクリック
    4. [サイトのアドレス]と[リスト名]で座席表のリスト(Floor)を指定
    5. [詳細オプションを表示する]をクリック
    6. [フィルター　クエリ]ボックスをクリック
    7. 表示されたバルーンの[PowerAp...]パラメータをクリック
    8. 追加されたパラメータを囲むように「Title eq '[複数の項目の取得***2***_$filter]'」と記入
    9. 　一番下の[新しいステップ]ボタンをクリック
    10. 　[組み込み]タブをクリック
    11. 　「アクション」一覧の[Apply to each]をクリック
    12. 　[以前の手順から出力を選択]のバルーンで「複数の項目の取得 ***2***」の[value]をクリック
    6. 　「Apply to each」枠内の[アクションの追加]をクリック
    7. 　検索ボックスで「SharePoint」を検索
    8. 　アクション一覧で[項目の更新]をクリック
    9. 　[サイトのアドレス]と[リスト名]で座席表のリスト(Floor)を指定
    10. 　[ID]でバルーンから「複数の項目の取得　***2***」から「ID」をクリック
    11. 　[タイトル]でバルーンから「複数の項目の取得　***2***」から「タイトル」をクリック
    12. 　[Used　Claims]で[カスタム値の入力]をクリック
    13. 　[Used Claims]のバルーンで「PowerApps」の[複数の項目の取得_$filter]をクリック

6. PowerAppsからフローを呼び出す
    1. PowerAppsでアプリの編集画面を表示
    2. 画面ツリーで[EditScreenFloor]画面の[IconAccept1]をクリック
    3. [OnSelect]の数式バーの式を消す
    4. [アクション]-[Flows]メニューをクリック
    5. Flows　一覧から先ほど作成したフローをクリック
    6. 数式バーにフローの呼び出し関数が自動設定されたら、パラメータにUsed欄のメール アドレスとタイトル欄を指定して括弧を閉じる
        1. Used欄のメール アドレスは「DataCardValue4.Selected.Email」
        2. タイトル欄は「DataCardValue3」

7. フローを呼び出したら、一覧画面に戻る
    1. 先ほどのIconAccept1のOnSelectの数式の後ろに「;Navigate(BrowseScreenFloor, ScreenTransition.None)」を追加

    > ;(セミコロン)を付けると次の処理を記述でき、フローの呼び出し後に画面遷移する。

8. 一覧の更新処理を追加
    　　 このままだと毎回、[一覧の更新]ボタンを押す必要があるので自動で一覧を更新する
    1. 先ほどのIconAccept1のOnSelectの数式の後ろに「;Refresh(Floor)」を追加
    <img width="811" alt="スクリーンショット 2019-02-10 23.11.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/184453/d6705df0-b8dd-47f2-379b-c0ea37b8bafc.png">

    リフレッシュをしている様だが以前の席のユーザーが消えなかったり、新しい席のユーザーが表示されなかったりと不安定。
    これはフローのSharePoint更新が終わる前にPowerAppsに処理が戻るため。
    SharePoint更新が終わってからフローが終了する様に修正。

9. SharePoint更新後にフローを終了する
    1. フローを編集画面で開く
    2. 一番下の[新しいステップ]をクリック
    3. [組み込み]タブをクリック
    4. アクション一覧の[応答]をクリック
    <img width="615" alt="スクリーンショット 2019-02-10 23.47.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/184453/24aa70d6-9a75-e4a9-1c04-186373a500a9.png">

# 今回わかったこと
- PowerApps
    - SharePointのユーザーまたはグループ型はクリアできない
    - データに紐づいた入力欄はパラメータを参照できる (DataCardValue4.Selected.Email)
    - 複数の処理を実行するときは、;で区切って記述
- Microsoft Flow
    - フィルター クエリで変数のパラメータを指定するときは、/パラメータ名で指定
    - SharePointのユーザーまたはグループ型はクリアできない
    - フローの最後に応答を入れないと途中のアクションが終わる前にフローが終了する