はじめに
出社とテレワーク、せめてどちらかはわかりあいたい・・・!! そんなニーズはありませんか!?
職場によりけりだと思いますが、ハイブリッドワークであれば出社する日を合わせたり、当番制にしたり様々な事情があると思います。
そんな日常のお困りごとを解決するものが正にPower Automate
の出番だと思います!
本日は上記のような状況を解決するTips
、Power Automate
フローをシェアしたいと思います!
関連するテクニックは
- Teams タグメンバーを取得する
- Teams タグメンションを取得するTips
-
選択
、JSON
といったデータ操作テクニック
です!
フローの全体像
まずはフローのキャプチャです。
エラーハンドリングや条件分岐は全くない状態。
ブラッシュアップの余地はありますが、一旦稼働するものを紹介しています。
繰り返し処理にしたり、トリガーは需要に合わせて自由に変更してください!
1. メンバーを取得する
今回のシナリオは Teamsの特定のタグでメンバーを管理する
手法を一旦想定します。
Teams
コネクタのタグのメンバーを一覧表示するを使用しましょう!
戻り値で所属するメンバーのId
が取得できます。
{
"statusCode": 200,
"headers": {
"Transfer-Encoding": "chunked",
"Vary": "Accept-Encoding",
"Strict-Transport-Security": "max-age=31536000",
"request-id": "f9104446-5d0a-405d-b776-bec925c7c4cd",
"client-request-id": "f9104446-5d0a-405d-b776-bec925c7c4cd",
"x-ms-ags-diagnostic": "{\"ServerInfo\":{\"DataCenter\":\"Japan East\",\"Slice\":\"E\",\"Ring\":\"5\",\"ScaleUnit\":\"001\",\"RoleInstance\":\"TYO1EPF00001C9E\"}}",
"OData-Version": "4.0",
"x-ms-client-region": "japan",
"x-ms-flavor": "Production",
"X-Ms-Workflow-Resourcegroup-Name": "A5510967A68D45B8B128110263BF391F-2A9F4A58FB85E21FB72EF1240BA74EB0-ENV",
"x-ms-workflow-subscription-id": "c642c65c-bdd8-4e8a-9881-4b38764afe3c",
"x-ms-environment-id": "2a9f4a58-fb85-e21f-b72e-f1240ba74eb0",
"x-ms-tenant-id": "guid__",
"x-ms-dlp-re": "-|-",
"x-ms-dlp-gu": "-|-",
"Timing-Allow-Origin": "*",
"x-ms-apihub-cached-response": "false",
"x-ms-apihub-obo": "false",
"Date": "Wed, 11 Dec 2024 15:40:53 GMT",
"Content-Type": "application/json",
"Content-Length": "577"
},
"body": {
"@odata.context": "https://graph.microsoft.com/beta/$metadata#teams('hogehoge')/tags('hogehoge')/members",
"@odata.count": 1,
"value": [
{
"id": "hogehoge==",
"displayName": "出戻り ガツオ",
"tenantId": "guid__",
"userId": "userid___"
}
]
}
}
このプロパティはTeams
のタグメンション
にも活用できます。
今回のシナリオではタグメンション
は活用しませんが、このID
がつかえるのか!くらいに見ていただければ幸いです!!
上記のアクションではTeams
のタグ
で管理するメンバーを取得します。
手間なので メンバーは私ひとりにしていますが、結果は複数人でも同じです。
Teams
のチーム
で管理しているタグ
を指定してください。
今回は勤怠管理
というチャネル
とタグ
がある想定で指定をしてみましょう。
動的な指定は可能ですが、本記事では取り扱いません。
2. 曜日の配列を作成する
勤怠の確認対象を月
~ 金
とします。祝日は考慮できていないフローです。
配列で下記のように日本の曜日を既定します。
※ 作成アクションです
createArray('月曜日', '火曜日', '水曜日', '木曜日', '金曜日')
ここで関数を使うかどうかは好みの問題ですね。
下記を直打ちしても動作します。
[
"月曜日",
"火曜日",
"水曜日",
"木曜日",
"金曜日"
]
3. 来週の月から金曜日を取得する
選択アクションで、Power Automate
フローからみて、来週の月曜日から金曜日を取得します。
@{range(0, 5)}
{
"date": @{convertTimeZone(
addDays(
utcNow(),
add(
sub(8, dayOfWeek(utcNow())),
item()
)
),
'UTC',
'Tokyo Standard Time',
'MM/dd'
)},
"weekday": @{outputs('Compose_曜日')?[item()]}
}
ややこしいところは、相対的に見た来週の月曜日から金曜日を取得する式です。
Power AutomateのdayOfWeek 関数は、日曜日であれば0
、月曜日は1
、火曜日2
という値を返します。
8
- 曜日を表す整数で、相対的に見た来週の月曜日を算出します。
関数がややこしいので順を追ってみていきます。
このような関数は一番階層が深いところから見ていくことが肝心です。
-
sub 関数で
8
から本日の曜日を表す整数を引く : こちらで来週の月曜日までの差分が判明します -
add 関数と曜日を表す整数を足す : 相対的に見た来週の
月曜日
から金曜日
を算出 - addDays 関数で差分となる日数を現在日時に対して足していきます
- convertTimeZone 関数で日本時間に日付を変えます。ついでにフォーマットを変えます。
まさしく関数芸ですね。
4. アダプティブカードを組み立てる
アダプティブカードのラジオボタンとなる選択肢を構築します。
先にアダプティブカードのキャプチャです。
この選択肢となる部分を選択 アクションで定義します。
アダプティブカードの選択肢
の箇所が配列のため、選択 (Map)で定義をしています。
そのほかにも選択アクションはデータ操作
テクニックの中でも最強のアクションです。
@{body('Map_来週のweekday')}
{
"type": "Input.ChoiceSet",
"id": "@item()?['date']",
"label": "@{item()?['date']} @{item()?['weekday']}",
"choices": [
{
"title": "出社",
"value": "office"
},
{
"title": "リモート",
"value": "remote"
},
{
"title": "休暇",
"value": "holiday"
}
],
"style": "expanded"
}
5. アダプティブカードを仕上げる
アダプティブカードのボディを組み立てます。
単純な見た目のため、内容は簡素です。
ラジオボタンの入力必須である制御はかけていません。
{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{
"type": "TextBlock",
"text": "勤務形態を選択してください",
"wrap": true,
"weight": "Bolder",
"size": "Medium"
},
{
"type": "TextBlock",
"text": "来週の予定を入力してください。",
"wrap": true,
"spacing": "None"
},
{
"type": "FactSet",
"facts": [
{
"title": "対象期間:",
"value": "@{first(body('Map_来週のweekday'))?['date']}(月) ~ @{last(body('Map_来週のweekday'))?['date']}(金)"
}
]
},
{
"type": "TextBlock",
"text": "日付ごとに出社またはリモートを選択してください。",
"wrap": true
},
{
"type": "Container",
"items": @{body('Map_items')}
}
],
"actions": [
{
"type": "Action.Submit",
"title": "送信"
}
]
}
ここからは各メンバーの勤務予定のヒアリング結果をまとめる工程に入ります。
6. メンバーにアダプティブカードを送信する🚀
6-1. アダプティブ カードを投稿して応答を待機する
繰り返し処理のConcurrency control
の制限をON
にします。
並列実行
でほかのメンバーの回答保留に対する待機を回避します。
メンバーの抜け漏れを回避したい
というニーズがあると思います。
そのようなときはメンション
が有効です。しかしアダプティブカードのアクションではIsAlert
プロパティがあるため、アナウンスを強調することができます。
こちらで代替しましょう。
6-2. 回答結果をマッピング
回答結果を日付と勤務予定でマッピングします。
こちらにより、配列で日付と勤務予定のペアに変換できます。
6-3. HTML テーブルに変換
上記の結果を投稿用にHTML テーブル
へ変換します。
単純に見やすいです。
6-4. 結果をTeams
に投稿する
テーブル形式でTeams
に投稿しましょう。
来週の勤務予定が出そろいましたね!
おわりに
勤務予定のヒアリングといったスモールな業務こそ業務削減時間もとい定量的な効果が大きく、データ操作のテクニックが身につく絶好の機会だったりします。
データ操作の腕を磨く絶好のドリルだったりしますので、ぜひチャレンジしてみてくださいね!
今回のフローを是非使いたいという場合は、思う存分パクッて現場に活かしてください!
それでは良いPower Lifeを!