LINE WORKS のカスタムフィールドを使う

LINE WORKS v2.6 でアドレス帳の["カスタムフィールド"](https://developers.worksmobile.com/jp/document/100301301?lang=ja)が追加されました。
これを使うと、アドレス帳で各メンバーの表示に「特技」のような項目を作ったり、別の Web サービスのプロフィールページへのリンクを追加することができます。
ただし、カスタムフィールドの設定は API のみで提供されていることに注意が必要です。
Python での利用サンプルと注意点についてまとめました。

# 事前準備 
カスタムフィールドの利用には、ドメインでいくつかの設定変更が必要です。
## ExternalKey の設定
各メンバーには、事前に Eternal Key を付与しておきます。[Developer Console](https://developers.worksmobile.com/jp/console/)の組織連携メニュー内 「構成員 External Key Mapping」 から CSV で一括設定が可能です。


## 組織連携設定
利用には事前に [Developer Console](https://developers.worksmobile.com/jp/console/) から「組織連携使用設定」 を有効にし、「組織/構成員」を On に切り替える必要があります。
![組織連携使用設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224481/ff6d9553-a63e-8509-4d0b-c09c6d05d1ac.png)

こちらを切り替えるとメンバー管理がすべて API に切り替わり、管理画面からメンバーの追加や編集などが行えなくなりますので注意してください。カスタムフィールド設定後に設定を Off にしても設定した値は
維持されるので、一時的に On にするだけでも良いと思います。

# カスタムフィールドの定義
まずカスタムフィールドを定義します。各APIの説明は[こちら](https://developers.worksmobile.com/jp/document/100301301?lang=ja)。
## 設定サンプル
ためしに Python3.6 でカスタムフィールドの定義の操作を書いてみました。エラー処理など入れてなくて諸々が適当なのはご容赦ください。

```python:customfield.py
import json
import requests

def customfield(Method,SchemaKey,**Schemeparams):
    #リクエスト URL の作成
    apiheadurl =  'https://apis.worksmobile.com/r' 
    apicategory = 'organization/v2'
    apitarget= 'customfields'
    url= '/'.join([apiheadurl,{API ID},apicategory,'domains',{Domain ID},apitarget,SchemaKey])
    
    #request header
    header = {
        'consumerKey': {Server API ConsumerKey},
        'Authorization': 'Bearer ' + {Server API 認証 Token},
        'Content-Type': 'application/json',
        'charset': 'UTF-8' 
        }
    
    #request body
    payload = Schemeparams

    #Method に応じてカスタムフィールドに対する操作を決定
    if Method == 'POST':
            #name / type 必須。order,displayClients[PC_WEB/PC_APP,MOBILE] 任意。
            r = requests.post(url, headers = header,data = json.dumps(payload))
            return r
    elif Method == 'DELETE':
            #引数不要
            r = requests.delete(url, headers = header)
            return r
    elif Method == 'GET':
            #引数不要
            r = requests.get(url, headers = header)
            return r.json()
    elif Method == 'PATCH':
            #name, order, displayClients[PC_WEB/PC_APP,MOBILE] 任意
            r = requests.patch(url, headers = header,data = json.dumps(payload))
            return r
    else:
        #Method指定を間違えた場合には0を返す
        return 0
```
これでカスタムフィールドの定義の追加、削除など一連の操作を定義しました。

## カスタムフィールドの設定例
これを使って 「特技」という名前のフィールドを追加するならこのようなイメージです。

```python
customufield('POST','Specials',name='特技',type='STRING',order=1)
```


# カスタムフィールドの割り当て
各メンバーのカスタムフィールドの値も、API のみで設定可能です。
[メンバーの部分修正 API](https://developers.worksmobile.com/jp/document/100300503?lang=ja) を使った対応例はこのようになります。

```python:
def Member_customfield(ExternalKey,SchemaName,SchemaValue):
    #リクエスト URL の作成
    apiheadurl =  'https://apis.worksmobile.com/r' 
    apicategory = 'organization/v2'
    apitarget= 'users'
    url= '/'.join([apiheadurl,{API ID},apicategory,'domains',{Domain ID},apitarget,ExternalKey])

    header = {
        'consumerKey': {Server API ConsumerKey},
        'Authorization': 'Bearer ' + {Server API 認証 Token},
        'Content-Type': 'application/json',
        'charset': 'UTF-8' 
        }
    
    payload = {
        'customField':{
            SchemaName:[
                {'value':SchemaValue}
            ]
        }
    }

    r = requests.patch(url, headers = header,data = json.dumps(payload))
    return r
```

##カスタムフィールドの割り当て例
ためしに先ほどの特技を設定するとこのような形です。

```python:
Member_customfield({メンバーのExternalKey},'Specials','卓球')
```

以上、カスタムフィールドの設定例でした。

#メンバー画面上の表示
このように、プロフィールの最下段にカスタムフィールドが追加されます。
![customfield.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224481/2349a69e-9fca-8018-05c7-02792cfd137d.png)