Power Automate Teams

【Power Automate】Teams自動投稿(指定日時、予約投稿、複数メンション)

 

相談者
Teamsのチャット、グループチャット、チームに指定日時で自動投稿する機能を追加したいです。
Power Automateを使えば、個人メンション、チームメンション、チャネルメンションができて、指定日時に自動投稿する機能を追加できます。
テンプレートの「メッセージをスケジュールする」をカスタマイズして、作成できます。
龍之介

 

この記事は、Power Automateで自動化するフローの作成手順になります。
フローが長くなるので、JSON、式をこの記事からコピーして作成してください(アクション名は、同じにしないとフローはエラーになります)
細かい式の説明などはありませんが、動画とブログでTeamsに指定日時(メンションあり)に投稿する自動化を作成できます。

本記事の内容

  • 日付、時間を決めてスケジュールする(指定日時で投稿する)
  • TeamsにWorkflowsを追加するフロー作成まで手順
  • 指定日時自動投稿(タイマーメッセージ投稿)を作成

 

YouTubeの動画を見ながら、この記事を使ってフローを作成してください。
式、JSON、HTMLをコピーすることができるので、Power Automateが得意でなくても作ることができます。
龍之介

 

 

日付、時間を決めてスケジュールする(指定日時で投稿する)

 

Teamsの投稿は、チャット、グループチャット、チームの3つあります。

できること
  • 30日以内の指定日時でのメッセージ投稿
  • メンション(個人、チーム、チャネル)
  • 件名、メッセージ、URLを投稿(件名は、チーム投稿のみ)

 

 

できないこと
  • 30日を超える指定日時でのメッセージ投稿
  • 個人メンション+チームメンションなどの組み合わせメンション
  • タグメンション※YouTubeの動画に手順説明しています。
  • ファイルの添付

 

指定日時に自動投稿するには、Teamsアプリに「Workflows」のアプリを追加する必要があります。

Teamsの作成ボックスの三点リーダー「・・・」→「Workflows」→「フロー名」をクリックします。

 

上段が「日時とメッセー」、下段が「メンション」です。
件名はチームのチャネルのみ有効で、メンションは、個人メンション、チームメンション、チャネルメンションのどれか1つになります。
タグメンションについては、YouTubeをご覧ください。また全メンションのフローも作ることが可能です(作成済み)。

 

チームチャネル

 

チャットまたはグループチャット

 

次からフローを作成します。フローは、テンプレートの「メッセージをスケジュールする」をカスタマイズします。
龍之介

 

TeamsにWorkflowsを追加するフロー作成まで手順

 

最初にTeamsデスクトップアプリにworkflowsを追加します。

そこから「新規アクションを作成」でテンプレートのフローを追加、Power Automateのマイフローから「メッセージをスケジュールする」のフローを修正します。

 

ブログでは、電子書籍のように画像をたくさん使っての細かい説明が難しいので、テキスト、画像での判断をお願いします。
龍之介

 

TeamsWorkflows

 

step
Teamsにアプリ追加

 

①Teamsデスクトップアプリの左側にある「・・・」→「その他のアプリ」をクリックします。


②Workflowsをクリックします。


③「追加」をクリックします。


④「試してみる」をクリックします。

 

step
チャットからWorkflowsを起動

 

⑤チャットの作成ボックスにある「・・・」→「Workflows」をクリックします。


⑥「新規アクションを作成」をクリックします。


⑦「メッセージをスケジュールする」をクリックします。


⑧フロー名「タイマーメッセージ投稿」に変更し、「ワークフローを追加する」をクリックします。


⑦フローボットからチャットにメッセージが届いたら追加完了です。

 

作成ボックスの「・・・」→「Workflows」→「タイマーメッセージ投稿」をクリックすると、下記のような入力ボックスが表示されます。
龍之介

この「メッセージをスケジュールする」のフローは、個人メンションをして、指定日時に投稿するフローです。
このままでも使うことができますが、足りない件名、URL、チームメンション、チャネルメンションを追加、自分への通知はチェックを無くして必ず通知するようにします。

 

 

 

指定日時自動投稿(タイマーメッセージ投稿)を作成手順

 

「メッセージをスケジュールする」のフローを修正していきます。
ブログでの手順は、電子書籍やYouTubeのように細かく説明できないので、画像を見ながらある程度判断してください。

フローにある式、JSONをコピーできるようにしています。
龍之介

 

Power Automateタイマーメッセージ投稿フロー

マイフローにできた、「タイマーメッセージ投稿」のフローを編集します。

step
作成ボックスから

作成ボックスを展開して、アダプティブカードを編集します。
下記にあるJSONを貼り付けてください。

①「作成ボックスから」を展開し、「アダプティブカードの編集」をクリックします。


②下にあるCARD PAYLOAD EDITORの隣の「+」をクリックします。


③下記JSONを貼り付けて、左上の「カード保存」をクリックします。
前にあるJSONは、削除してから貼り付けてください。

 

{
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "type": "AdaptiveCard",
    "version": "1.3",
    "body": [
        {
            "type": "TextBlock",
            "text": "▼日時とメッセージ",
            "weight": "Bolder",
            "size": "Medium",
            "fontType": "Default",
            "color": "Warning"
        },
        {
            "type": "TextBlock",
            "text": "※日付:",
            "wrap": true,
            "size": "Small"
        },
        {
            "type": "Input.Date",
            "id": "scheduledDate",
            "spacing": "None",
            "IsRequired": true,
            "errorMessage": "日付を選択してください。"
        },
        {
            "type": "TextBlock",
            "text": "※時間:",
            "wrap": true,
            "size": "Small"
        },
        {
            "type": "Input.Time",
            "id": "scheduledTime",
            "spacing": "None",
            "IsRequired": true,
            "errorMessage": "時間を選択してください。"
        },
        {
            "type": "TextBlock",
            "text": "件名:",
            "wrap": true
        },
        {
            "type": "Input.Text",
            "placeholder": "件名を入力してください(チャネルのみ)",
            "id": "Subject"
        },
        {
            "type": "TextBlock",
            "text": "※メッセージ:",
            "size": "Small"
        },
        {
            "placeholder": "メッセージを入力してください",
            "type": "Input.Text",
            "spacing": "None",
            "id": "messageToSend",
            "IsRequired": true,
            "isMultiline": true,
            "errorMessage": "メッセージを入力してください"
        },
        {
            "type": "TextBlock",
            "text": "URL:",
            "wrap": true
        },
        {
            "type": "Input.Text",
            "placeholder": "URLがあれば入力してください",
            "id": "Url"
        },
        {
            "type": "TextBlock",
            "text": "▼メンション",
            "wrap": true,
            "weight": "Bolder",
            "color": "Good",
            "size": "Medium",
            "fontType": "Default"
        },
        {
            "type": "TextBlock",
            "size": "Medium",
            "weight": "Default",
            "text": "個人へ@メンション"
        },
        {
            "type": "Input.ChoiceSet",
            "choices.data": {
                "type": "Data.Query",
                "dataset": "graph.microsoft.com/users"
            },
            "id": "peopleToAtMention",
            "isMultiSelect": true
        },
        {
            "type": "Input.Toggle",
            "title": "チームへ@メンション",
            "id": "TeamtoMention"
        },
        {
            "type": "Input.Toggle",
            "id": "ChanneltoMention",
            "title": "チャネルへ@メンション"
        }
    ]
}

 

 

step
フロー実行日時と条件を追加

データ操作の作成を追加して、今の日時を追加、変数「scheduledMessageSendTime」が次の値以上を条件にします。
これで指定日時が今の日時以上の時、フローが進みます。過去の日時は、エラー通知します。

④「Initialize scheduledMessageSendTime」の下に「データ操作」の「作成」を追加し、下記式を追加します。
アクション名は、「フロー実行日時」に変更しました。

 
convertFromUtc(utcNow(),'Tokyo Standard Time','yyyy-MM-dd HH:mm')

 

⑤「フロー実行日時」の下に「条件」を追加、左側の「値の選択」に変数「scheduledMessageSendTime」、右側の「値の選択」にフロー実行日時の「出力」を追加、真ん中は、「次の値以上」を選択します。
アクション名は、「現在の日時以上かチェック」に変更しました。

 

 

step
過去の日時エラーを通知

「現在の日時以上かチェック」の「いいえの場合」にフローボットで通知とフロー終了アクションを追加します。
過去の日時の場合、フローはエラー通知して、終了となります。

⑥「いいえの場合」の中に「チャットまたはチャネルでメッセージ投稿する」を追加します。
⑦投稿者、投稿先はフローボットにし、Recipientに自分のメールアドレスを追加、メッセージは下記を貼り付けます。
</>をクリックして、HTMLにしてから貼り付けしてください。
アクション名は、「フローボットで過去の日時エラーを通知」に変更しました。

 

タイマーメッセージ投稿は、過去の日時のため終了しました。<br>
<br>
メッセージ<br>
@{uriComponentToString(replace(uriComponent(triggerBody()?['entity']?['cardOutputs']?['messageToSend']),'%0A','<br>'))}<br>
<br>
URL<br>
@{if(empty(triggerBody()?['entity']?['cardOutputs']?['url']),'',concat('<a href="',triggerBody()?['entity']?['cardOutputs']?['url'],'" target="_blank" rel="noopener noreferrer">',triggerBody()?['entity']?['cardOutputs']?['url'],'</a>'))}<br>

 

⑧「フローボットで過去の日時エラーを通知」の下に「コントロール」の「終了」を追加します。状態は「成功」にします。
アクション名は、「過去の日時のため終了」に変更しました。

 

 

step
変数の追加と削除

「NotifyMyself」の変数を削除し、「PeopleFlag」(ブール値)、「Destination」(文字列)の2つの変数を追加します。

⑨「Initialize userMentionString」の下の「Initialize NotifyMyself」を削除します。
フローのConditon(条件)の中にあるConditon2、Conditon3も削除してください。
⑩「変数を初期化する」のアクションを追加し、名前に『PeopleFlag』、種類に『ブール値」、値に式で「false」を追加します。
アクション名は、「PeopleFlag変数を初期化する」に変更しました。
⑪「変数を初期化する」のアクションを追加し、名前に『Destination』、種類に『文字列」、値に『投稿先なし』を追加します。
アクション名は、「Destination変数を初期化する」に変更しました。

 

 

step
Apply to eachの中の条件にPeopleFlagの変数を設定

個人メンションのときのFlag変数を設定します。

⑫「Append to string variable」の文字列変数に追加の下に「変数の設定」のアクションを追加します。名前に「PeopleFlag」、値に式で「true」を追加します。
アクション名は、「PeopleFlag変数の設定」に変更しました。

 

 

step
4つの条件を追加

4つの条件(チャットグループチャット、チャネルへの投稿、チーム@team、チーム@channel)に変数Destinationの設定を追加します。
条件に当てはまれば、変数Destinationに(チャットグループチャット、チャネル、チームメンション、チームチャネル)が入ります。
当てはまらない場合は、そのまま「投稿先なし」です。

⑬「Apply to each」の下に「条件」を追加します。
「チャットグループチャット」の条件は、下記になります。
「And」
チャネルID「次の値に等しい」null
グループ「次の値に等しい」true
teamtoMention「次の値に等しい」False
channeltoMention「次の値に等しい」False
アクション名は、「チャットグループチャット」に変更しました。
Falseはそのまま最初大文字にしてください(最初大文字と小文字があります)。
⑭「はいの場合」に「変数の設定」を追加し、名前に「Destination」、値に『チャットグループチャット』と入力します。
アクション名は、「Destination変数の設定(チャットグループチャット)」に変更しました。

 

 

⑮「Apply to each」の下に「並列分岐の追加」で「条件」を追加します。
「And」
「チャネルへの投稿」の条件は、下記になります。
チャネルID「次の値に等しくない」null
teamtoMention「次の値に等しい」False
channeltoMention「次の値に等しい」False

「または」グループの追加
PeopleFlag「次の値に等しい」true
PeopleFlag「次の値に等しい」false
アクション名は、「チャネルへ投稿」に変更しました。
Falseはそのまま最初大文字にしてください(最初大文字と小文字があります)。
⑯「はいの場合」に「変数の設定」を追加し、名前に「Destination」、値に『チャネル』と入力します。
アクション名は、「Destination変数の設定(チャネル)」に変更しました。

 

 

 

⑰「Apply to each」の下に「並列分岐の追加」で「条件」を追加します。
「And」
「チーム@team」の条件は、下記になります。
チャネルID「次の値に等しくない」null
teamtoMention「次の値に等しい」True
channeltoMention「次の値に等しい」False
PeopleFlag「次の値に等しい」false
アクション名は、「チーム@team」に変更しました。
True、Falseはそのまま最初大文字にしてください(最初大文字と小文字があります)。
⑱「はいの場合」に「変数の設定」を追加し、名前に「Destination」、値に『チームメンション』と入力します。
アクション名は、「Destination変数の設定(チームメンション)」に変更しました。

 

 

⑲「Apply to each」の下に「並列分岐の追加」で「条件」を追加します。
「And」
「チーム@channel」の条件は、下記になります。
チャネルID「次の値に等しくない」null
teamtoMention「次の値に等しい」False
channeltoMention「次の値に等しい」True
PeopleFlag「次の値に等しい」false
アクション名は、「チーム@channel」に変更しました。
True、Falseはそのまま最初大文字にしてください(最初大文字と小文字があります)。
⑳「はいの場合」に「変数の設定」を追加し、名前に「Destination」、値に『チャネルメンション』と入力します。
アクション名は、「Destination変数の設定(チームメンション)」に変更しました。

 

 

「作成ボックスから」でチャネル名がとれないので、ここだけ3つアクション追加します。
龍之介

㉑「Destination変数の設定(チームメンション)」の下に「チャネルの一覧表示」を追加し、チームに「チームID]を追加します。
㉒「アレイのフィルター処理」を追加し、差出人に「チャネルの一覧」、左側の「値の選択」に(チャネルの一覧表示)の「チャネルID」、右側の「値の選択」に(作成ボックスから)の「チャネルID]を追加します。
㉓「データ操作」の「作成」を追加し、下記式を追加します。
アクション名は、「チャネル名」に変更しました。

 
first(body('アレイのフィルター処理'))?['DisplayName']

 

 

step
タイムゾーンの変換、遅延期限、条件を移動

Convert time zone(タイムゾーンの変換)とDelay until(遅延期限)、Condition(条件)を移動します。

一番下の「新しいステップ」をクリックすると4つの条件が繋がるので、その状態で「Condition」「Delay until」「Convert time zone」の順で移動します。

 

 

step
スイッチを追加

Delay untilの下にスイッチのアクションを追加します。
スイッチの上にある遅延期限をケースの中に追加してもOKです。ケースに当てはまらない場合(チームメンションとチャネルメンションを両方つける)も遅延してエラーの通知が行かないフローになっているので、すぐ通知させたい場合は、ケースの中に遅延条件をそれぞれ追加してください。

㉕コントロールの「スイッチ」を追加します。オンに変数の「Destination」を追加します。
㉖ケースの次の値と等しいに『チャットグループチャット』と入力し、ケース名も『チャットグループチャット』に変更します。
㉗「Condition」の中にある「post message in a chat」を移動して、メッセージの「</>」をクリックしたら、下記式を貼り付けます。

 

@{if(empty(variables('userMentionString')),'',concat(variables('userMentionString'),'<br>'))}
@{uriComponentToString(replace(uriComponent(triggerBody()?['entity']?['cardOutputs']?['messageToSend']),'%0A','<br>'))}<br>
@{if(empty(triggerBody()?['entity']?['cardOutputs']?['url']),'',concat('<a href="',triggerBody()?['entity']?['cardOutputs']?['url'],'" target="_blank" rel="noopener noreferrer">',triggerBody()?['entity']?['cardOutputs']?['url'],'</a>'))}

 

 

㉘「+」をクリックして、ケースを追加、ケースの次の値と等しいに『チャネル』と入力し、ケース名も『チャネル』に変更します。
㉙「Condition」の中にある「post message in a channel」を移動して、メッセージの「</>」をクリックしたら、下記式を貼り付けます。
㉚件名に「subject」を追加します。
㉛「Condition」は不要なので削除します。

 

@{if(empty(variables('userMentionString')),'',concat(variables('userMentionString'),'<br>'))}
@{uriComponentToString(replace(uriComponent(triggerBody()?['entity']?['cardOutputs']?['messageToSend']),'%0A','<br>'))}<br>
@{if(empty(triggerBody()?['entity']?['cardOutputs']?['url']),'',concat('<a href="',triggerBody()?['entity']?['cardOutputs']?['url'],'" target="_blank" rel="noopener noreferrer">',triggerBody()?['entity']?['cardOutputs']?['url'],'</a>'))}

 

 

 

step
チームメンションを追加

Graph APIにHTTP要求を送信するとメンション付きでメッセージできるので、「Office365 groups」のコネクタにある「HTTP要求を送信します」のアクションを追加します。
メッセージは、チャットと同じようにメンション、メッセージ、URLの順にします。URLは、バックスラッシュが無いとエラーになるのでデータ操作の作成に追加しました。

㉜「+」をクリックして、ケースを追加、ケースの次の値と等しいに『チームメンション』と入力し、ケース名も『チームメンション』に変更します。
㉝「チームの取得」を追加し、チームに「チームID]を追加します。
㉞データ操作の「作成」を追加し、下記HTMLを追加します。
アクション名は、「URL(チームメンション)」に変更しました。

 

<a href=\"@{triggerBody()?['entity']?['cardOutputs']?['url']}\" target=\"_blank\" rel=\"noopener noreferrer\">@{triggerBody()?['entity']?['cardOutputs']?['url']}</a>

 

 

㉟「Office365 groups」の「HTTP要求を送信します」を追加し、URI、メソッド「POST」、本文を追加選択します。
アクション名は、「チームへ@teamして投稿」に変更しました。

 
https://graph.microsoft.com/v1.0/teams/@{triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']}/channels/@{triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['channel']?['id']}/messages

 

 

{
    "subject": "@{triggerBody()?['entity']?['cardOutputs']?['subject']}",
    "body": {
    "contentType": "html",
    "content": "<div><at id=\"0\">@{outputs('チームの取得')?['body/displayName']}</at><br>@{uriComponentToString(replace(uriComponent(triggerBody()?['entity']?['cardOutputs']?['messageToSend']), '%0A', '<br>'))}<br>@{outputs('URL(チームメンション)')}</div>"
    },
    "mentions": [
        {
            "id": 0,
            "mentionText": "@{outputs('チームの取得')?['body/displayName']}",
            "mentioned": {
            "conversation": {
                    "id": "@{triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']}",
                    "displayName": "@{outputs('チームの取得')?['body/displayName']}",
                    "conversationIdentityType": "team"
                }
            }
        }
    ],
    "reactions": []
}

 

チャネルまたはチャットで chatMessage を送信する - Microsoft Graph v1.0 | Microsoft Learn
チャネルまたはチャットで chatMessage を送信する - Microsoft Graph v1.0 | Microsoft Learn

learn.microsoft.com

 

step
10
チャネルメンションを追加

㊱「+」をクリックして、ケースを追加、ケースの次の値と等しいに『チャネルメンション』と入力し、ケース名も『チャネルメンション』に変更します。
㊲データ操作の「作成」を追加し、下記HTMLを追加します。
アクション名は、「URL(チームメンション)」に変更しました。

 

<a href=\"@{triggerBody()?['entity']?['cardOutputs']?['url']}\" target=\"_blank\" rel=\"noopener noreferrer\">@{triggerBody()?['entity']?['cardOutputs']?['url']}</a>

 

 

㊳「Office365 groups」の「HTTP要求を送信します」を追加し、URI、メソッド「POST」、本文を追加選択します。
アクション名は、「チームへ@channelして投稿」に変更しました。

 
https://graph.microsoft.com/v1.0/teams/@{triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['team']?['aadGroupId']}/channels/@{triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['channel']?['id']}/messages

 

{
    "subject": "@{triggerBody()?['entity']?['cardOutputs']?['subject']}",
    "body": {
        "contentType": "html",
        "content": "<div><at id=\"0\">@{outputs('チャネル名')}</at><br>@{uriComponentToString(replace(uriComponent(triggerBody()?['entity']?['cardOutputs']?['messageToSend']),'%0A','<br>'))}<br>@{outputs('URL(チャネルメンション)')}</div>"
    },
    "mentions": [
        {
            "id": 0,
            "mentionText": "@{outputs('チャネル名')}",
            "mentioned": {
                "conversation": {
                    "id": "@{triggerBody()?['entity']?['teamsFlowRunContext']?['channelData']?['channel']?['id']}",
                    "displayName": "@{outputs('チャネル名')}",
                    "conversationIdentityType": "channel"
                }
            }
        }
    ]
}

 

チャネルまたはチャットで chatMessage を送信する - Microsoft Graph v1.0 | Microsoft Learn
チャネルまたはチャットで chatMessage を送信する - Microsoft Graph v1.0 | Microsoft Learn

learn.microsoft.com

 

step
11
エラー通知

ケースの条件に入らない場合(チームメンションとチャネルメンション両方にチェックが入っているなど)は、「既定」にエラー通知を追加します。

㊴「既定」の中に「チャットまたはチャネルでメッセージ投稿する」を追加します。
㊵投稿者、投稿先はフローボットにし、Recipientに自分のメールアドレスを追加、メッセージは下記を貼り付けます。
</>をクリックして、HTMLにしてから貼り付けしてください。
アクション名は、「フローボットでエラーを通知」に変更しました。
㊶「フローボットでエラーを通知」の下に「コントロール」の「終了」を追加します。状態は「成功」にします。
アクション名は、「エラーのため終了」に変更しました。

 

タイマーメッセージは、エラーのため投稿されませんでした。<br>
<br>
投稿先<br>
@{variables('Destination')}<br>
<br>
メッセージ<br>
@{uriComponentToString(replace(uriComponent(triggerBody()?['entity']?['cardOutputs']?['messageToSend']),'%0A','<br>'))}<br>
<br>
URL<br>
@{if(empty(triggerBody()?['entity']?['cardOutputs']?['url']),'',concat('<a href="',triggerBody()?['entity']?['cardOutputs']?['url'],'" target="_blank" rel="noopener noreferrer">',triggerBody()?['entity']?['cardOutputs']?['url'],'</a>'))}<br>

 

 

step
12
フローボットで投稿を通知

自分の投稿は、通知がこないのでフローボットで通知します。

㊷一番下の「新しいステップ」に「チャットまたはチャネルでメッセージ投稿する」を追加します。
㊸投稿者、投稿先はフローボットにし、Recipientに自分のメールアドレスを追加、メッセージは下記を貼り付けます。
</>をクリックして、HTMLにしてから貼り付けしてください。
アクション名は、「フローボットで投稿を通知」に変更しました。

 

@{outputs('フロー実行日時')}にセットしたタイマーメッセージが投稿されました。<br>
<br>
投稿日時<br>
@{variables('scheduledMessageSendTime')}<br>
<br>
投稿先<br>
@{variables('Destination')}<br>
<br>
メッセージ<br>
@{uriComponentToString(replace(uriComponent(triggerBody()?['entity']?['cardOutputs']?['messageToSend']),'%0A','<br>'))}<br>
URL<br>
@{if(empty(triggerBody()?['entity']?['cardOutputs']?['url']),'',concat('<a href="',triggerBody()?['entity']?['cardOutputs']?['url'],'" target="_blank" rel="noopener noreferrer">',triggerBody()?['entity']?['cardOutputs']?['url'],'</a>'))}<br>

 

 

㊹「保存」をクリックします。

 

フローの手順は以上です。
YouTubeにも同じ内容を公開しています。
龍之介

 

まとめ

 

今回は、テンプレートの「メッセージをスケジュールする」をカスタマイズして、タイマーメッセージ投稿のフローを作成しました。

30日以内の指定日時で、チャット、グループチャット、チャネルにメンション(個人、チーム、チャネル)付きで投稿できるので、思いついた時にセットしておきましょう。

セットしたことを忘れちゃう人は、アクションを追加して「タイマーメッセージセットメール」のようにOutlookにメール送信するといいかもしれません。

忘れてました。仕事をしているフリして投稿するのに使うのもOKです。

私はそのために作りました。(笑)

 

-Power Automate, Teams

© 2022 越後屋ブログ店