PowerAutomate: Team 間の投稿を自動転送（判断付きで）

# 背景
複数の Team に所属していると、ある Team から別の Team へ定期的に転送したくなることがあるんです。

例）
- 濃い情報を定期的に投稿してくれる人がいる。

でも、中には転送したくないものがあるので、完全自動化は厳しい

こんな時に、自身にチャットを飛ばして、判断してから投稿させるっていうフローです。

# 概要
1. [トリガーで新規投稿検知](#トリガー)
1. [自身にチャットで概要通知しつつ、判断を促す](#判断)
1. [投稿、とした場合には、特定のスレッドへ返信](#添付ファイル処理と投稿)

# 動作例
こんな感じの投稿があって
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f866b47b-164e-9a2c-ee02-8b6d96f6c112.png)

概要を見て判断をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f202ccd5-7bc8-8d32-484f-8ae2f3b831a4.png)

転送した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/3946d878-5e77-2941-6f7c-5a58e587f2f3.png)


# 全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/de99adec-cf2b-d0f2-9f75-eeb09cd73dc1.png)

# 詳細
## トリガー
[新しいチャネル メッセージが追加されたとき](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/48712d0f-5520-10ce-3235-21e627369624.png)

## 判断
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/09b40846-2bb6-a608-ed2c-9484b04293e2.png)

- [自分のプロファイルを取得する (V2)](https://docs.microsoft.com/ja-jp/connectors/office365users/#%E8%87%AA%E5%88%86%E3%81%AE%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B-(v2)) で自身の情報取得　（判断の促し先）
- トリガーの投稿内容そのままだと HTML コンテンツだろうから、[HTML からテキストへ](https://docs.microsoft.com/ja-jp/connectors/conversionservice/#html-%E3%81%8B%E3%82%89%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%B8) で Plain Text 取得
- 判断を促す用のチャットを飛ばす
    - 「転送する」を選択した場合は、id: "Transfer" を返すようにしておくことで、Submit の結果をあとから判断する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f605b08a-a481-43e8-e911-243a3bcc8477.png)


```json:判断促す用の Adaptive Card
{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.3",
    "body": [
        {
            "type": "TextBlock",
            "text": "@{triggerOutputs()?['body/subject']}",
            "wrap": true,
            "color": "Attention"
        },
        {
            "type": "TextBlock",
            "text": "@{body('Html_to_text')}",
            "wrap": true,
            "color": "Dark",
            "size": "Small",
            "weight": "Lighter"
        },
        {
            "type": "ActionSet",
            "actions": [
                {
                    "type": "Action.Submit",
                    "title": "転送する",
                    "id": "Transfer"
                },
                {
                    "type": "Action.Submit",
                    "title": "やめておく",
                    "id": "Stop"
                },
                {
                    "title": "元投稿へ",
                    "type": "Action.OpenUrl",
                    "url": "@{triggerOutputs()?['body/webUrl']}",
                    "id": "OpenUrl"
                }
            ]
        }
    ],
    "msteams": {
        "width": "full"
    }
}
```

## 添付ファイル処理と投稿
### 投稿判断の処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/af43ccd3-236c-89e9-1ac0-2286b097afc3.png)

『転送する: Transfer』or 『やめておく: Stop』の判断

結果は、以下のように submitActionId で取得可能

```json:判断結果の取得
@{actions('Post_adaptive_card_and_wait_for_a_response')?['outputs/body'].submitActionId}
```

### 添付ファイル処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/137ad2fa-5205-1329-88cf-634558ac8fb7.png)


- 添付ファイルを全部処理
    - ファイル情報を取得。contenturl で指定
     > @items('Apply_to_each')['contenturl']
    - 転送元からコピー（Content取得して生成って道もあるが、その場合同一ファイル名があった場合の対処が面倒です）
    - コピーしたファイルのリンク情報を生成

:::note info
decode しないとパスが取得出来ないことがあるので注意
> @decodeUriComponent(items('Apply_to_each')['contenturl'])
:::

```html:ファイルリンクタグ
<a href="@{actions('Copy_file').inputs.parameters.dataset}@{outputs('Copy_file')?['body/Path']}">@{items('Apply_to_each')?['name']}</a><p/>
```

### 転送
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f18ab073-f21e-5f85-3342-d1c755ea3073.png)

HTML コンテント内に改行があると、Bulletins と組み合わさってなんか壊れることがあったので以下で置換して、Compose へ

https://qiita.com/baku2san/items/0ff47724b5a38c7b3c75

```json:改行置換
@{replace(triggerOutputs()?['body/body/content'],decodeUriComponent('%0A'),'')}
```

転送用メッセージを生成して、Compose へ保存

投稿者の情報は、Delve リンクで

https://qiita.com/baku2san/items/613db0b4f07fca7a9c80

```html:転送メッセージ
 posted by <a href="https://jpn.delve.office.com/?u=@{triggerOutputs()?['body/from/user/id']}&v=work"> @{triggerOutputs()?['body/from/user/displayName']}</a>
<h2>@{triggerOutputs()?['body/subject']}</h2>
<blockquote>@{outputs('Compose_ReplaceBreakableKeyphrase')}</blockquote> 

@{variables('Attachments')}
```

で、最後は返信で単一スレッドへ投稿（転送）

返信する場合、メッセージID が必要になるので、以下を実装しておくと便利です

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

# あとがき
Logic Apps が使えるようにしたいものです・・

# keyword
how to transfer teams to teams with decision