はじめに
この記事はPower Appsでモダンなチャットアプリを作ってみる (1)の続きです。
主にPower Automate
について解説していきたいと思います。
Power Automateでは
-
JSON ファイル
コンテンツを取得する親フロー -
JSON ファイル
を作成または更新する親フロー - 上記二つのフローで使用するファイルの存在の確認、コンテンツを返す子フロー
合計三つのフローを用意します。
1. JSON ファイル
コンテンツを取得する親フロー
ほぼ処理は子フロー
が実施しています。
詳細は割愛します。
2. JSON ファイル
を作成または更新する親フロー
まずは図解です。
■ Power Apps がフローを呼び出したとき (V2)
-
spMetaData
: SharePointのドキュメント ライブラリに設定するメタデータ -
objChat
: チャットの履歴
Power Apps
からJSON
文字列とファイルに設定するメタデータを受け取ります。
個人的に複数の値をPower AppsからPower Automateに渡す際はJSON 関数で私はまとめてしまっています。
JSON の解析
■ JSON の解析 メタデータ
ファイルのメタデータとして定義する値です。
{
"type": "object",
"properties": {
"CreateBy": {
"type": "string"
},
"CreatedTime": {
"type": "string"
},
"Fill": {
"type": "string"
},
"FontColor": {
"type": "string"
},
"LastMessageText": {
"type": "string"
},
"LastMessageTime": {
"type": "string"
},
"LastSender": {
"type": "string"
},
"MessageCount": {
"type": "integer"
},
"MessageID": {
"type": "string"
},
"Subject": {
"type": "string"
},
"UpdatedTime": {
"type": "string"
}
}
}
JSONにすることで複数の設定値をまとめていますが、型が変わってしまった際や、Null対策の必要があります。今回の設定値はNull
が渡されない前提で設定しています。
■ JSON の解析 Chatの履歴
こちらはチャットの内容です。Log
というキーに対して配列が設定されています。
{
"type": "object",
"properties": {
"Log": {
"type": "array",
"items": {
"type": "object",
"properties": {
"MessageIndex": {
"type": "integer"
},
"MessageText": {
"type": "string"
},
"SenderName": {
"type": "string"
},
"TimeStamp": {
"type": "string"
}
},
"required": [
"MessageIndex",
"MessageText",
"SenderName",
"TimeStamp"
]
}
}
}
}
取得したMessageID
を引数にして、過去のJSONファイルの参照を実施します。
こちらにて、チャットの履歴ファイルのItemID
やファイルコンテンツを取得しています。
チャットの履歴となるJSONファイルが存在しない場合は、ファイルの作成、
そうでない場合は、ファイルの更新を実施します。
ファイルの作成の場合
ファイル名はMessageID
.json、ファイル コンテンツはJSON
@{body('JSON_の解析_Chatの履歴')}
を指定します。
新規作成に該当するため、ドキュメント ライブラリ
のItemID
を取得しておきます。
ItemID
に@{outputs('ファイルの作成')?['body/ItemId']}
を設定します。
ファイルの更新の場合
子フロー
から取得したidentifier
をファイル識別子
に設定、ファイルコンテンツは新規作成
と同様に@{body('JSON_の解析_Chatの履歴')}
を設定します。
ファイルのプロパティの更新
ドキュメント ライブラリ
のメタデータを更新します。
列数が多いとJSON
で複数まとめて設定できる方法が個人的に活きるなと感じます。
最後にフローへの応答を設定して完了です。
子フロー
このフローの役割は
-
MessageID
からファイルの存在を確認する
- ファイルが存在する場合、
ファイルコンテンツ
とファイル識別子
、ItemID
を返す
この二ポイントです。
変数は下記の三点です。
-
strObject
:String
、ファイルが存在する場合にファイルコンテンツを文字列で格納 -
ItemID
:Integer
、ドキュメント ライブラリのItemID
-
Identifier
:String
、ファイル識別子
条件に合致するファイルの一覧を返します。
フィルター クエリを下記のように指定することで、一意であるMessageID
でファイルを特定させます。
MessageID eq '@{triggerBody()['text']}'
考え方がわかれそうですが、メタデータでファイル管理するのは本当に楽です。
ファイル名とかやめたほうがいいと思います。(個人の意見)
ファイルの数は@{length(outputs('ファイルの取得_(プロパティのみ)')?['body/value'])}
で取得します。
■ ファイルが存在する場合
変数の設定でItemID
とIdentifier
を設定しましょう。
ItemID
- @{first(outputs('ファイルの取得_(プロパティのみ)')?['body/value'])?['ID']}
Identifier
- @{first(outputs('ファイルの取得_(プロパティのみ)')?['body/value'])?['{Identifier}']}
そしてファイルコンテンツを取得します。
JSONの型が正確ではないと、値が正確に返ってきません。コンテンツ タイプの推測
をオフにすれば取得できなくもないですが、おすすめはできないですね。
戻り値は文字列変数
としてstrObject
に設定します。@{string(outputs('ファイル_コンテンツの取得')?['body'])}
そしてそれぞれ値を返します。
こちらによってフローがそろいました!
完成!
こちらをPower Appsでモダンなチャットアプリを作ってみる (1)と合わせて使うと、簡易的ですがチャットアプリができます。
Teams
コネクタを使った統合もできそうですが、こういったやり方もあるんだな、位にみてください!
それではよいPower Lifeを!