LoginSignup
2
6

More than 1 year has passed since last update.

PowerAutomateでOutlookに登録した予定表をTeamsのステータスメッセージに自動登録する

Posted at

やりたいこと

  • Outlookの予定表に登録した出社/テレワークの予定をPowerAutomateで取得してTeamsのステータスメッセージに自動で登録したい

image.png

方針

  • PowerAutomateで0時過ぎに日次でフローを動かす
  • 現在日時を取得し、Outlookに登録された予定を取得する
    • Teamsに設定したいステータスメッセージはOutlook側で任意の文字列から開始する予定を対象とする
      • 今回で言うと「★テレワーク」「★出社」のような予定を対象とする
  • 取得できた予定をSharePointのAPIを利用してTeamsのステータスメッセージを更新する
    • Outlookの予定の「公開方法」が「他の場所で作業中」または「外出中」として登録された予定はTeamsステータスメッセージの「他のユーザが自分にメッセージを送るときに表示する」のフラグをONにして登録する
      image.png

全体図

まずはじめに全体図
次のセクションから詳細を記述していきます

image.png

やり方

Microsoft Automateのサイトへアクセス

フローの作成

作成→スケジュール済みクラウド フローを選択し、
任意の名前を設定する。
(後に設定し直すので他のオプションはとりあえずそのままでOK)

image.png

実行間隔の設定

作成されたフローの先頭にあるRecurrenceの中の詳細オプションからタイムゾーンと設定時刻(時間)、設定時刻(分)を設定する。
(今回の場合1日に1回Outlookから予定を参照し、Teamsのステータスメッセージを更新したいので、1日に1回、日付を超えた辺りの時間に実行しておけばいいのでAM0:10を指定)

image.png

現在日時の取得

新しいステップを追加し、「日時」で検索→現在時刻の取得を選択
image.png

Outlook予定の取得

新しいステップを追加し、「Outlook」で検索→「イベントの取得(V4)」を選択
image.png

予定表IDは自分の予定表を選択する(おそらくデフォルトで使用している場合「予定表」が自分の予定表)
image.png

フィルタークエリに

start/datetime le '{現在の時刻}' and  end/datetime ge '{現在の時刻}' and startsWith(subject, '★')

{現在の時刻}の箇所は動的なコンテンツから選択します

上から順に取得に1 を設定
(1件だけ取得)
※今回の例でいうと1日にから始まる予定は1件しかない想定としているため、ソート等は考えずに1件だけ取得するようにしています
image.png

Teamsで表示するメッセージの初期化

新しいステップを追加し、「変数を初期化する」を選択
image.png

任意の名前を設定し、種類は文字列を選択
値には式にformatDateTime(body('現在の時刻'), 'yyyy/MM/dd')と入力
body('現在の時刻')の箇所は動的なコンテンツから選択できます

image.png

Outlookで取得した予定のループ処理

新しいステップを追加し、Apply to eachを選択
image.png

以前の手順から出力を選択の箇所には動的なコンテンツ > イベントの取得(V4)の中にあるvalueを選択
image.png

メッセージの追加

Apply to each内に新しいステップを追加し、文字列変数に追加を選択
→先程初期化した変数にOutlook予定の件名を追加する
image.png

(ここまでで変数の値には2022/04/11 : ★テレワークのような値になっています)

条件分岐

新しいステップを追加し、条件を選択
→条件として表示方法workingElsewhere(他の場所で作業中) または off(外出中)となるように入力します
image.png

メッセージの追記

表示方法(Outlook側では公開方法)が「他の場所で作業中」または「外出中」のときだけ、
Teamsのステータスメッセージの「他のユーザが自分にメッセージを送るときに表示する」をONにしたいので、はいの場合のステップとして、文字列変数に追加のステップを追加し、<pinnednote></pinnednote>の文字列を追加します

image.png

ShareポイントにHTTPリクエスト

条件分岐を抜けた後のステップにSharePointにHTTP要求を送信しますのステップを追加し、下記の通り選択

項目
サイトのアドレス https://presence.teams.microsoft.com
方法 PUT
URI /v1/me/publishnote
ヘッダー キー: content-type
値: application/json

ボディ

{
    "message": "@{variables('statusMsg')}",
    "expiry": "@{addDays(body('現在の時刻'), 1)}"
}

image.png

※サイトのアドレス入力時にエラーメッセージが表示されることがありますが、その場合、一旦保存すれば消えます(バグっぽい・・・?)
image.png

動作確認

ここまでで手順としては終了です。
保存後、画面右上のテストから手動で実行して動作確認をしてみましょう。

image.png

手動実行後のフロー実行ページで成功と表示されているか?
image.png

Teamsのステータスメッセージに想定している内容が表示されているかどうか?
image.png

等を確認して設定完了です!

作ってみて

良くなかった点

  • Microsoft周りのドキュメント、本当にわかりにくい。。。先駆者が居てくれたお陰でなんとなくどんな使い方をすればいいか知ることができたが、公式のドキュメントだけで理解するのは難しい
  • ノーコードだとかローコードとかよく言われているが、自分には逆に難しかった。プログラムを普段組まない人が難なく作ることができるかと言われると、難しいのかもしれない。。。特に何かエラーが起きたときにサクッと解決できる気はしなかった

良かった点

  • 認証やセキュリティ周り、環境等は一切考えずに実装できたのは楽だった

今後の方針

  • Outlookの予定表の取得範囲を1週間先まで見て、有給取得日が含まれていたらメッセージに更に追記する。といったこともやってみようと思います。

参考サイト

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6