PowerAutomate: Yammer の新規スレッドのみを Teams へ展開する

# 背景
Teams に Community を追加すれば Yammer も把握しやすくなるんですが・・

Yammer 自体が浸透していない環境の場合
Yammer での有益な展開内容を Teams に投稿させることで、普段 Yammer を見ない人を誘導できるんじゃないかなぁという思いから

:::note info
スレッド全部展開すると大量になりがちなので、今回は以下とする
- Yammer での新規スレッド投稿のみ
- Teams では、単一スレッドへ返信という形でまとめる
:::

# 概要
1. [Yammer で新しいメッセージのトリガーで起動](#yammer-で新しいメッセージのトリガーで起動)
1. [新しい投稿のみにフィルター](#新しい投稿のみへのフィルター)
1. [Teams への返信アクションで投稿](#teams-の展開用スレッドへ返信することで展開)

## 動作イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/72f73e98-b91c-00d6-3a16-ef2d6bd8c90b.png)

# 全体像
非常に単純なので、初心者の方にもおすすめですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/6f06946a-8432-9e1f-c0ce-a4e5418d9dfd.png)


# 詳細
## Yammer で新しいメッセージのトリガーで起動

**[グループに新しいメッセージがあるとき](https://docs.microsoft.com/ja-jp/connectors/yammer/#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AB%E6%96%B0%E3%81%97%E3%81%84%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E3%81%8D)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b2b9063e-6fc9-55b0-ef0c-840b2b7a6bed.png)

## 新しい投稿のみへのフィルター
Teams のトリガー [新しいチャネル メッセージが追加されたとき](https://docs.microsoft.com/ja-jp/connectors/teams/#%E6%96%B0%E3%81%97%E3%81%84%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%9F%E3%81%A8%E3%81%8D) と以下が違うのでフィルターが必要 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/7f2ade06-8205-d7d4-1934-c9ac7e01ca3e.png)

フィルターする為にトリガーの結果を調べると、返信すると replied_to_id が設定されることがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/bc667ee4-2437-e9d2-6d26-47e718635075.png)

ということで、replied_to_id を取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/af32687b-a22a-e17f-d399-97d162159ee1.png)

```json:replied_to_id 
triggerOutputs()?['body/replied_to_id']
```

取得結果が、空っぽなら、返信させるように 条件(condition) を追加するだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/25a6b674-3020-fa8d-9e6f-605c98a50ebd.png)

:::note warn
replied_to_id は 数値 の為、そのまま取得して empty() で確認してしまうと、empty() の引数の想定型に当てはまらない為にエラーになるので注意
:::

## Teams の展開用スレッドへ返信することで展開
普通に以下アクションで返信するのみ
**[チャネル内のメッセージで応答します](https://docs.microsoft.com/ja-jp/connectors/teams/#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E5%86%85%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%A7%E5%BF%9C%E7%AD%94%E3%81%97%E3%81%BE%E3%81%99)** で投稿

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/2c22b9a0-c780-5818-9877-edc85da15ecc.png)

メッセージ（Message) は、以下とすることで、Yammer への誘導を図る
- 元メッセージへのリンクを追加
- blockquote を使って、引用扱い
```html:投稿内容
<a href="@{triggerOutputs()?['body/web_url']}">メッセージへ</a>

<blockquote>@{triggerOutputs()?['body/body/rich']}</blockquote>
```

:::note info
返信(Reply) なので、事前に親スレッドを投稿しておき、そのメッセージ ID を取得しておく必要があります
:::

# メッセージ ID の取得方法
以下を設定しておくと、こういうときのメッセージ ID 取得は便利になりますよ

https://qiita.com/baku2san/items/3756201744e0886912d1

# 補足
今回、Yammer のスレッド全部を展開しているわけではないですが、もし、スレッド全部を展開する場合は以下方針かな
1. replied_to_id が無い場合（今回の Reply 側）
    1. 新規投稿
    1. 新規投稿時のメッセージ ID と Yammer のスレッドID を対にして Lists とかに保存
1. replied_to_id がある場合
    1. 対となるTeams のメッセージID を取得して、Reply

今回は以下理由でパス
- 単に Yammer の概要通知をしたいだけなので、親だけで OK
- Lists などで管理するのは面倒。

# あとがき
SharePoint の通知や、各種外部情報を Teams の特定のチャネルで受けられるようにすると、楽になっていいですよね。

# keyword
How to transfer yammer thread to teams

# アクション部分のフロー
再現する場合は、以下を利用

https://qiita.com/baku2san/items/ad4f7fa744d104b23f50

```json:アクション全部
{
    "id": "b7098e63-f0ed-40bc-a033-4faceed26f4e",
    "brandColor": "#8C3900",
    "connectionReferences": {
        "shared_yammer": {
            "connection": {
                "id": "/providers/Microsoft.PowerApps/apis/shared_yammer/connections/shared-yammer-0b7c3a2d-c2f5-46ef-bd0d-32f189b1e3eb"
            }
        },
        "shared_teams_1": {
            "connection": {
                "id": "/providers/Microsoft.PowerApps/apis/shared_teams/connections/shared-teams-864099d5-54a7-4002-93b6-565ecf481128"
            }
        }
    },
    "connectorDisplayName": "Control",
    "icon": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDMyIDMyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KIDxwYXRoIGQ9Im0wIDBoMzJ2MzJoLTMyeiIgZmlsbD0iIzhDMzkwMCIvPg0KIDxwYXRoIGQ9Im04IDEwaDE2djEyaC0xNnptMTUgMTF2LTEwaC0xNHYxMHptLTItOHY2aC0xMHYtNnptLTEgNXYtNGgtOHY0eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+DQo=",
    "isTrigger": false,
    "operationName": "Scope_TransferToTeamsWhenNewThreadIsCreated",
    "operationDefinition": {
        "type": "Scope",
        "actions": {
            "Condition_Is_New_Thread": {
                "type": "If",
                "expression": {
                    "equals": [
                        "@outputs('Compose')",
                        "@null"
                    ]
                },
                "actions": {
                    "Reply_with_a_message_in_a_channel": {
                        "type": "OpenApiConnection",
                        "inputs": {
                            "host": {
                                "connectionName": "shared_teams_1",
                                "operationId": "ReplyWithMessageToConversation",
                                "apiId": "/providers/Microsoft.PowerApps/apis/shared_teams"
                            },
                            "parameters": {
                                "poster": "Flow bot",
                                "location": "Channel",
                                "body/parentMessageId": "1645275812524",
                                "body/recipient/groupId": "a70cc9a6-85a4-4b73-974a-c005f11ca2b5",
                                "body/recipient/channelId": "19:b55252f93b12444ea97ffd5ac9a26abc@thread.tacv2",
                                "body/messageBody": "<a href=\"@{triggerOutputs()?['body/web_url']}\">メッセージへ</a>\n\n<blockquote>@{triggerOutputs()?['body/body/rich']}</blockquote>"
                            },
                            "authentication": "@parameters('$authentication')"
                        },
                        "runAfter": {},
                        "metadata": {
                            "operationMetadataId": "72f2956e-f299-4701-aa94-b37b12f67369"
                        }
                    }
                },
                "runAfter": {
                    "Compose": [
                        "Succeeded"
                    ]
                },
                "metadata": {
                    "operationMetadataId": "99f709c7-e804-4c27-ad32-adfc12db94c3"
                }
            },
            "Compose": {
                "type": "Compose",
                "inputs": "@triggerOutputs()?['body/replied_to_id']",
                "runAfter": {},
                "metadata": {
                    "operationMetadataId": "3872b9b8-a229-46b8-bded-83b0030a0c66"
                }
            }
        },
        "runAfter": {},
        "metadata": {
            "operationMetadataId": "24451bb9-dbf3-4d32-a750-3965804f170a"
        }
    }
}
```