Teamsからkintoneに勤怠登録しよう

## はじめに

今回は Teams から kintone に勤怠登録をしてみようと思います。
具体的には、Teams から送ったメッセージを分解して、 kintone の任意のフィールドに登録するという処理を Microsoft Power Automate を使って実現していきます。

## 準備するもの

準備するものは以下の通りです。

- kintone のアプリ
  - 「レコード追加」権限のある API トークン（詳しくは kintone ヘルプの[API トークンを生成する](https://jp.cybozu.help/k/ja/user/app_settings/api_token.html)を参照）
- Microsoft Teams
- Microsoft Power Automate

## kintone の設定

まず、kintone にアプリを作ります。
今回は勤怠登録をイメージしてアプリを作成しました。
用意したフィールドは以下の通りです。

| フィールド名 | フィールドコード | フィールドの種類         |
| ------------ | ---------------- | ------------------------ |
| 日時         | 日時             | 日時フィールド           |
| 氏名　　     | 氏名             | 文字列（１行）フィールド |
| 勤務場所     | 勤務場所         | 文字列（１行）フィールド |

<img width="529" alt="kintone field.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/31facb45-66e2-9831-4fd6-17e004bb169b.png">

通信には、API トークンを使用します。
API トークンの詳しい設定方法は、kintone ヘルプの[API トークンを生成する](https://jp.cybozu.help/k/ja/user/app_settings/api_token.html)を参照してください。
API トークンのアクセス権は「レコード追加」にチェックを入れてください。

## Microsoft Power Automate の設定

Microsoft Power Automate を設定していきます。全体の流れは以下の通りです。

<img width="908" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/cbef7950-dcf9-523e-d794-f34f7349434a.png">

### Microsoft Teams からメッセージを送信する

まず、Microsoft Teams からメッセージを受け取ったときの設定をします。
今回はテスト用に、「連携動作確認用」チームに「レコード登録」チャネルを作成しました。

![02_teams_trigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/3b486a2b-efb0-70f0-f813-e75560d77ecd.png)

以下のような形でメッセージを送信することを想定して、実装していきます。

```
コマンド名 {フィールド名}：{String}
```

実際に送信するメッセージは以下の通りです。
![teams_message.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/7b79374a-081a-efbf-177e-a4568de1d500.png)

### HTML をテキストに変換する

Microsoft Power Automate では、Microsoft Teams からのメッセージを HTML 形式で受け取ります。
そのままでは、文字列として処理できないため、「Html to Text」で文字列に変換します。
設定方法は以下のように、Content に「メッセージ 本文 コンテンツ」を追加するだけです。
![03_html_to_text.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/ffe8a68c-8e52-4c9f-65c8-b503642fcaf3.png)

#### 変数を初期化する(command)

文字列に変換した後は、文字列を「コマンド（command）」と「HTTP リクエスト送信用のボディ(requestBody)」に分解していきます。
はじめにコマンド部分を切り出してみましょう。「変数を初期化する」で文字列を分解していきます。

<img width="596" alt="04_command.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/6c0395f7-5fce-be4a-7145-a99c777cff9a.png">

「値」の部分は以下のように設定します。
![04_command_fx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/33ca5e8b-71cc-8056-3565-509f8aca2a8a.png)

画像だとわかりづらいですが、split の第二引数には半角スペースを渡しています。

```
split(body('Html_to_text'),'{ }')
```

受け取った文字列の半角スペースより前の部分を切り出すという式です。
切り出した文字列は配列に格納されます。
上記の式だと、配列の１番目にコマンド、２番目にそれ以降の文字列が格納されます。

#### 変数を初期化する(requestBody)

続いて、内容の部分を切り出していきましょう。
「変数を初期化する」の部分は先ほどと同じように設定します。
<img width="597" alt="05_body.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/502951ae-0aff-5796-b937-d62b3bf84f65.png">

先ほど、配列の 2 番目に格納したテキストは以下のような形になっています。

```
"勤務場所:自宅"
```

フィールド名と値が「：（カンマ）」で区切られている状態なので、こちらも先ほどと同様に
「：（カンマ）」の前後で文字列を切り離して、それぞれ配列に格納します。
![05_body_fx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/b41b45fc-27d3-dd57-8e2a-cf39452d1d2b.png)

### 条件分岐（コマンドの判定）

次は、コマンドの判定です。
送信されたメッセージのコマンドが「勤務開始」であれば kintone にレコード登録を行う、というように分岐させたいと思います。
「はいの場合」は HTTP リクエストを送信、「いいえの場合」は Microsoft Teams のメッセージにエラーメッセージを返信する、という条件で設定していきましょう。
![06_branch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/f7a13c03-5e2e-269c-2b10-7b6de377d9db.png)

条件は以下のように設定します。
![6_branch_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/08524628-7cca-4efd-493f-3bc6f45b39d5.png)

条件分岐の式は、[変数の初期化（command）](#変数を初期化するcommand)で作成した配列の１番目のコマンドを比較するように設定します。
![06_branch_fx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/02d143aa-932c-38a1-b5e9-acc5cf543338.png)

#### はいの場合

「はいの場合」には、HTTP リクエストを送信します。
詳しい kintone API の POST メソッドの仕様については、[こちらの記事](https://developer.cybozu.io/hc/ja/articles/202166160)を参考にしてください。
![07_yes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/b9dc4f9f-9b3e-362b-b41a-e3c4904f95e9.png)

リクエストの「本文」にはリクエストボディを記載します。

```JSON
{
  "app": {"アプリID"},
  "record": {
    "日時": {
      "value": {"メッセージ CreateDateTime"}
    },
    "氏名": {
      "value": {"メッセージ from ユーザー displayName"}
    },
   variables('requestBody')[0]: {
      "value": {variables('requestBody')[１]}
    }
  }
}
```

「日時」、および「氏名」フィールドには、「動的なコンテンツを追加」から「メッセージ CreateDateTime」と「メッセージ from ユーザー displayName」をそれぞれ設定します。
「勤務場所」には、「動的なコンテンツを追加」から「式」を追加し、先ほど変作成した配列の値を代入します。

#### いいえの場合

コマンドが「勤務開始」以外だった際には、Microsoft Teams のメッセージに返信する形でエラーメッセージを送信します。
「メッセージへの返信の投稿（V2）」を使用して、「動的なコンテンツ」から「メッセージ ID」を指定します。
そして、「返信」には、返信したいメッセージの内容を追加します。
![07_no.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/23a20b18-16f9-fdc7-2cd7-e3a831dcebf9.png)

## 動作確認

実際に動作確認をしてみます。
Power Automate の右上にある、「テスト」から「トリガーアクションを実行する」を選択します。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/ad4c16f7-658b-b6b0-6373-e79b8fb23197.png)
![test_action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/fd31c2eb-4f3b-3ee2-ed63-0e62b5f7a64d.png)

実際に下記のメッセージを送信してみると、kintone に内容が登録されています。

```
勤務開始 勤務場所:自宅
```

![teams_message.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/a565d241-45d5-6d6a-fb08-ee44248bd94a.png)
![kintone record.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/b72f477d-bcb9-d351-b0f8-bcc5ff7fd762.png)

エラーの確認も行います。
先ほどのコマンドの前に「/」を入れてみます。

```
/勤務開始 勤務場所:自宅
```

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/cd5ed314-d180-5854-0816-20f8feb9ca72.png)

すると、メッセージにエラーメッセージが返信されました。

## 最後に

今回は、「Microsoft Teams から kintone に勤怠登録する」というしシナリオを想定して、Microsoft Power Automate を使った連携方法を検証してみました。
実際に運用するには、足りない点も多くあると思いますが、簡単な内容であれば Microsoft Teams から手軽にレコード登録を実装できると思います。