kintoneの困ったを解決「ルックアップフィールドを再ルックアップ」

kintoneの困ったを解決シリーズ。

# 記事内容

ルックアップ元を更新した後に、ルックアップ先のフィールドを更新して変更を取り込んでみます。

REST API によるルックアップフィールド更新を理解する為に、いくつかのテストシナリオを作成しています。面倒な方は最初の方は飛ばしてください。

 **注意点** 

* 本環境で実施する際は必ずレコードのバックアップを取ってからお試しください。

# 動作環境

* macOS 10.13.6
* cli-kintone 0.9.4

# kintoneアプリの準備

テスト用のkintoneアプリを用意します。

### 営業支援パック導入

スペースを作り、アプリストアから[営業支援パック](https://jp.cybozu.help/k/ja/user/basic/sales_pack.html)をサンプルデータを含めて作成します。

営業支援パックには「顧客管理」「案件管理」「活動履歴」の3つのアプリがあります。


各アプリの関連は次の通り

* 顧客管理→（関連レコード）→案件管理
* 案件管理→（ルックアップ）→顧客管理、（関連レコード）→活動履歴
* 活動履歴→（ルックアップ）→顧客管理、（ルックアップ）→案件管理

案件管理では、顧客名フィールドが顧客管理アプリをルックアップしています。
これを踏まえてテストしていきます。

<img width="699" alt="スクリーンショット 2019-10-03 5.06.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/f3b3bc13-ed1d-32a9-cb73-0d5ba87f93fe.png">


<img width="639" alt="スクリーンショット 2019-10-03 5.05.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/df49406e-4348-f2c3-d669-fd68523cd537.png">

### APIトークン

案件管理のAPIトークンを取得しておきます

# テストシナリオ

REST API の理解を兼ねていくつかのテストシナリオを作ってテストしていきます。

1. 「案件管理」の顧客名フィールドを取得する（API Token認証）
2. 「案件管理」の顧客名フィールドを更新しエラーを確認（API Token認証）
3. 「案件管理」の顧客名フィールドを更新する（ログインパスワード認証）

 
## 1. 「案件管理」の顧客名フィールドを取得する（API Token認証）

案件管理アプリのレコードを[クエリ指定](https://developer.cybozu.io/hc/ja/articles/202331474#step2)で取得してみます。

```bash
# レコード取得（フィールド指定。クエリ省略）
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名"

# レコードIDの降順（上と同じ。クエリ省略時デフォルトはレコードIDの降順。大きい順）
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "order by \$id desc"

# レコードIDの昇順（小さい順）
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "order by \$id asc"

# フィールドコード顧客名の値が "金都運総研" のレコードを取得
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 = \"金都運総研\" order by \$id asc"
"$id","顧客名"
"1","金都運総研"
"2","金都運総研"

# 上と同じ
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 in (\"金都運総研\") order by \$id asc"

# like検索
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 like \"金都運総研\" order by \$id asc"
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 like \"金都運総\" order by \$id asc"
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 like \"金都運\" order by \$id asc"
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 like \"金都\" order by \$id asc"
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 like \"都運\" order by \$id asc"
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 like \"総研\" order by \$id asc"
# 0件
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 like \"金\" order by \$id asc"
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 like \"研\" order by \$id asc"


# エラーの例
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 = \"金都運総研\" and 確度 = \"100%\" order by \$id asc"
AppError: 520 [GAIA_IQ03] 確度フィールドのフィールドタイプには演算子=を使用できません。

# フィールドコード顧客名の値が金都運総研かつ確度が100%のレコードを取得
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 = \"金都運総研\" and 確度 in (\"100%\")  order by \$id asc"
"$id","顧客名"
"1","金都運総研"
```

---

### 2. 「案件管理」の顧客名フィールドを更新しエラーを確認（API Token認証）

[ルックアップフィールドはAPIトークン認証では更新できません。](https://developer.cybozu.io/hc/ja/articles/201941754)APIトークン認証にて案件管理の顧客名ルックアップフィールドを更新できないことを確認します。

APIトークンを利用することでセキュアな運用が可能となっています。

```bash
# APIトークン認証ではルックアップフィールドが更新できないことを確認します
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 = \"金都運総研\" and 確度 in (\"100%\") order by \$id asc" | cli-kintone --import -a 123 -t API-Token -d Domain

: Start from lines: 1 - 2 => ERROR OCCURRED
Status:  400 Bad Request
Message:  APIトークンを使用する場合、ルックアップフィールドを編集できません。
```

## 3. 「案件管理」の顧客名フィールドを更新する（ログインパスワード認証）

```bash
# ログインパスワード認証で更新すると成功することを確認します
cli-kintone -a 123 -t API-Token -d Domain -c "\$id, 顧客名" -q "顧客名 = \"金都運総研\" and 確度 in (\"100%\") order by \$id asc" | cli-kintone --import -a 123 -u 'userid' -p 'password' -d Domain
Start from lines: 1 - 2 => SUCCESS
DONE
```

#### レコードIDをキーにした更新用のCSVファイルを用意して、レコードを更新します。

```update.csv
"$id","顧客名"
"3","金都運総研"
```

```bash
cli-kintone --import -a 123 -u 'userid' -p 'password' -d Domain -f ./update.csv
: Start from lines: 1 - 2 => SUCCESS
: DONE
```

レコード詳細画面
<img width="695" alt="スクリーンショット 2019-10-03 21.09.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/8bc5fa14-25db-2084-4032-159ebd1a64f5.png">

変更履歴
<img width="471" alt="スクリーンショット 2019-10-03 21.10.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/f0fd9624-d0e7-5f90-6b0d-d34a2241695a.png">

cybozu.com共通管理　監査ログ
<img width="269" alt="スクリーンショット 2019-10-03 22.32.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/20e526f5-9b5f-087d-0d9d-967b553e79da.png">