4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

毎週末にチームの勤務場所を確認しあうTeamsテクニック

Last updated at Posted at 2024-12-11

はじめに

出社とテレワーク、せめてどちらかはわかりあいたい・・・!! そんなニーズはありませんか!?
職場によりけりだと思いますが、ハイブリッドワークであれば出社する日を合わせたり、当番制にしたり様々な事情があると思います。

そんな日常のお困りごとを解決するものが正にPower Automateの出番だと思います!
本日は上記のような状況を解決するTipsPower Automateフローをシェアしたいと思います!

関連するテクニックは

  • Teams タグメンバーを取得する
  • Teams タグメンションを取得するTips
  • 選択JSONといったデータ操作テクニック

です!

フローの全体像

まずはフローのキャプチャです。

image.png

エラーハンドリングや条件分岐は全くない状態。
ブラッシュアップの余地はありますが、一旦稼働するものを紹介しています。

繰り返し処理にしたり、トリガーは需要に合わせて自由に変更してください!

1. メンバーを取得する

今回のシナリオは Teamsの特定のタグでメンバーを管理する手法を一旦想定します。
Teamsコネクタのタグのメンバーを一覧表示するを使用しましょう!

image.png

戻り値で所属するメンバーの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. 曜日の配列を作成する

勤怠の確認対象を ~ とします。祝日は考慮できていないフローです。
配列で下記のように日本の曜日を既定します。

image.png

※ 作成アクションです

input
createArray('月曜日', '火曜日', '水曜日', '木曜日', '金曜日')

createArray 関数

ここで関数を使うかどうかは好みの問題ですね。
下記を直打ちしても動作します。

input
[
  "月曜日",
  "火曜日",
  "水曜日",
  "木曜日",
  "金曜日"
]

3. 来週の月から金曜日を取得する

選択アクションで、Power Automateフローからみて、来週の月曜日から金曜日を取得します。

image.png

From
@{range(0, 5)}

Map
{
  "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 - 曜日を表す整数で、相対的に見た来週の月曜日を算出します。

関数がややこしいので順を追ってみていきます。
このような関数は一番階層が深いところから見ていくことが肝心です。

  1. sub 関数8から本日の曜日を表す整数を引く : こちらで来週の月曜日までの差分が判明します
  2. add 関数と曜日を表す整数を足す : 相対的に見た来週の月曜日から金曜日を算出
  3. addDays 関数で差分となる日数を現在日時に対して足していきます
  4. convertTimeZone 関数で日本時間に日付を変えます。ついでにフォーマットを変えます。

まさしく関数芸ですね。

4. アダプティブカードを組み立てる

アダプティブカードのラジオボタンとなる選択肢を構築します。

先にアダプティブカードのキャプチャです。

image.png

この選択肢となる部分を選択 アクションで定義します。

アダプティブカードの選択肢の箇所が配列のため、選択 (Map)で定義をしています。
そのほかにも選択アクションはデータ操作テクニックの中でも最強のアクションです。

image.png

From
@{body('Map_来週のweekday')}
Map
{
  "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にします。
並列実行でほかのメンバーの回答保留に対する待機を回避します。

image.png

メンバーの抜け漏れを回避したい というニーズがあると思います。
そのようなときはメンションが有効です。しかしアダプティブカードのアクションではIsAlert プロパティがあるため、アナウンスを強調することができます。

image.png

こちらで代替しましょう。

6-2. 回答結果をマッピング

回答結果を日付と勤務予定でマッピングします。
こちらにより、配列で日付と勤務予定のペアに変換できます。

image.png

6-3. HTML テーブルに変換

上記の結果を投稿用にHTML テーブルへ変換します。
単純に見やすいです。

image.png

6-4. 結果をTeamsに投稿する

テーブル形式でTeamsに投稿しましょう。
来週の勤務予定が出そろいましたね!

image.png

image.png

おわりに

勤務予定のヒアリングといったスモールな業務こそ業務削減時間もとい定量的な効果が大きく、データ操作のテクニックが身につく絶好の機会だったりします。

データ操作の腕を磨く絶好のドリルだったりしますので、ぜひチャレンジしてみてくださいね!

今回のフローを是非使いたいという場合は、思う存分パクッて現場に活かしてください!

それでは良いPower Lifeを!

4
2
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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?