Help us understand the problem. What is going on with this article?

LINE Bot+Power Automateで家庭内DXを促進するお手軽購入申請 ~フロー詳細

前回→ LINE Bot+Power Automateで家庭内DXを促進するお手軽購入申請を作ってみた

今回はPower Automateの詳細です

前回は、全体としてどのような構成にしていて、ユーザーがどんな操作をするのかご紹介しました。
今回はこのLINEでの購入申請のキモである、Power Automateのフローを細かく紹介します。

image.png

準備 (SharePointとForms)

承認のステータスと履歴を管理するためのデータソースはSharePointリストにしています。それほど件数発生しない前提で、お手軽に用意でき、Excelのようなロックの問題も考えなくてよいので。

Forms

Formsのフォームが購入申請をするきっかけ・入力部になります。
LINE側では、Office 365のログイン利用しないので、匿名で回答できるようにしておきましょう。

項目 種類 備考
申請者を選ぶ 選択肢 パパ/ママ
購入品名 一行テキスト
購入金額 一行テキスト 数値に限定する
商品URL 一行テキスト
備考 複数行テキスト

image.png

Formsの準備はこれだけです。
念のため、URLにあるFormのIDをメモしておきましょう。
image.png

SharePoint

SharePointリストは基本的にForms側の設定と同一にします。ただし、購入申請の結果を残しておきたいので、承認ステータスに該当する列を追加しておきましょう。

列名 種類 備考
Title 一行テキスト 購入品名を入れる
Requester 一行テキスト 申請者名
Price 通貨 購入金額を入れる。Numberでも可
URL 一行テキスト
Comment 複数行テキスト 書式なし
Status 一行テキスト 選択肢でもよい。その場合は申請済み/承認/却下

image.png

Power Automate

準備ができましたので、ここからフローを紹介していきます。
なお、今回は以前作成したLINE Messaging APIのカスタムコネクターを利用しています。
詳細はこちら

申請受信→承認者への通知

Formsへの入力をトリガーとして、SharePointへのデータ登録と、承認者へのメッセージ送信・申請者への申請完了通知を送ります。

image.png

短いです。Compose (作成アクション) でFlex messageの本体を作っていますが、そこそこ長いので、Githubのファイルを参考にしてください。
ポイントは以下の部分です。

flexmessage.json

        "contents": [
          {
            "type": "button",
            "style": "primary",
            "height": "sm",
            "action": {
              "type": "postback",
              "label": "OKです",
              "data": "action=承認&id=@{body('Create_item')?['ID']}",
              "displayText": "OKです"
            }
          },
          {
            "type": "button",
            "style": "secondary",
            "height": "sm",
            "action": {
              "type": "postback",
              "label": "ダメです",
              "data": "action=却下&id=@{body('Create_item')?['ID']}",
              "displayText": "ダメです"
            }
          },
          {
            "type": "spacer",
            "size": "sm"
          }
        ]

承認者がOK/NGのボタンをタップしたときのアクションです。
ここでは通常のメッセージではなく、Postbackアクションを利用しています。
Postbackアクションでは、チャットに表示されるメッセージの他に、データ ("data"部分)を要求として送ることができます。
これを利用して、SharePointに作成したどのアイテムのステータス更新なのかをLINE (Webhookを受け取るフロー)に教えてあげます。

後述するメッセージを受け取るフローでは、このデータをもとにして、SharePointからのアイテム取得、action=XXXX部分でのステータス更新を行っています。

また、申請者へのPushメッセージ送信で、Toですが、これはFormsの回答がパパなのかママなのかで送るユーザーIDを変更しています。

@{if(equals(body('Create_item')?['Requester'],'パパ'),'ここにパパのLINEユーザーID','ここにママのLINEユーザーID')}

こうすることで、申請者に応じてメッセージの飛ばし先を変更できます。
承認者へのPushメッセージは上の条件を逆にしてください。

これで1本目が完成です。

Flex messageのJSONは以下に置きました
https://github.com/mofumofu-dance/PowerApps365/blob/master/Samples/PurchaseRequestFlow/RequestMessage.json

メッセージ処理全般

短い方でもおなか一杯かもしれませんが、こっからが本番です。
LINEボットをPower Automate使って作るときには、HTTP要求受信のトリガーを必ず利用します。

往々にして、処理は長くなります。送られてくるデータが、メッセージなのか、Postbackなのか、Stickerなのか。あるいは誰から送られてきたかなどなど。そういった判定が入るためです。

今回のフローでも、条件分岐をいくつか入れていますが、基本的には、メインの処理では最初から最後までフローのアクションが実行され、例外パターンでは、条件分岐の片方でフローを終了させています。
こうすることで以降の処理は実行されず、例外/想定外のパターンの処理ができます。

image.png

1. Webhook受信~アイテムの検索

LINE上でのbotとの会話で、承認者側がOK/NGを押すか、「Id:XXXX/承認」のようにメッセージを打つことで、承認/却下が進むようにしています。ここでは、まずそれらのデータ/メッセージを分割してSharePointリストからアイテムを取得しています。

image.png

条件分岐部分には

first(triggerBody()?['events'])?['postback']?['data']

が使われています。
eventsが配列になっていて、その0番目を使うので、first(triggerBody()?['events']) この組み合わせは頻出です。

2. エラー対応x2

今回のフローでエラーがでるとすると、アイテムがない または (これはエラーではないけど)すでに承認/却下済み というケースかと思います。この2種に備えて、ステップを入れておきます。

エラーの対応は、実行条件でやるとなかなか良いという知見を得たので、それに倣って。

  • SharePointのアイテム取得に失敗したら、「アイテムないよ」の返信を送ってフロー終了
  • アイテムはあるけど、すでに承認/却下済み だったら「そのアイテムはすでにXXしているよ」の返信を送ってフロー終了

この2つを立て続けにやっています。
image.png

3. ステータス更新~結果報告

前段で処理が終了していないということは、アイテムが存在していて、かつ未処理であるとわかります。
ですので、ここでは対象のIDのアイテムをステータス更新して、結果を承認者にはReply、申請者にはPushで送っています。
image.png

4. おまけ:一覧表の更新

最後はすこし面倒ですが、SharePointのアイテム一覧から、承認ステータスごとにHTMLのテーブルを作ってBlobストレージに保存するという処理です。
image.png

例によって、HTMLが長いので省略しています。
ポイントは、
- まずリストからアイテムを複数取得
- ステータスが申請済み・承認・却下化に応じて並列処理
- Selectアクションで ["< tr > ~~~~~ </ tr > ",.....," < tr > ~~~~ </ tr > "]のような配列を、文字列結合でつくる
- Joinをnullで行って< tr >を結合
- うまい具合にHTML作ってBlobに保存

です。
※HTML (Blobのコンテンツ)もGithubにサンプルとしておきました。ご自由にどうぞ
https://github.com/mofumofu-dance/PowerApps365/blob/master/Samples/PurchaseRequestFlow/ApprovalHistory.html

まとめ

今回は家庭内のちょっと面倒なアナログプロセスを、LINE botとPower Automate、FormsでDXしてみました!
サービスに備わっている機能では賄うのが難しい場合には、いろいろなサービスを組み合わせることで、コードを書くことなしに不自由を補うことができます。

Power Appsにせよ、Automateにせよ、特定のサービスだけにこだわらず、いろいろ組み合わせて使えればもっと幸せかもです!
ご質問はTwitterまでお願いします。

h-nagao
Power Platform好きです。 #MoreBeerMorePower 新しい投稿は、はてなブログのほうにしています。
https://mofumofupower.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした