ルックアップの自動取得
kintone のルックアップフィールドは、別のアプリのデータを参照して現在のレコードにコピーする便利な機能です。通常はユーザーが「取得」ボタンをクリックして参照データを取り込みますが、JavaScript カスタマイズを使えば、画面を開いた時点で自動的にルックアップを実行 させることができます。
しかし、ルックアップの自動取得にはいくつかの注意点や、利用できるイベントの制約があります。
この記事では、ルックアップの自動取得の仕組みから、実践的な実装パターン、よくある問題の解決方法まで解説します。
lookup プロパティによる自動取得
kintone の JavaScript API では、ルックアップフィールドに対して lookup プロパティ を設定することで、自動的にルックアップの取得処理をトリガーできます。
基本的な使い方
(() => {
'use strict';
const events = [
'app.record.create.show',
'mobile.app.record.create.show',
];
kintone.events.on(events, (event) => {
const record = event.record;
// ルックアップフィールドに値を設定
record['顧客コード'].value = 'C001';
// lookup プロパティを true に設定して自動取得をトリガー
record['顧客コード'].lookup = true;
return event;
});
})();
lookup プロパティを true に設定して event を返すと、ルックアップフィールドの value
に設定されている値をキーにして、参照先アプリからデータが自動的に取得されます。value
が空の場合や、一致するレコードがない場合は取得されません。
lookup プロパティが使えるイベント
lookup プロパティによる自動取得は、レコードの作成・編集画面の表示イベント でのみ使用できます。
| イベント名 | 対応 |
|---|---|
app.record.create.show | ✅ |
app.record.edit.show | ✅ |
mobile.app.record.create.show | ✅ |
mobile.app.record.edit.show | ✅ |
app.record.detail.show | ❌ |
app.record.index.show | ❌ |
app.record.create.change.* | ❌ |
app.record.create.submit | ❌ |
change イベントや submit イベントでは lookup
プロパティを使用できません。これらのイベントで参照先データが必要な場合は、REST API
を使って直接取得する必要があります。
実践パターン
パターン 1: URL パラメータからルックアップを自動取得
他のアプリからリンクでレコードの新規作成画面を開き、URL パラメータの値でルックアップを自動取得するパターンです。
(() => {
'use strict';
const events = [
'app.record.create.show',
'mobile.app.record.create.show',
];
kintone.events.on(events, (event) => {
const record = event.record;
// URL パラメータから顧客コードを取得
const urlParams = new URLSearchParams(window.location.search);
const customerCode = urlParams.get('customerCode');
if (customerCode) {
record['顧客コード'].value = customerCode;
record['顧客コード'].lookup = true;
}
return event;
});
})();
リンク元のアプリでは、以下のようなリンクを生成します。
const url = `https://{subdomain}.cybozu.com/k/{appId}/edit?customerCode=${customerCode}`;
パターン 2: ログインユーザーの情報でルックアップを自動取得
ログインユーザーの情報をもとに、担当者マスタからデータを自動取得するパターンです。
(() => {
'use strict';
const events = [
'app.record.create.show',
'mobile.app.record.create.show',
];
kintone.events.on(events, (event) => {
const record = event.record;
const loginUser = kintone.getLoginUser();
// ログインユーザーのログイン名で担当者マスタを参照
record['担当者コード'].value = loginUser.code;
record['担当者コード'].lookup = true;
return event;
});
})();
パターン 3: 編集画面でルックアップを再取得
レコード編集画面を開いた際に、ルックアップの参照先データが更新されている可能性がある場合、自動的に最新のデータを再取得するパターンです。
(() => {
'use strict';
const events = [
'app.record.edit.show',
'mobile.app.record.edit.show',
];
kintone.events.on(events, (event) => {
const record = event.record;
// 既にルックアップフィールドに値がある場合、再取得をトリガー
if (record['顧客コード'].value) {
record['顧客コード'].lookup = true;
}
return event;
});
})();
ルックアップの参照先アプリのデータが頻繁に更新される場合、編集画面を開く際に自動再取得することで、常に最新のデータを表示できます。
lookup を使用できない場面での代替手段
change イベントや submit イベントなど、lookup プロパティが使えない場面では、REST API を使って参照先アプリのデータを直接取得する方法があります。
フィールド変更イベントでの参照先データ取得
(() => {
'use strict';
const LOOKUP_APP_ID = 10; // 参照先アプリのID
const events = [
'app.record.create.change.顧客コード',
'app.record.edit.change.顧客コード',
];
kintone.events.on(events, async (event) => {
const record = event.record;
const customerCode = record['顧客コード'].value;
if (!customerCode) {
// 値がクリアされた場合、関連フィールドもクリア
record['顧客名'].value = '';
record['電話番号'].value = '';
return event;
}
try {
// REST API で参照先アプリから直接取得
const result = await kintone.api(
kintone.api.url('/k/v1/records.json', true),
'GET',
{
app: LOOKUP_APP_ID,
query: `顧客コード = "${customerCode}"`,
fields: ['顧客名', '電話番号', '住所'],
}
);
if (result.records.length > 0) {
const srcRecord = result.records[0];
record['顧客名'].value = srcRecord['顧客名'].value;
record['電話番号'].value = srcRecord['電話番号'].value;
record['住所'].value = srcRecord['住所'].value;
}
} catch (error) {
console.error('参照先データの取得に失敗しました', error);
}
return event;
});
})();
REST API で参照先データを取得する場合、ルックアップのコピー元フィールドの設定とは独立した実装になります。ルックアップの設定でコピーするフィールドを変更しても、JavaScript 側のコードは自動的に追従しないため、メンテナンスコストに注意してください。
lookup = “CLEAR” でルックアップをクリアする
lookup プロパティに "CLEAR" を設定すると、ルックアップフィールドとそのコピー先フィールドの値をクリアできます。
(() => {
'use strict';
const events = [
'app.record.create.show',
'mobile.app.record.create.show',
];
kintone.events.on(events, (event) => {
const record = event.record;
// ルックアップフィールドとコピー先フィールドをクリア
record['顧客コード'].lookup = 'CLEAR';
return event;
});
})();
lookup = "CLEAR" は、lookup = true と同じイベント(create.show /
edit.show)でのみ使用できます。
よくあるトラブルと解決策
「ルックアップの取得に失敗しました」エラー
| 原因 | 解決策 |
|---|---|
value が空のまま lookup = true にした | value にキーとなる値を設定してから lookup = true にする |
| 参照先に一致するレコードがない | 値の存在を事前に確認するか、エラーハンドリングを実装する |
| 参照先アプリへのアクセス権がない | ルックアップ設定でアクセス権を確認する |
lookup 非対応のイベントで使用した | create.show または edit.show イベントで使用する |
ルックアップのコピー先にデータが反映されない
lookup = true を設定しても、コピー先フィールドにデータが反映されない場合は、以下を確認してください。
- ルックアップの設定 でコピー元・コピー先のフィールドが正しく設定されているか
- イベント が
create.showまたはedit.showであるか return eventを忘れていないか
まとめ
- ルックアップの自動取得は
record['フィールドコード'].lookup = trueで実現できる lookupプロパティはcreate.showとedit.showイベントでのみ使用可能changeイベントやsubmitイベントでは REST API を使って参照先データを直接取得するlookup = "CLEAR"でルックアップのコピー先フィールドを含めてクリアできる- URL パラメータやログインユーザー情報を組み合わせることで、実務に即した自動取得が実現できる