株式会社レキサスの村濱です。
下記リファレンスにあるように、現在JavascriptAPIにてルックアップの自動取得が可能になっています。
しかし、ルックアップフィールドは、なんらか値を取得したあと、リセットしたい場合は「クリア」ボタンを押す必要があります。
※クリアボタンを押さなければ、レコードの保存/更新ができず、他のフィールドのコピーした項目もリセットされない。
例えば、「ルックアップフィールドはプルダウンなどと連携させたい」場合など、ルックアップフィールドへの値の挿入はJavascriptにて行えるのですが、その後リセットができなくて困る点が多々あります。
javascriptからの「クリア」機能の実装を希望しています。
現状、上記のような問題を回避する方法としては、
「ルックアップ参照元のアプリに、空欄と同等のレコードを用意する」という手段があります。
例えば、アプリBが、アプリA(例えば住所マスタ)から住所の情報を取り出したい場合は下記のようにしています。
アプリA(ルックアップ参照元アプリ)
1. なし ←空欄と同等のレコード。デフォルト値として扱う
2. 東京都
3. 沖縄
:
このようにアプリAを設定することで、アプリBでルックアップフィールドで「なし」を選択できるようになるので、ルックアップフィールドを空欄に設定するのと同等のことは可能です。
5件のコメント
<2017/06/16更新>JavaScript developer向けフォーラムから移動させていただきました。
@サイボウズさん
これ、最近僕もとても困っています。
JS APIでの「クリア」機能の実装を何とかしていただけないですかね・・・
村濱さんのhackで確かにそれっぽいことはできますが、
手動操作の時は「クリア」を押してデータを空にするわけなので、
それがJSで自動的にできないと、開発時の選択肢がとても狭まってしまいます。
他のスレッドでもたくさん言及されてて、
以前から要望がかなり多い割にスルーされてる印象を受けます。
色々と開発の優先順位はあると思いますが、ぜひ真剣に検討お願いします!
切実さを分かっていただきたいので、具体例を挙げてみました。
例)
・「受注」アプリに「請求書番号」ルックアップフィールドがある
・受注レコードの新規作成時点では請求書番号は入らない
・「請求書」アプリのレコード作成時に、REST API経由で「受注」アプリの「請求書番号」を自動設定
(その際「請求書番号」が空の受注レコードは無視する)
・過去の確定済み「受注」レコードを複製した際に「請求書番号」は自動削除
上記を実現したい場合、JS APIでの「クリア」ができれば
'app.record.create.submit'イベントで確実に値を削除することができますが、
submit時に「値を空にしただけ」 or 「空にしてlookup = true」では
無視されて元の値のまま確定されてしまいます。
村濱さん方式を使う場合、「請求書番号が空」という判定ができず、ロジックが複雑になってしまいます。
またsubmit.successイベントでREST APIで更新する手段もありますが、
「今編集しているレコードの値の書き換え」はなるべくJS APIで行いたいです。
上記の理由により、現状では'app.record.create.show'イベントを使っています。
ルックアップフィールドがdisabledになっている場合、
「取得」「クリア」をしなくてもフィールドの値を確定できるようなので、
create.showの時点でルックアップの値を空にしてやれば、そのまま確定できます。
ただ「ほかのフィールドのコピー」を使っている場合は、
それらのフィールドも全てJSで書き換えてやる必要があり、面倒です。
ルックアップフィールドがdisabledになっていない場合は、
JSで値を空にだけして、ユーザーに「クリア」ボタンを押してもらう必要があります。
クリアせずに確定するとエラーになりますが、
「エラーになったらクリア」という運用カバーにすることで、
「ルックアップが紐づいたまま確定してしまう状態」だけは避けることができます。
いずれにしても、JS APIでの「クリア」さえできれば、
上記のような努力をしなくて済み、submitで一発OKなので、
とても幸せになれるのであります。分かっていただけますでしょうか・・・
どうぞよろしくお願いします!!!
当件、埋もれないようにコメントのみ記載します。私も「切望」いたします。
https://developer.cybozu.io/hc/ja/articles/201941984-レコード追加イベント
にあるサンプル
> kintone.events.on('app.record.create.show', function(event) {
> var record = event.record;
> record['ルックアップ']['lookup'] = 'CLEAR';
> return event;
> });
にて対応しました。このイベントは複製時にもキックされるようですので、今のところうまく動いています。
(昔からこのプロパティー設定があったのかは不明)