Microsoft Power Automateを使ってTeamsの親スレッドに返信を返してみる

やってみたいこと


最近、MicrosoftのFormsとかAutomateとかTeamsとかでいろいろ組んで遊んでいます。
いわゆる自動化っちゅーやつですかね?
最近取り組んでいるのは

勤怠連絡Formsに書いたら結果を今日の親スレッドに返信したい!!
あと、Formsの結果をリストに追加する。

です。普通にチャンネルへの投稿だったらすぐできるんですがやってみたいのが勤怠連絡チャンネルの今日の親スレッドにFormsの結果を返信し続けるのが目標です。

なお、Automateはどしろーとなので効率が悪かったりおかしな点があると思いますが許してね。

いろいろ調べて考えてみた

自動化と言うのかローコード?ノーコード?と言うのかはさておき、プログラミングで自由自在に組めない(と思う)ので既存のパーツやらパラメーターやらで貼ったり切ったりしてパズルみたいですね。
Forms周りとかは素直にやればいいんですが、Teamsのあたりが初挑戦の身としてはなかなか難しかった…

どう最新の投稿を判断するか

考えたのが下記。

  1. 朝7時に勤怠連絡チャンネルに投稿
  2. 誰かがFormsに記載する
  3. 勤怠チャンネルの今日の日付の投稿を探す
  4. そこに結果を書き込む
  5. リストに書き込む

こんな感じ。さっそくやってみよー。

やってみた

Formsの作るところは省いています。

毎日決まった時間に投稿


これは、天気予報を毎日サイクル取得するテンプレートがあったの流用。
取得したい天気はとりあえず職場の緯度経度をGoogleMapから取得して入れています。
単位の「指標」ってのは日本人になじみのある単位(摂氏何度)とかになるみたいです。
あと、「タイム ゾーンの変換」は単純に取得した日付から「今日は何日です」ってやろうとしましたが素直に関数でいっかと言うことで使ってないので省いてもいい場所。
ちなみに、関数はこんな感じでMicrosoftのサイトに書いてあったので丸っこっぴ。

これらを何時でもいいんですが毎日7時に投稿します。
まぁ、正直投稿できればいいんで天気予報とかはいらんっちゃいらんですが…
(ちなみに、予報は全部英語です…ここら辺もMicrosoft Translatorとかかませば日本語になるのかな…)

あまりこだわらなければ、時間トリガー+Teamsに投稿だけなので難しくは無いはず。

Teamsの親スレッドに返信する


まずは前半パートの4つ。

  1. トリガーはFormsを送信したらと言うことでFormsのURLからフォームIDをコピペ。
  2. 勤怠連絡チャンネルのメッセージを取得する。
    どうやら、直近20件までを取得し返信は対象外らしいです。
    最新のだけ取れれば楽なんですが…何か方法があるのでしょうか。
  3. 「NOW_DATE」という今日の日付を格納する変数を作ります。
  4. 初期化した「NOW_DATE」に「convertFromUtc(utcNow(),’Tokyo Standard Time’,’yyyyMMdd’)」の式をぶっこむと今日の日付が格納される。

と言った感じが前半。続いて後半部分。


これはFormsに書かれた部分をListsに格納しているところ。後半Aパート?
後々、ここのListsから今日は誰がどういう勤務体系なのかをぱっと見わかりやすくしてみたい…

  1. Formsの回答を取得(たぶん)
  2. メールアドレスからユーザープロファイルをぶっこぬく
  3. リストに挿入

そして最後、Teamsの今日の投稿を取得する。


最後の投稿だけを取得できないのでメッセージの一覧から総当たり。

  1. TeamsのメッセージCreatedatetimeを世界標準時から日本時間に変換する。
  2. IF分で今日の日付と一致するか
  3. 一致した場合は「チャネル内のメッセージで応答します」で返信を書く。

このとき③の注意点があります。


この、「チャネル内のメッセージで応答します」なんですが「投稿先」で「チャネル」を選択してもエラーを吐いてしまいます…
なので、なぜかは知りませんが「カスタム値の入力」から「channel」と英語で入力してやるとうまいこと機能してくれます。
バグなのかなんかのかは知りませんが何なんでしょう…

実行時間


組み方間違えて失敗もありますが、フローの平均実行時間は4秒だそうです。


やっぱり、最新のメッセージ比較のところで3秒かかっているのでここがボトルネックですね。
今はまだ投稿数が少ないのでいいけど、仕様が確かなら最大20件ぐらいなので今後さらに処理時間がかかりそうな感じ。
条件に合致したらさっさとループを終了させるなどの処理入れられないか検討なのかな。

と言うことで

これでとりあえず、7時に自動投稿したらそのメッセージIDを取得しフォームに書いたらそこに結果を返信するというのが出来上がりました。
今時点で、欠点も思いつく限りでは下記があります。

  1. 自動投稿の7時より前にFormsが記入されるとTeamsにはFormsの結果が書かれない
  2. 自動投稿より後でも誰かが勤怠連絡チャンネルに新規で書き込むとたぶん次書いた人はそこに返信が行く
  3. 1人1人Teamsの投稿一覧を取得しループで今日の日付かどうか判定させるのは正直効率が悪いような…

こんな感じですかね。
条件がすべて「いいえ」だったらというときのエラーハンドリングぐらいは何とかしてあげたいなーと思いつつ最低限のことは達成できたのでとりあえずは満足です。