ルックアップフィールドの参照元レコードの取得

にメンテナンス済み

kintone のルックアップフィールドは、画面上では参照元レコードへのリンクが表示されますが、JavaScript から参照元レコードを取得しようとすると一手間かかります。ルックアップのキーが一意でないフィールドの場合は、さらに厄介です。

この記事では、JavaScript からルックアップフィールドの参照元レコードを取得・更新する方法と、参照しやすいアプリ設計のポイントを紹介します。

正攻法

参照する側のアプリに、参照元の対象レコードを特定するための情報がそろっている場合は、そこまで難しくはありません。

REST API を使って参照元のレコードを 1 件取得し、必要であれば更新 API で書き換えます。

ルックアップの参照元アプリ ID が不明な場合は、フォーム設定を取得する APIから取得できます(ルックアップフィールドの lookup.relatedApp.app が参照元アプリ ID です)。

kintone.events.on('app.record.detail.show', async (event) => {
  // 参照する側のレコード情報
  const { record } = event;

  /** 参照元アプリID */
  const app = 'xxx';

  // ここに対象レコードを1件まで絞り込むクエリーを作る
  const query = `ID = "${record['ID'].value}" limit 1`;

  // REST APIで取得した参照元の情報
  const response = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', { app, query });

  // 参照元レコード
  const [srcRecord] = response.records;

  if (!srcRecord) {
    throw new Error('参照元レコードを特定できませんでした');
  }

  // 参照元レコードを更新する場合は、PUT で ID を指定します
  await kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', {
    app,
    id: srcRecord.$id.value,
    record: { 特定: { value: '特定しました' } },
  });

  return event;
});
チェック

参照元レコードのレコード番号など、レコードを一意に特定できる値が手元にある場合は、/k/v1/records の代わりに /k/v1/record(app と id を指定)で 1 件取得できます。

上手く紐づかない → 設計の問題かも?

前述したコードでは、参照元のレコードが削除されていたり、参照元フィールドの値が変更されていたりすると、レコードを特定できずエラーになります。

こうした状況が頻繁に起きるなら、アプリ間の設計に問題があるかもしれません。どの項目を連携させるのか、ルックアップのキーは適切か、改めて見直してみましょう。

無理やり取得する

チェック

この方法は DOM を操作するため、kintone のアップデートにより動作しなくなる可能性があります。

DOM を辿る

JavaScript API から、getFieldElementメソッドを利用してルックアップフィールドの DOM 要素を取得し、リンク情報から参照元レコードを特定します。

const fieldElement = kintone.app.record.getFieldElement('ルックアップ');

const anchor = fieldElement.querySelector('a');

const { href } = anchor;

const [_, recordId] = href.match(/.*#record=([0-9]+)/);

内部パラメータを使用する

kintone 環境に存在するグローバル変数であるcybozuを使って取得することもできます。こちらは内部仕様に依存するため、DOM を辿る方法よりさらに非推奨です。

cybozu.data.page.FORM_DATA.lookups;

設計を見直す場合

ルックアップ設定から、キー情報をコピーしておく

現状の仕様を変えないまま参照元を特定したい場合は、この方法がもっとも簡単だと思います。

レコード番号や一意のキー情報をルックアップ時に合わせて取得しておけば、参照元が分からなくなることはありません。

プラグインを使う

筆者が開発した無料の「関連付けないルックアップ」プラグインでも解決できます。標準のルックアップフィールドを隠し、使いやすいフィールドをルックアップのように扱えます。

#JavaScript #kintone