ルックアップフィールドの参照元レコードの取得
見えるのに手が届かない。
レコード一覧や詳細画面からクリックすれば参照元のレコード画面を表示することができますが、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 });
ルックアップフィールドに直接一意のフィールド情報を取得している場合は、API
を/k/v1/records
から/k/v1/record
に変更しても取得可能です。
上手く紐づかない → 設計の問題かも?
前述したコードでは、参照元のレコードが削除されていたり、参照元フィールドの値が変更されていたりすると、エラーとなります。
アプリの状態はそのままで、他の方法を使って取得しようと思えばいくつか手段はありますが、このような状況に頻繁になるようであれば、アプリ間の設計に問題があるかもしれません。
どの項目を連携させるのか、ルックアップするフィールドはこれで正しいか、改めて見直してみましょう。
無理やり取得する
この方法は 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;
設計を見直す場合
ルックアップ設定から、キー情報をコピーしておく
現状の仕様を変えないまま参照元を特定したい場合は、この方法がもっとも簡単だと思います。
レコード番号や一意のキー情報をルックアップ時に合わせて取得しておけば、参照元が分からなくなることはありません。
プラグインを使う
宣伝になりますが、私の開発した「関連付けないルックアップ」プラグインを使って解決できます。
といっても無料のプラグインですので、よろしければご検討いただければ幸いです。
このプラグインを使用すれば、標準機能のルックアップフィールドを隠蔽して、ユーザーの使いやすいフィールドを代わりにルックアップフィールドに見立てて使用できます。