もう二度と勤怠入れ忘れない（PowerAutomate→Teams→kintone）

# はじめに
よく勤怠入れ忘れて怒られてるまとっちです。
もう怒られたくないです。

## この記事の対象者
- 勤怠をよく忘れる人
- PowerAutomateからkintoneレコードを追加＋更新したい人
- PowerAutomateからの質問に対して、Teamsで入力・選択させたい人

## 背景
この１年間、月２～３のペースで勤怠忘れをしてました。
「次は気を付けます」って言って、次の日に勤怠忘れる人なので、システム化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/9356058d-99b6-9a3f-0c93-493b8868e7ad.png)

# 作ったシステム
## システムの流れ
① PowerAutomateで月～金の9:30に定期実行
② Teamsのアダプティブカードで本日のToDo入力と勤務形態を選択
③ kintoneの勤怠アプリにレコード追加＋ステータスを稼働中に更新
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/2bd2dff8-60a8-32a5-3372-e313f6fdc0b0.png)

## 詳細設定
:::note warn
以降に詳細設定を説明しておりますが、kintone勤怠アプリにレコードを登録するために、今回自分が作った仕様をベースにしているので、一部不要な項目もあります。
:::

新しいフローで、スケジュール済みクラウドフローを選んで、月～金9:30で設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/30cfb5ca-c1ea-1625-35f8-88d812b18ce5.png)

アクションで、Teamsアダプティブカードの月日表示の値・kintoneの出勤時刻の値を作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/81c16cfa-0905-b133-77dd-5734fcb45c64.png)


アクションで、Teamsアダプティブカードの曜日表示の値を作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/dac6d5df-da0c-e7c4-435b-540797f52b7f.png)

:::note info
<b>曜日の作り方</b>
前のアクションで作った日本時間を使って、下記の通り関数を設定する。
```
if(equals(dayOfWeek(body('日本時間')), 0), '日', 
    if(equals(dayOfWeek(body('日本時間')), 1), '月', 
        if(equals(dayOfWeek(body('日本時間')), 2), '火', 
            if(equals(dayOfWeek(body('日本時間')), 3), '水', 
                if(equals(dayOfWeek(body('日本時間')), 4), '木', 
                    if(equals(dayOfWeek(body('日本時間')), 5), '金', 
                        if(equals(dayOfWeek(body('日本時間')), 6), '土', '')
                    )
                )
            )
        )
    )
)
```
※ あとで気付いたのですが、アダプティブカードの選択結果のようにスイッチで曜日を条件分岐させた方が、視覚的に分かりやすいフローになるかなと思いました。
:::

アダプティブカードを投稿して応答を待機する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/27034cc0-37eb-b959-b503-79d4c5ef9064.png)

:::note info
<b>アダプティブカードの作り方</b>
JSONで作る必要があります。[アダプティブカードデザイナー](https://adaptivecards.io/designer/ "アダプティブカードデザイナー")にJSONを入力すれば、どんな感じのアダプティブカードが表示されるか見ることができます。

以下、自分が作ったアダプティブカードのJSONです。参考にしてください。
※前のアクションで作った月日と曜日を使ってます。
```
{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "size": "Medium",
            "weight": "Bolder",
            "text": "@{body('月日')}(@{variables('曜日')})の出勤"
        },
        {
            "type": "Image",
            "url": "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgucdpWPL4khu8aOKtZKvhl1WGJI6zM-18YBrkorHwaSpIoArZYTRYmKYdph2SD5IPgOzQzX_dsvO8k4GruTrpwwEYa5T0MZ0fze9vT3oa2bV0OxfmjRe3YOhtGQhOcBlAvuy4sD4H3hfBO/s400/skip_businessman.png",
            "size": "Large",
            "horizontalAlignment": "Center"
        },
        {
            "type": "Input.Text",
            "id": "userInput",
            "placeholder": "本日やることを記載",
            "isMultiline": true
        }
    ],
    "actions": [
        {
            "type": "Action.Submit",
            "title": "オフィス出勤",
            "data": { "workType": "Office" }
        },
        {
            "type": "Action.Submit",
            "title": "在宅勤務",
            "data": { "workType": "Home" }
        },
        {
            "type": "Action.Submit",
            "title": "働きたくないでござる",
            "data": { "workType": "Holiday" }
        }
    ],
    "horizontalAlignment": "Center",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.2"
}
```
:::

アダプティブカードの選択結果で条件分岐して、kintoneの勤務形態の値を作る。
勤務形態が休暇以外の時は、後続のkintone操作フローに進む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/df8832dd-d9c3-fca8-36dc-cc5458b7fddc.png)

kintoneの勤怠アプリにレコードを追加する（ここまでのアクションの値を使う）。
HTTPリクエストで、追加したレコードのステータスを稼働中に更新する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/c8176a1e-dfc6-28ac-b1c3-f2f9403e06a2.png)


:::note info
<b>kintoneレコード更新のHTTPリクエストの作り方</b>
詳しくは、[cybozu developer network「1 件のレコードのステータスを更新する」](https://cybozu.dev/ja/kintone/docs/rest-api/records/update-status/ "cybozu developer network：1 件のレコードのステータスを更新する")を見て設定をしてください。

以下、自分が作った設定です。参考にしてください。
```
URL：https://(ドメイン名).cybozu.com/k/v1/record/status.json
Method：PUT
Headers：X-Cybozu-API-Token　→　(勤怠アプリのAPIトークン)
　　　　　Content-Type　→　application/json
Body：
{
  "app": (アプリID),
  "id": @{outputs('アプリにレコードを追加')?['body/id']},
  "action": "(ステータス更新のアクション名)",
  "assignee": "(作業者に設定するユーザーのログイン名)"
}
```
:::

# できあがったシステム
最初にお見せしましたが、できあがったシステムはこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/2bd2dff8-60a8-32a5-3372-e313f6fdc0b0.png)

# おわりに
これでもう怒られなくて済みます。