【kintone】レコード作成時に自動で任意の作業者を設定する

## はじめに
### 本記事のレベル感
以下ができる・わかると進めやすいと思います。

- JavaScriptの基本構文がわかる
- kintoneでアプリを作成できる
- kintoneの標準設定ができる
- kintoneカスタマイズを少しだけ理解できる 

とはいえやってみるなかで、できるようになることも多いと思うので参考になれば幸いです。

### kintoneのプロセス管理とは
kintoneにはプロセス管理の機能があります。[詳しくはKintone ヘルプ参照](https://jp.cybozu.help/k/ja/user/app_settings/process/whatsprocess.html)
簡単に説明すると各アクション（ステータス）ごとに作業者を設定でき、レコードごとに誰が何をしたかを管理できるものです。利用イメージとしては、申請・承認作業で使われることが多いと思います。

### 最初のステータスに設定できる作業者について
最初のステータスの時に設定できる作業者は以下になっています。

- 作業者を設定しない
- 作成者

標準機能では作業者を作成者以外を自動で設定することができません。
※レコードの作成後に手動で作業者を設定することは可能です。

そのため作業者を作成者以外で自動で設定する場合にはカスタマイズが必要になります。

### 今回の想定動作概要
アプリ内にユーザー選択を用意します。
新規レコード作成時にユーザー選択で選択された任意のユーザーを
最初のステータスの作業者に設定をする。


## 環境準備
今回はアプリに以下の設定をしています。
### kintone フォーム設定
フォームから「ユーザー選択」フィールドを配置します。
配置したらフィールドに以下の設定をします。

- フィールド名：「初期作業者」
- フィールドコード：「初期作業者」
- 「必須項目にする」：　ON

<img width="500" alt="ユーザー選択" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959394/62baf3fe-82a7-9e9f-d084-f27c9c7bd3a1.jpeg">



### kintone プロセス管理設定
一般設定のプロセス管理を設定します。

1. プロセス管理の有効化にチェックします。
1. ステータスを二つ用意します。今回は「未処理」と「完了」とします。
1. ステータスごとの設定をします。今回はカスタマイズで作業者を設定するので「作業者を設定しない」を設定します。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959394/01b62530-9d4f-5f1a-344f-c4a07e62f544.jpeg)


## Javascriptカスタマイズ
Javascriptでカスタマイズします。
JavascriptをPC用のJavaScriptファイルに設定してください。
以下のコードを利用します。


```Javascript:sample.js
(function() {
    "use strict";

    //新規作成の保存成功時イベント
    kintone.events.on('app.record.create.submit.success', function(event) {
        //eventオブジェクトのプロパティ
        const appId = event.appId;
        const recordId = event.recordId;
        const record = event.record;

        //ユーザー選択「初期作業者」：ログイン名取得
        const worker = record['初期作業者']['value'][0]['code'];

        //本文
        const body = {
            'app': appId,
            'id': recordId,
            'assignees': [worker]
        };

        //レコードの作業者の更新
        return kintone.api(kintone.api.url('/k/v1/record/assignees.json', true), 'PUT', body, function(resp) {
            //console.log("成功");
        });
    });
})();

```

<br>
設定後に保存を行い、アプリの更新を行ってください。
これで新規にレコードを作成した場合に、ユーザー選択で選択したユーザーが作成者に設定されます。

## 解説
#### レコード追加画面の保存成功後イベント

```Javascript:
//新規作成の保存成功時イベント
kintone.events.on('app.record.create.submit.success', function(event) {
});
```
今回は[レコード追加画面の保存成功後イベント](https://developer.cybozu.io/hc/ja/articles/201941984#success)(*app.record.create.submit.success*)を利用しました。
保存成功後を利用する理由としては、後述の作業者の更新時にレコード番号を必要とするためです。
※モバイル版で利用する場合には*mobile.app.record.create.submit.success*を利用します。	


#### eventオブジェクトのプロパティ値取得

```Javascript:
//eventオブジェクトのプロパティ
const appId = event.appId;
const recordId = event.recordId;
const record = event.record;
```


リクエストに利用する「アプリID」、「レコード番号」、
レコードの登録状況を取得する「レコードオブジェクト」を取得しています。

#### ユーザー選択に設定したユーザーを取得

```Javascript:
//ユーザー選択「初期作業者」：ログイン名取得
const worker = record['初期作業者']['value'][0]['code'];
```
ユーザー選択に設定したユーザーのユーザーコードを取得します。
**\['初期作業者'\]**はユーザー選択のフィールドコード名です。
**\['value'\][0]**はユーザー選択のフィールド形式は配列で取得されるため、一つ目の値を指定しています。
**\['code'\]**はユーザーコードを指定しています。


フィールド形式については詳細に知りたい方は**[こちら](https://developer.cybozu.io/hc/ja/articles/202166330-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E5%BD%A2%E5%BC%8F)**を参考にしてください。
#### リクエストボディの作成

```Javascript:
//本文
const body = {
  'app': appId,
  'id': recordId,
  'assignees': [worker]
};
```
リクエストボディの作成をしています。
先ほど取得した「アプリID」「レコード番号」「ユーザーコード」を設定しています。

#### レコードの作業者の更新

```Javascript:
//レコードの作業者の更新
return kintone.api(kintone.api.url('/k/v1/record/assignees.json', true), 'PUT', body, function(resp) {
    //console.log("成功");
});
```
レコードの作業者を更新しています。
URIには**https://(サブドメイン名).cybozu.com/k/v1/record/assignees.json**、
HTTPメソッドは**PUT**、先ほどの**body**(リクエストボディ)をセットしリクエストを行います。
成功すると**return**が行われ、作業者の設定が完了します。

リクエストボディを含む詳細の設定は[レコードの作業者の更新](https://developer.cybozu.io/hc/ja/articles/208243696-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%BD%9C%E6%A5%AD%E8%80%85%E3%81%AE%E6%9B%B4%E6%96%B0)をご確認ください。


## 最後に
### 参考一覧
- [プロセス管理でできること](https://jp.cybozu.help/k/ja/user/app_settings/process/whatsprocess.html)
- [レコード追加画面の保存成功後イベント](https://developer.cybozu.io/hc/ja/articles/201941984#success)
- [フィールド形式](https://developer.cybozu.io/hc/ja/articles/202166330-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E5%BD%A2%E5%BC%8F)
- [レコードの作業者の更新
](https://developer.cybozu.io/hc/ja/articles/208243696-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%BD%9C%E6%A5%AD%E8%80%85%E3%81%AE%E6%9B%B4%E6%96%B0)