ルックアップフィールドの参照元レコードの取得
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;
設計を見直す場合
ルックアップ設定から、キー情報をコピーしておく
現状の仕様を変えないまま参照元を特定したい場合は、この方法がもっとも簡単だと思います。
レコード番号や一意のキー情報をルックアップ時に合わせて取得しておけば、参照元が分からなくなることはありません。
プラグインを使う
筆者が開発した無料の「関連付けないルックアップ」プラグインでも解決できます。標準のルックアップフィールドを隠し、使いやすいフィールドをルックアップのように扱えます。