【kintone】ルックアップ先を自動更新する方法を紹介

## はじめに
kintoneのルックアップ機能はルックアップ元のデータを更新しても自動でルックアップ先のデータは更新されません。更新するにはルックアップ先で、取得ボタンからデータを更新する必要があります。データの更新が頻繁に発生する場合、毎度取得ボタンからデータ更新するのは手間なので、自動更新する方法について考えました:point_up_tone1:

FormBridgeというkintoneとの連携ツールからデータを更新するケースがあったため、AWS Lambdaを用意して実装を行いました。
ルックアップ項目の自動更新のプラグインもあるようですが、条件が満たないため自作しました。

## アプリの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/f8e35a72-fb0b-6df5-4c7e-dc80cd9f94c0.png)
案件情報で使用するユーザー情報をユーザーマスタからルックアップにて取得します。

## 準備
### AWS Lambdaの環境の作成
こちらにて紹介をしているため、割愛します
[kintone WebhookとAWS Lambdaの連携方法をより詳しく説明する！](https://qiita.com/nacho0707/items/25dc60e6f186c02ff5cf)

### kintone REST API Clientのインストール
レコード全件取得や、アップサート（既存のデータがあればアップデート、なければインサート）など、レコードやアプリの操作を簡単にできるようにする、kintone REST APIを使うための便利なツールです。今回はこちらを使用しました。
Node.jsをインストールした後に以下のコマンドを実行することでインストール完了です。
```
npm install @kintone/rest-api-client
```
https://github.com/kintone/js-sdk/tree/master/packages/rest-api-client

### アプリ側の設定
APIを使用してルックアップ項目を更新する場合には値の重複をしないよう設定しておく必要があります。今回はユーザマスタのユーザー番号がルックアップ項目となっています。

## コード
```javascript
const { KintoneRestAPIClient } = require('@kintone/rest-api-client');

/**
* 案件情報アプリのレコードを取得
*/
async function getProjectRecords(userNumber) {
    const client = new KintoneRestAPIClient({
    // Lambdaの環境変数から参照
    baseUrl: process.env.BASE_URL, // https://ドメイン.cybozu.comとなる
    auth: {
      apiToken: process.env.PROJECT_API_TOKEN // 案件情報のAPIトークン
    },
  })
  
  const params = {
    app: process.env.PROJECT_APP_ID,
    // ユーザー番号が一致するデータの最新のデータを1件取得
    query: 'user_number = "' + userNumber + '" order by record_number desc limit 1',
    totalCount: true
  };

  try {
    // レコードの取得
    const records = await client.record.getRecords(params);
    return records;
  } catch (error) {
    throw error;
  }
}

/**
* 案件情報アプリのレコード更新イベント
*/
async function updateProjectRecord(userNumber, recordId) {
    const client = new KintoneRestAPIClient({
    baseUrl: process.env.BASE_URL,
    auth: {
      apiToken: [
        process.env.PROJECT_API_TOKEN,
        // ユーザーマスタの閲覧権が無いとデータの取得ができないため、
        // ユーザーマスタのAPIトークンも追加
        process.env.USER_API_TOKEN
      ]
    },
  })
  
  const params = {
    app: process.env.PROJECT_APP_ID,
    id: recordId,
    record: {
      'user_number': {
        'value': userNumber
      }
    },
  };

  try {
    // レコードの更新
    await client.record.updateRecord(params);
  } catch (error) {
    throw error;
  }
};

/**
 * メイン処理
 */
exports.handler = async function main(event, context) {
  try {
    event.body = JSON.parse(event.body);
    const record = event.body.record;
    const userNumber = record['user_number'].value

    // 更新対象のレコード
    const projectRecords = await getProjectRecords(userNumber);

    // 更新対象のレコードが1件以上あれば更新する
    if (projectRecords.totalCount > 0) {
      // データの取得件数を1件に絞り込みをしているため、1件目のデータを指定
      const projectRecord = projectRecords.records[0];
      const recordId = projectRecord.$id.value;

      await updateProjectRecord(userNumber, recordId);
    }
  } catch (error) {
    throw error;
  }
}
```
**解説**
```javascript
    auth: {
      apiToken: [
        process.env.PROJECT_API_TOKEN,
        // ユーザーマスタの閲覧権が無いとデータの取得ができないため、
        // ユーザーマスタのAPIトークンも追加
        process.env.USER_API_TOKEN
      ]
    },
```
ルックアップの項目を更新するには取得先のAPIトークンを記載しないと閲覧権限がなく値のコピーができないようです。APIトークンによる認証にてデータ更新を行いました

## さいごに
ルックアップ項目を自動更新したい場合、こちらの記事を参考にしてみてください:raising_hand_tone1: