Ribbit's works

JavaScriptからルックアップフィールドの参照元レコード情報を取得する【kintone】

#JavaScript#kintone公開 2022-10-12
記事のトップ画像

見えるのに手が届かない。

レコード一覧や詳細画面からクリックすれば参照元のレコード画面を表示することができますが、JavaScript から参照元レコードを取得しようと思うと一手間かかります。

また、ルックアップフィールドで参照するフィールドが、一意でなくコロコロ変わり得るフィールドだった場合は、さらに厄介です。

今回は JavaScript からルックアップフィールドの参照元レコードを取得する方法を考えます。

正攻法

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

REST API を使って参照元のレコードを 1 件取得し、再度 REST API で上書きします。

ルックアップの参照元アプリも不明な場合は、フォーム設定を取得する APIから参照元アプリ ID を取得可能です。

// 参照する側のレコード情報
const { record } = kintone.app.record.get();

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

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

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

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

if (!record) {
  throw '特定できませんでした';
}

const newRecord = { 特定: { value: '特定しました' } };

return kintone.api(kintone.api.url('/k/v1/record.json', true), 'POST', { app, record: newRecord });
tip

ルックアップフィールドに直接一意のフィールド情報を取得している場合は、API を/k/v1/recordsから/k/v1/recordに変更しても取得可能です。

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

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

アプリの状態はそのままで、他の方法を使って取得しようと思えばいくつか手段はありますが、このような状況に頻繁になるようであれば、アプリ間の設計に問題があるかもしれません。

どの項目を連携させるのか、ルックアップするフィールドはこれで正しいか、改めて見直してみましょう。

無理やり取得する

caution

この方法は 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;

設計を見直す場合

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

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

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

プラグインを使う

宣伝になりますが、私の開発した「関連付けないルックアップ」プラグインを使って解決できます。

といっても無料のプラグインですので、よろしければご検討いただければ幸いです。

このプラグインを使用すれば、標準機能のルックアップフィールドを隠蔽して、ユーザーの使いやすいフィールドを代わりにルックアップフィールドに見立てて使用できます。