kintone で Microsoft Teams のチームを管理してみた

[kintone 2 Advent Calendar](https://qiita.com/advent-calendar/2020/kintone2) の 23 日目の記事です🎄

## はじめに

こんにちは。
去年は眺めていただけだった kintone Advent Calendar ですが、今年は思い切って登録してみました！
[ちょっと前に書いた記事](https://qiita.com/smgpd/items/5d2875c1cb95a0951521)に引き続き、Microsoft Teams との連携記事です。
今回は kintone から Microsoft Teams のチームを作成してみようと思います。

## 利用イメージ

たとえば、新しいプロジェクトが始まったときや、Cybozu Days に向けた作業用の一時的なチームを作成したいとき。
ゼロからチームやチャネルを作成して、何十人ものメンバーを招待して......というのは思ったよりも手間のかかる作業です。

そこで、kintone でプロセス管理を回してチームを作成できるようにしてみました。
ある程度の雛形を用意しておき、レコードの再利用などを活用すると、同じ構成のチームをすぐ簡単に作成することができるようになります。

## 準備するもの

- kintone のアプリ
- Microsoft Teams
- Microsoft Power Automate

## kintone の設定
### フィールドの設定

最初は kintone のアプリを作ります。
「チャネル名」と「チャネルの説明」はそれぞれ「channels」というテーブルに、「メンバー」と「所有者」はそれぞれ「members」 というテーブルに配置します。

| フィールド名   | フィールドコード   | フィールドの種類           | 必須 |
| -------------- | ------------------ | -------------------------- | ---- |
| チーム名       | teamName           | 文字列（１行）フィールド   | 必須 |
| 公開設定       | visibility         | ラジオボタン               | 必須 |
| チーム ID      | teamID             | 文字列（１行）フィールド   | -    |
| 説明           | teamDescription    | 文字列（複数行）フィールド | -    |
| チャネル名     | chanelName         | 文字列（１行）フィールド   | 必須 |
| チャネルの説明 | channelDescription | 文字列（複数行）フィールド | -    |
| メールアドレス | emailAddress       | リンクフィールド           | 必須 |
| 所有者         | owner              | ラジオボタン               | 必須 |

実際のレコードの入力イメージはこんな感じです。

![kintone_record.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/88ff2fb6-2522-f14d-5f77-f06b668571ac.png)

### プロセス管理の設定

今回はトリガーにプロセス管理を使用するので、簡単にプロセスを設定します。

![kintone_process.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/4dada170-21b3-37ee-dfe2-19342951b43c.png)

## Microsoft Power Automate の設定

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

![overall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/f0535e6e-c431-811d-88ed-196b6a37112d.png)

### kintone のトリガーを設定する

今回のカスタマイズでは、プロセス管理のアクションが実行されたときをトリガーにします。
フローの作成時に「プロセス管理の状態が更新されたとき」を選択し、アプリ ID を指定します。

![kintone_process_action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/26e3c656-5649-c978-c9fc-5ddc095cbe6e.png)

初回は認証画面が表示されるので、kintone のユーザー名とパスワードを入力します。
外部サービスとの接続設定は kintone ヘルプの「 [外部サービスとの連携を許可する](https://jp.cybozu.help/general/ja/admin/list_externalservices/oauth.html) 」を参考にしてください。

### チームの作成

最初は「チームの作成」アクションを追加します。
パラメータは簡単です。アプリの「チーム名」フィールドと「説明」フィールドの情報をそのまま指定します。

![create_team_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/1904e2a2-9d80-db6a-e4f3-3634245dfb38.png)

ここで「詳細オプションを表示する」から「可視性」の設定も行いましょう。
「カスタム値を入力」から「公開設定」フィールドを選択します。

![create_team_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/1393dff2-727a-63ed-4dea-342cc5692218.png)

### メンバーとチャネルの追加

#### メンバーの追加（addMember）

ここでは、サブテーブルに設定したメンバーの情報を順番に登録していきます。
「Apply to each」のアクションを選択し、名前を「addMember」に変更します。
そして、「以前の手順から出力を選択」の「式」に以下のように値を設定します。

```JavaScript
triggerOutputs()?['body/record/members/value']
```

![addMember_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/601c29ae-7349-cfc1-45ae-6b0b68703269.png)

続いて、「チームにメンバーを追加する」のアクション追加します。
「チーム」には「動的なコンテンツ」から「新しいチーム ID」を指定します。
「チームに追加するユーザの ADD ID」には、ユーザーが M365 で使用しているメールアドレスを指定したいので、「式」に以下のように入力します。

```JavaScript
items('addMember').value.emailAddress.value
```

![addMember_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/f0573089-2557-c9de-ea69-c3422b4c3090.png)

「新しく追加されたユーザーがチームの所有者である必要があります$\tiny{（どういう項目名やねん）}$」 には、真偽値で管理者かどうかを設定します。「カスタム値を入力」から「式」を開いて次のように指定します。

```JavaScript
items('addMember').value.owner.value
```

![addMember_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/004d8870-98a6-4ee4-e2b8-f3d8e76a4934.png)

ちょっとゴチャゴチャしてきたので JavaScript のコードに置き換えて考えてみましょう。
「以前の手順から出力を選択」で設定した部分は、forEach 文を実行する対象の配列にあたります。
body は event に置き換えるとわかりやすいと思います。

```JavaScript
var addMember = event.record.members.value;

addMember.forEach(function(items) {
  var emailAddress = items.value.emailAddress.value; // 「チームに追加するユーザの ADD ID」に指定した値
  var owner = items.value.owner.value; // 「新しく追加されたユーザーがチームの所有者である必要があります」に指定した値

  console.log(emailAddress); // xxxx@email.com
  console.log(owner); // true または false
});
```

#### チャネルの追加（createChannel）

チームにメンバーを追加するのと同時に、チャネルも作成しましょう。
「並行分岐を追加」を選択し、「Apply to each」のアクションを追加します。
名前は「createChannel」に変更します。

![add_parallel_action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/1bebfae8-de2b-15e2-548d-41ffa6ea667d.png)

「以前の手順から出力を選択」には先ほどと同時の手順で以下の値を設定してください。

```JavaScript
triggerOutputs()?['body/record/channels/value']
```

![create_channel_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/61fff125-91a7-c268-17f7-c1a4c018bdd0.png)

「チャンネルを作成します」のアクションを選択して、以下のように設定しましょう。

![create_channel_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/e1bc7030-2457-8f20-151a-f765f3a911c0.png)

「表示名」には、以下の式を設定します。

```JavaScript
items('createChannel').value.channelName.value
```

「説明」には、以下の式を設定します。

```JavaScript
items('createChannel').value.channelDescription.value
```

#### kintone アプリのレコードの更新

このアクションはなくても良いのですが、何かしらの情報が返ってきた方が kintone もうれしいのではないかと思い設定しました。
「アプリ内のレコードを更新」のアクションで以下のように設定を行います。
（後述しますが、このチーム ID を利用すればチームのアーカイブなども kintone から行えるようになります）

![put_record.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/9c35f9e4-6a28-25a3-79f9-ec3e7949499f.png)

## 動作確認

プロセス管理を進めると、kintone のレコードに指定した値でチームを作成することができます。
チーム名やチームの説明、そしてユーザーごとの役割もしっかり反映されています！
![result_team.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/cc0cc644-75b0-8391-ea7b-06bc3065cd46.jpeg)

チャネル名や説明文もばっちり反映されていますね。
![result_channel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554834/0b97d3cf-0c4c-55ba-8444-78f50e2363cf.png)

## さいごに

ほんとはかっこよく Microsoft Graph API を使って実装したかったのですが、思ったより手こずってしまって Microsoft Power Automate の力を借りることにしました。
簡単な連携ならローコードであっという間に作成できるのでオススメです。

Microsoft Power Automate では指定できるパラメータが限られていますが、[Teams の API](https://docs.microsoft.com/ja-jp/graph/api/resources/teams-api-overview?view=graph-rest-1.0) を使用すれば、以下のような複雑な処理も実装できると思います。

 - チームの情報を更新する
 - チームにあらかじめインストールするアプリを指定する
 - 作業が終わったあとにチームをアーカイブする 

いろんな製品と kintone をつなげることで、まだまだ作業の効率化とチームワークを高めることができそうですね。来年も機会があれば記事を書いていきたいと思います。

みなさま良いクリスマスをお過ごしください🤱