はじめに
ハイブリッドワークで、
とりあえず朝はTeamsで挨拶しようぜ! という
会社もあるのではないでしょうか。
- 打刻を打つ
- Teamsで連絡する
なに、この二重作業
本当に嫌なので自動化チャレンジ
実現したいこと
- 「おはようございます。勤務開始します。本日は出社しています。」
- 「勤務終了します。」
とりあえずこのパターンで考えます。
「打刻」もできたらいいのですが、APIの領域ですね。
一旦割愛です。
Power Automateで出来ること
Power Autmateはモバイルアプリが用意されています。
- Android
- iOS
- Windows Phone
モバイルアプリの画面
キャッチーなボタンですね。
私はiphoneユーザーなのでショートカット
というiOSの機能も交えると、よりCool。
平日の朝、家で大体始める時間帯か、会社についたときにPower Automateのアプリを開くショートカットを仕込みます。
アプリを探して立ち上げるのも手間ですからね。
必要な情報
さて固定的な部分はなんでしょうか?
整理します。
-
勤務開始の場合
- 「おはようございます。勤務開始します。」
- 「お疲れ様です。勤務開始します。」
-
勤務終了の場合
- 「お疲れ様です。勤務終了します。」
とします。
本日は早めに失礼します。など個別の時は手作業。
そして上記に
- 「在宅勤務です。」
- 「出社しています。」
を追加します。
条件を整理する
- 勤務開始について
- おはようございます。 - 5:00 ~ 11:00開始の場合
- お疲れ様です。 - 上記以外
なるべく条件はシンプルにしましょう。
- 勤務終了について
- こちらは条件分岐がなし。
こころを込めたメッセージはしっかりと入力した方が良いでしょう。
- 勤務場所について(在宅 or 出社)
- 現在地が自宅の場合、在宅
- 勤務先の場合、出社
という分岐ができます。他のワーキングスペースをよく使う場合は、その情報に応じた分岐が必要ですね。
想定する状況
Teamsにおける勤怠に関する共有は、下記の状況と想定して書きます。
- チーム - チャネル
グループチャットではない想定ですね。
雑ですが「gatsuo」というチームに「勤怠」というチャネルを設けます。
このケースの場合、一つのメッセージに、Replyする形で最初の人からメッセージが積みあがってきますね。
- その日に既にメッセージは存在するか
- リプライする場合はIdは何か
これらの情報が必要がです。
ここで登場するアクションが
Teams コネクタのメッセージを取得する
です。
チャネルのメッセージのオブジェクトを格納した配列が取得できます。
ここからIDと作られた時間を特定します。
id
とcreateTime
から必要な情報が確認できますね。
- 当日と同じ場合は、私は最初に投稿する人 ※タイムゾーンの課題はあります
- そうでない場合は、リプライする人
と見分けられます。
ここで、最初の条件分岐
が割り出せます。
最新の投稿を判断するには、first関数または添え字インデックス
で、
最初のオブジェクトを取得する
必要があります。
first(outputs('メッセージを取得します')?['body/value'])
outputs('メッセージを取得します')['body/value'][0]
さらにid
やcreateDateTime
を取得する場合は、
// id
first(outputs('メッセージを取得します')?['body/value'])?['id']
// createDateTime
first(outputs('メッセージを取得します')?['body/value'])?['createdDateTime']
// id
outputs('メッセージを取得します')['body/value'][0]['id']
// createDateTime
outputs('メッセージを取得します')['body/value'][0]['createdDateTime']
これで文字列でタイムスタンプが取得できます。
が、案の定タイムゾーンの変換は、必須ですので
アクションの場合は、
もしくは
- 関数の場合
convertTimezone(outputs('メッセージを取得します')['body/value'][0]['createdDateTime'], 'UTC', 'Tokyo Standard Time')
といった対策が必要になります。
ボタン トリガー トークンについて
さて、Teamsのメッセージの情報もさることながら、同時にモバイルアプリでボタンを押した際にも、押された時間や押された場所など情報が必要になります。
何と驚くことに、ボタン トリガー トークンで得られる情報はとても多いです。
パラメーター | 説明 |
---|---|
市区町村 | フローを実行しているデバイスが位置する市区町村。 |
国/地域 | フローを実行しているデバイスが位置する国/地域。 |
完全な住所 | フローを実行しているデバイスが位置する完全な住所。 |
緯度 | フローを実行しているデバイスが位置する緯度。 |
経度 | フローを実行しているデバイスが位置する経度。 |
PostalCode | フローを実行しているデバイスが位置する郵便番号。 |
都道府県 | フローを実行しているデバイスが位置する都道府県。 |
住所 | フローを実行しているデバイスが位置する番地。 |
タイムスタンプ | フローを実行しているデバイスが位置する地域の時間。 |
日付 | フローを実行しているデバイスが位置する地域の日付。 |
ユーザー名 | フローを実行しているデバイスにサインインしているユーザーのユーザー名。 |
ユーザーのメール | フローを実行しているデバイスにサインインしているユーザーのメール アドレス。 |
上記learnより引用
ここから完全な住所
とタイムスタンプ
を使うことにします。
なおこの部分でも、時間についてはタイム ゾーンの変換
のアクション or 関数による処理は必要ですので
ご注意ください。
フロー
さて、材料が揃ったので下記の2つのフローを作ることにします
- 勤務を開始するときのフロー
- 勤務を終了するときのフロー
1. 勤務を開始するときのフロー
ざっと流れは下記の通りとなります。
- 勤務先と自宅の住所を変数として格納する
- ボタンが押されたタイムスタンプを取得する
- 【分岐】タイムスタンプから時間を抜き出し、
「おはようございます。」「お疲れ様です。」の算出する - 投稿するメッセージを確定し、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. ボタンが押されたタイムスタンプを取得する
このタイミングで必要になるのは、タイムゾーンの変換です。
例はこちら。
前述の通り、関数でも全く問題ないです。
ただアクションの場合、メモなども残せたりと便利です。
ラウンド トリック日時パターンは文字列による、当日の投稿か、否かで仕様しています。
具体的には
substring(body('タイム_ゾーンの変換'), 0, 10)
上記のように、文字列で日付の比較用に利用しています。
Excelでいうleft関数
のような挙動ですね。
3. 【分岐】タイムスタンプから時間を抜き出し、「おはようございます。」「お疲れ様です。」の算出する
さて、ここでIF文の必要があります。Simpleに越したことはありません。
タイムスタンプを例に挙げます。
int(formatDateTime(body('タイム_ゾーンの変換'),'HH'))
タイムスタンプから時間を抜き出しています。
hh
の場合、午前・午後の判断が数値で判断できないため、HH
で対応しましょう。
こちらで24時間による表現ができます。
この関数との組み合わせで、
If文で、5時以上で11時以下の場合という条件が設定できますね。
- trueの場合、「おはようございます。」
- falseの場合は、「お疲れ様です。」
という文字列の作成をしましょう。
作成を採用しているのは、ただ単に楽だからです
4. 投稿するメッセージを確定し、Teamsに投稿する
同日に投稿した履歴がない場合は、自分が最初の投稿者となります。
メッセージを取得します
アクションとutcNow()
で比較しましょう。
なおutcNow()
もタイムゾーンの変換が必要なのでアクション
or 関数
で対応しちゃってください。
一旦は関数対応を載せます。
反対に、履歴がある場合は、応答
のアクションを実施します。
substring(body('タイム_ゾーンの変換_ボタンが押された時間'),0,10)
substring(variables('messageTime'),0,10)
上記の比較です。
役者が揃いました。
全体像はコチラ!
完成系
といったところです。変数の宣言が多い分冗長になりますね。
キレイに作りたいものです。
ただ自分のやりたくないを駆逐していく感覚は、気持ちいいコトこの上ないのでShareです!
是非トライしてみましょ~!
See you later♪