5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Microsoft Power AppsAdvent Calendar 2024

Day 24

Power Appsでモダンなチャットアプリを作ってみる (2)

Last updated at Posted at 2024-12-23

はじめに

この記事はPower Appsでモダンなチャットアプリを作ってみる (1)の続きです。
主にPower Automateについて解説していきたいと思います。

Power Automateでは

  1. JSON ファイル コンテンツを取得する親フロー
  2. JSON ファイル作成または更新する親フロー
  3. 上記二つのフローで使用するファイルの存在の確認、コンテンツを返す子フロー

合計三つのフローを用意します。

1. JSON ファイル コンテンツを取得する親フロー

ほぼ処理は子フローが実施しています。

  1. MessageIDPower Appsから受け取り

  2. 子フローからJSON ファイルコンテンツを受け取り
    image.png

  3. Power AppsJSONファイル コンテンツ返す
    image.png

詳細は割愛します。

2. JSON ファイル作成または更新する親フロー

まずは図解です。

■ Power Apps がフローを呼び出したとき (V2)
image.png

  • spMetaData: SharePointのドキュメント ライブラリに設定するメタデータ
  • objChat: チャットの履歴

Power AppsからJSON文字列とファイルに設定するメタデータを受け取ります。
個人的に複数の値をPower AppsからPower Automateに渡す際はJSON 関数で私はまとめてしまっています。

JSON の解析

image.png

■ JSON の解析 メタデータ
ファイルのメタデータとして定義する値です。

image.png

Schema
{
    "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というキーに対して配列が設定されています。

image.png

Schema
{
    "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"
                ]
            }
        }
    }
}

image.png

取得したMessageIDを引数にして、過去のJSONファイルの参照を実施します。
こちらにて、チャットの履歴ファイルのItemIDやファイルコンテンツを取得しています。

チャットの履歴となるJSONファイルが存在しない場合は、ファイルの作成
そうでない場合は、ファイルの更新を実施します。

image.png

ファイルの作成の場合

image.png

ファイル名はMessageID.json、ファイル コンテンツはJSON @{body('JSON_の解析_Chatの履歴')}を指定します。
新規作成に該当するため、ドキュメント ライブラリItemIDを取得しておきます。
ItemID@{outputs('ファイルの作成')?['body/ItemId']}を設定します。

image.png

ファイルの更新の場合

子フローから取得したidentifierファイル識別子に設定、ファイルコンテンツは新規作成と同様に@{body('JSON_の解析_Chatの履歴')}を設定します。

ファイルのプロパティの更新

ドキュメント ライブラリのメタデータを更新します。

列数が多いとJSONで複数まとめて設定できる方法が個人的に活きるなと感じます。

image.png

最後にフローへの応答を設定して完了です。

image.png

子フロー

このフローの役割は

  1. MessageIDからファイルの存在を確認する
  2. ファイルが存在する場合、ファイルコンテンツファイル識別子ItemIDを返す

この二ポイントです。

image.png

変数は下記の三点です。

  • strObject : String、ファイルが存在する場合にファイルコンテンツを文字列で格納
  • ItemID : Integer、ドキュメント ライブラリのItemID
  • Identifier : String、ファイル識別子

ファイルの取得 プロパティのみ

image.png

条件に合致するファイルの一覧を返します。
フィルター クエリを下記のように指定することで、一意であるMessageIDでファイルを特定させます。

フィルタークエリ
MessageID eq '@{triggerBody()['text']}'

考え方がわかれそうですが、メタデータでファイル管理するのは本当に楽です。
ファイル名とかやめたほうがいいと思います。(個人の意見)

image.png

ファイルの数は@{length(outputs('ファイルの取得_(プロパティのみ)')?['body/value'])}で取得します。

■ ファイルが存在する場合

image.png

変数の設定でItemIDIdentifierを設定しましょう。

ItemID - @{first(outputs('ファイルの取得_(プロパティのみ)')?['body/value'])?['ID']}
Identifier - @{first(outputs('ファイルの取得_(プロパティのみ)')?['body/value'])?['{Identifier}']}

そしてファイルコンテンツを取得します。

image.png

JSONの型が正確ではないと、値が正確に返ってきません。コンテンツ タイプの推測をオフにすれば取得できなくもないですが、おすすめはできないですね。

image.png

戻り値は文字列変数としてstrObjectに設定します。@{string(outputs('ファイル_コンテンツの取得')?['body'])}

そしてそれぞれ値を返します。

image.png

こちらによってフローがそろいました!

完成!

こちらをPower Appsでモダンなチャットアプリを作ってみる (1)と合わせて使うと、簡易的ですがチャットアプリができます。
Teamsコネクタを使った統合もできそうですが、こういったやり方もあるんだな、位にみてください!

それではよいPower Lifeを!

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?