36
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

もはや朝のTeamsの挨拶すら怠い人向けのPower Automateのすゝめ

Last updated at Posted at 2023-06-02

はじめに

ハイブリッドワークで、
とりあえず朝はTeamsで挨拶しようぜ! という
会社もあるのではないでしょうか。

  • 打刻を打つ
  • Teamsで連絡する

なに、この二重作業
本当に嫌なので自動化チャレンジ

実現したいこと

Teamsでの挨拶を手軽にする
image.png

  • 「おはようございます。勤務開始します。本日は出社しています。」
  • 「勤務終了します。」

とりあえずこのパターンで考えます。

「打刻」もできたらいいのですが、APIの領域ですね。
一旦割愛です。

Power Automateで出来ること

Power Autmateはモバイルアプリが用意されています。

  • Android

  • iOS

  • Windows Phone

モバイルアプリの画面

image.png

キャッチーなボタンですね。
私はiphoneユーザーなのでショートカットというiOSの機能も交えると、よりCool。

平日の朝、家で大体始める時間帯か、会社についたときにPower Automateのアプリを開くショートカットを仕込みます。
アプリを探して立ち上げるのも手間ですからね。

必要な情報

さて固定的な部分はなんでしょうか?
整理します。

  • 勤務開始の場合

    • 「おはようございます。勤務開始します。」
    • 「お疲れ様です。勤務開始します。」
  • 勤務終了の場合

    • 「お疲れ様です。勤務終了します。」

とします。
本日は早めに失礼します。など個別の時は手作業。

そして上記に

  • 「在宅勤務です。」
  • 「出社しています。」

を追加します。

条件を整理する

  • 勤務開始について
    • おはようございます。 - 5:00 ~ 11:00開始の場合
    • お疲れ様です。 - 上記以外

なるべく条件はシンプルにしましょう。

  • 勤務終了について
    • こちらは条件分岐がなし。

こころを込めたメッセージはしっかりと入力した方が良いでしょう。

  • 勤務場所について(在宅 or 出社)
    • 現在地が自宅の場合、在宅
    • 勤務先の場合、出社

という分岐ができます。他のワーキングスペースをよく使う場合は、その情報に応じた分岐が必要ですね。

想定する状況

Teamsにおける勤怠に関する共有は、下記の状況と想定して書きます。

  • チーム - チャネル

グループチャットではない想定ですね。
雑ですが「gatsuo」というチームに「勤怠」というチャネルを設けます。

image.png

このケースの場合、一つのメッセージに、Replyする形で最初の人からメッセージが積みあがってきますね。

  • その日に既にメッセージは存在するか
  • リプライする場合はIdは何か

これらの情報が必要がです。

ここで登場するアクションが
Teams コネクタのメッセージを取得する
です。

チャネルのメッセージのオブジェクトを格納した配列が取得できます。
ここからID作られた時間を特定します。

image.png
image.png

idcreateTimeから必要な情報が確認できますね。

image.png

  • 当日と同じ場合は、私は最初に投稿する人 ※タイムゾーンの課題はあります
  • そうでない場合は、リプライする人

と見分けられます。

ここで、最初の条件分岐が割り出せます。

最新の投稿を判断するには、first関数または添え字インデックスで、
最初のオブジェクトを取得する必要があります。

関数の場合
first(outputs('メッセージを取得します')?['body/value'])
インデックスで指定
outputs('メッセージを取得します')['body/value'][0]

さらにidcreateDateTimeを取得する場合は、

関数の場合
// id
first(outputs('メッセージを取得します')?['body/value'])?['id']

// createDateTime
first(outputs('メッセージを取得します')?['body/value'])?['createdDateTime']
インデックスで指定
// id
outputs('メッセージを取得します')['body/value'][0]['id']
// createDateTime
outputs('メッセージを取得します')['body/value'][0]['createdDateTime']

これで文字列でタイムスタンプが取得できます。

が、案の定タイムゾーンの変換は、必須ですので

アクションの場合は、

  • タイム ゾーンの変換
    image.png

もしくは

  • 関数の場合
convertTimezone(outputs('メッセージを取得します')['body/value'][0]['createdDateTime'], 'UTC', 'Tokyo Standard Time')

といった対策が必要になります。

ボタン トリガー トークンについて

さて、Teamsのメッセージの情報もさることながら、同時にモバイルアプリでボタンを押した際にも、押された時間や押された場所など情報が必要になります。

何と驚くことに、ボタン トリガー トークンで得られる情報はとても多いです。

パラメーター 説明
市区町村 フローを実行しているデバイスが位置する市区町村。
国/地域 フローを実行しているデバイスが位置する国/地域。
完全な住所 フローを実行しているデバイスが位置する完全な住所。
緯度 フローを実行しているデバイスが位置する緯度。
経度 フローを実行しているデバイスが位置する経度。
PostalCode フローを実行しているデバイスが位置する郵便番号。
都道府県 フローを実行しているデバイスが位置する都道府県。
住所 フローを実行しているデバイスが位置する番地。
タイムスタンプ フローを実行しているデバイスが位置する地域の時間。
日付 フローを実行しているデバイスが位置する地域の日付。
ユーザー名 フローを実行しているデバイスにサインインしているユーザーのユーザー名。
ユーザーのメール フローを実行しているデバイスにサインインしているユーザーのメール アドレス。

上記learnより引用

ここから完全な住所タイムスタンプを使うことにします。

なおこの部分でも、時間についてはタイム ゾーンの変換のアクション or 関数による処理は必要ですので
ご注意ください。

フロー

さて、材料が揃ったので下記の2つのフローを作ることにします

  1. 勤務を開始するときのフロー
  2. 勤務を終了するときのフロー

1. 勤務を開始するときのフロー

ざっと流れは下記の通りとなります。

  1. 勤務先と自宅の住所を変数として格納する
  2. ボタンが押されたタイムスタンプを取得する
  3. 【分岐】タイムスタンプから時間を抜き出し、
    「おはようございます。」「お疲れ様です。」の算出する
  4. 投稿するメッセージを確定し、Teamsに投稿する

順番に見ていきましょう

1. 勤務先と自宅の住所を変数として格納する

個人情報なので、扱いに注意ですね。
私の情報もダミーでいきます。

住所情報がボタン トリガー トークンで、どうとれるか
サンプルは下記のとおりです。 ※東京で飯田橋の例

住所

Iidabashi, Chiyoda Ku, Tokyo, 102-0072, Japan

どう取得できるか、是非試してみてください。

私の考えですが、複数条件で値を割り出す場合は、
Key:Valueのペアになっているオブジェクトが便利です。

ですので、まずは変数を初期化するで勤務先と自宅の住所、
そして、それぞれに応じた文言をValueとして格納します。

なお繰り返しですが、情報はダミーです。

場所による文章の選択
{
    "Iidabashi, Chiyoda Ku, Tokyo, 102-0072, Japan" : "出社しています。",
    "GatsuoChou, Maji City, Sea, XXX-XXXX, Japan" : "在宅勤務です。"
}

この設定によって、変数[現在地]で文言が決定できます。

2. ボタンが押されたタイムスタンプを取得する

このタイミングで必要になるのは、タイムゾーンの変換です。
例はこちら。

image.png

前述の通り、関数でも全く問題ないです。
ただアクションの場合、メモなども残せたりと便利です。

ラウンド トリック日時パターンは文字列による、当日の投稿か、否かで仕様しています。
具体的には

日時の取得
substring(body('タイム_ゾーンの変換'), 0, 10)

上記のように、文字列で日付の比較用に利用しています。
Excelでいうleft関数のような挙動ですね。

3. 【分岐】タイムスタンプから時間を抜き出し、「おはようございます。」「お疲れ様です。」の算出する

さて、ここでIF文の必要があります。Simpleに越したことはありません。

タイムスタンプを例に挙げます。

時間を数値として取得する関数
int(formatDateTime(body('タイム_ゾーンの変換'),'HH'))

タイムスタンプから時間を抜き出しています。
hhの場合、午前・午後の判断が数値で判断できないため、HHで対応しましょう。
こちらで24時間による表現ができます。

この関数との組み合わせで、
If文で、5時以上で11時以下の場合という条件が設定できますね。

  • trueの場合、「おはようございます。」
  • falseの場合は、「お疲れ様です。」

という文字列の作成をしましょう。

image.png

  • 全体像
    image.png

作成を採用しているのは、ただ単に楽だからです

4. 投稿するメッセージを確定し、Teamsに投稿する

同日に投稿した履歴がない場合は、自分が最初の投稿者となります。

メッセージを取得しますアクションとutcNow()で比較しましょう。
なおutcNow()もタイムゾーンの変換が必要なのでアクション or 関数で対応しちゃってください。

一旦は関数対応を載せます。

  • チャットまたはチャネルでメッセージを投稿する
    image.png

反対に、履歴がある場合は、応答のアクションを実施します。

  • チャネル内のメッセージで応答します
    image.png
substring(body('タイム_ゾーンの変換_ボタンが押された時間'),0,10)

substring(variables('messageTime'),0,10)

上記の比較です。

  • 初回の場合
    image.png

  • それ以外の場合
    image.png

役者が揃いました。
全体像はコチラ!

完成系

image.png

image.png

image.png

といったところです。変数の宣言が多い分冗長になりますね。
キレイに作りたいものです。

ただ自分のやりたくないを駆逐していく感覚は、気持ちいいコトこの上ないのでShareです!

是非トライしてみましょ~!

See you later♪

36
21
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
36
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?