経緯
定時後にふと「○○さんにメンションして連絡入れておきたい」ってなったらどうします?
「夜中でもなんでもメンションして送ってよし!相手は受信して反応しなければいいだけ」
とか、「定時後に連絡するな」とか、色々と意見は分かれると思いますが、
私は Microsoft Teams での投稿を予約したくて、Power Apps で作っていました
※PowerApps で作りかけていたやつ(返答ができてなかった)
別のことを調べている時に、Power Automate でやってのけている方がいたので、
それをインスパイヤーしながら、自分で使うように作ってみました
参考サイト:Microsoft Teams への予約投稿を Power Automate と Adaptive Cards でつくる
ハッキリ言って長いですが、作るとそんなに時間かからないです
(記事書くのは数日かかってますが...)
前準備
Microsoft 365 の環境はあるものとします
Power Automate の構築
アダプティブカードでの投稿作成画面
-
フロー名を入力し、トリガーに Microsoft Teams の [選択したメッセージに対して ] を選択して、[ 作成 ] をクリック
-
Input.ChoiceSet を AdaptiveCard にドラッグ・アンド・ドロップし
- Id に postType と入力
- Placeholder を 空 にする
- Compact style の チェックを外す
- Default value に reply と入力
- Choices に下記の Label , Value を入力
- Id に mention と入力
- Placeholder に 通知する相手を選択してください と入力
- Allow multi selection にチェックを入れる外す
- Choices に下記の Label , Value を入力
-
ColumnSet を AdaptiveCard にドラッグ・アンド・ドロップし、[ Add a column ] を 2 回クリック
-
Input.Date を AdaptiveCard にドラッグ・アンド・ドロップし
- Input.Time を AdaptiveCard にドラッグ・アンド・ドロップし
以上がアダプティブカードでの登録画面でした
※アダプティブカードでの投稿作成画面での妥協点
- 投稿タイプが変更のときだけタイトルの入力を表示したかった
- 本文の入力はリッチテキストがよかったな...
- 必須入力が設定できない
- 恐らく AdaptiveCard Ver1.3 からしかできない
- 通知先はチームに参加している人を動的にとりたい
- とりあえずアドレス帳として Input.ChoiceSet に登録する方法で逃げた
- 予約日時に動的に初期値を入れたかった
-
{formatDateTime(convertTimeZone(utcNow(),'UTC','Tokyo Standard Time'),'yyyy-MM-dd')}
と入れて初期値がセットできるかと思ったんだけど...
-
もっといい方法ないかな...
変数の初期化
アダプティブカードで入力した値が、判定などで使えなかったりしたので、
必要に応じて変数に移す
- [ + 新しいステップ ] -> [ 組み込み ] タブ -> [ 変数 ] -> [ 変数を初期化する ] を選択し
- ステップ名を 変数 PostMention を初期化する と入力
- メモに メールアドレスを <at></at> で囲んで送信用の文字列とする と入力
- 名前に PostMention と入力
- 種類は 文字列 を選択
- 初期値は空とする
変数の初期化フェーズはここまでとなります
通知先が設定されているときの処理
通知先が設定されているとき、各アドレスを <at>~</at>
で囲む必要があります
変数 Mention に値が入っていたら、各アドレスを <at>~</at>
で囲み、
変数 PostMention にセットします
※Input.ChoiceSet で複数選択されているとき、各値は半角カンマで区切られています
- [ + 新しいステップ ] -> [ 組み込み ] タブ -> [ コントロール ] -> [ 条件 ] を選択
- 左辺の 値の選択 にカーソルを移し、表示される 式 タブをクリック
-
empty()
のカッコの中にカーソルを持ってきて、動的なコンテンツ タブをクリックし、変数 Mention をクリックして、 [ OK ] をクリック
-
はいの場合 の [ アクションの追加 ] -> [ 組み込み ] タブ -> [ 変数 ] -> [ 変数の設定 ] を選択し
- ステップ名を PostMention にメンション用タグを設定 と入力
- メモに Mention の各メールアドレスを <at></at> で囲んで PostMention に設定する と入力
- 名前に PostMention を選択
- 種類は 文字列 を選択
- 値に <at></at><br> と入力
- 値の入力欄の <at></at> のタグ間にカーソルを移動し
これで通知先にチェックが入れられているとき、変数 PostMention にメンション用のタグがセットされました
予約した時間まで処理を待機させる
アダプティブカードで設定した予約日時まで、処理を待機させます
- [ + 新しいステップ ] -> [ 組み込み ] タブ -> [ 日時 ] -> [ タイムゾーンの変換 ] を選択
- 基準時間を動的なコンテンツから、reserveDate と reserveTime を選択して、 間に半角スペース を入れる
- 変換元のタイムゾーンは (UTC+09:00) 大阪、札幌、東京 を選択
- 変換先のタイムゾーンは (UTC) 協定世界時 を選択
- 書式設定文字列は カスタム値の入力 を選択して、 yyyy-MM-ddTHHssZ と入力
- [ + 新しいステップ ] -> [ 組み込み ] タブ -> [ スケジュール ] -> [ 延期期限 ] を選択
これで設定した時間まで待機するようになります
返信、または、新規投稿を行います
最後に投稿を行います
- [ + 新しいステップ ] -> [ 組み込み ] タブ -> [ コントロール ] -> [ 条件 ] を選択
- はいの場合 の [ アクションの追加 ] -> [ 標準 ] タブ -> [ Microsoft Teams ] -> [ メッセージの返信の投稿(V2) ] を選択し
- チームは カスタム値の入力 を選択して、動的なコンテンツから チームID を選択
- チャネルは カスタム値の入力 を選択して、動的なコンテンツから チャネルID を選択
- メッセージは動的なコンテンツから メッセージID を選択
- 返信は動的なコンテンツから PostMention を選択
- 返信に選択した PostMention の後ろにカーソルを持っていき
-
式 タブで
replace()
と入力 - カッコの中にカーソルを持ってきて、動的なコンテンツから変数の Body を選択
- 続けて
,decodeUriComponent('%0A'),'<br>'
と入力 - [ OK ] をクリック
- いいえの場合 の [ アクションの追加 ] -> [ 標準 ] タブ -> [ Microsoft Teams ] -> [ メッセージを投稿する(V3) ] を選択し、[ 詳細オプションを表示する ] をクリック
- チームは カスタム値の入力 を選択して、動的なコンテンツから チームID を選択
- チャネルは カスタム値の入力 を選択して、動的なコンテンツから チャネルID を選択
- メッセージは動的なコンテンツから PostMention を選択
- 34 と同じ手順で Body を追加
- 件名は動的コンテンツから Title を選択
利用方法
スレッドの最初の投稿の右にある ・・・ をクリックし、[ その他の操作 ] にマウスカーソルを当てると、作成したフローが出てくるのでクリックする
アダプティブカードが表示されるので、適宜入力して [ Submit ] をクリックすると予約完了
今の所の問題点
考察
Power Automate で Adaptive Cards を使って作ってみて、
PowerApps で作ると構築に手間は掛かりそうだけど、メリットはこういうのがありそう
- Team に参加している人リストを動的に作れる (メンション用)
- リッチテキストが使える