初めまして。トヨクモ株式会社のkintone SIに係る知見が豊富な武井です。
僭越ながら本日より、kintone SI経験の中で、お客様からのご要望にもかかわらず、
kintoneの機能制約により実現が不可能であったことを中心に指弾し、延いては改善され、あまねくkintone利用者に資することを目的とした記事などを書いて参ります。
さて、kintoneにおけるルックアップは、ノンカスタマイズ環境において他アプリの情報を取得、利用できる唯一の方法である一方、
利用に際しては種々の問題をはらんでいます。
今回はその中の一つである「自動クリアができない」問題について傾向と対策をまとめたいと思います。
問題の経緯
何らかの理由で、ルックアップフィールドに対し、自動的に文字を挿入し、ルックアップ先の情報を取得したい場合があります。
これはカスタマイズにて対応可能で、例えばJavaScriptファイルに以下のような記述をすることで、
レコード作成画面表示時に、自動的にルックアップ先のレコード番号”5″を挿入した上で、
ルックアップの「取得」を押下した状態まで持っていくことができます。
// レコード作成画面 kintone.events.on(['app.record.create.show'], function(event) { var record = event.record; record.recNo.value = "5"; // 'recNo'はルックアップフィールドのフィールドコードとする record.recNo.lookup = true; // 「取得」を押下した状態にする return event; });
同様に、ルックアップフィールドに対し、ルックアップで既に取得された情報を自動的に削除したい場合があります。
それは例えば既に登録したレコードの情報の一部を自動的に消したい場合であったりとか、
他のフィールドを操作したらルックアップフィールドを自動的に消したい場合などであり、
この状況(要件)は、まま発生します。
私の希望からすると、以下のようなコードを書くことで、コメントのような挙動をとって欲しくなります。
// レコード編集画面 kintone.events.on(['app.record.edit.show'], function(event) { var record = event.record; record.recNo.value = ""; // ルックアップフィールドを空にする record.recNo.lookup = false; // 「クリア」ボタンを押下した状態になって欲しい return event; });
しかしながら、現実的には以下のような挙動になり、「クリア」ボタンの押下状態を自動的に作ることができなくなっています。
代替手段
さりとて、ルックアップを使用しないであるとか、このために要件変更を求めるようなことは現実的でなく、何れかの対応が必要となります。
私見によると、本件で発生する問題は以下の2点です。
- 保存ができない。(手動で「クリア」ボタンを押すまで生涯保存できない)
- コピーフィールドがクリアされない。
コピーフィールドについては、ルックアップフィールド同様の手順で空にすればよろしく、
実質的には保存のできないことがボトルネックなのであります。
制約付きの条件下でのみとはなりますが、以下に私の考える代替手段を記しますので、ご参考いただければ幸いです。
「保存」しない
無論、保存はするのですが、「保存」ボタンでの保存をしない趣旨となります。
(function() { "use strict"; // レコード編集画面 kintone.events.on(['app.record.edit.show'], function(event) { var appId = kintone.app.getId(); var recId = kintone.app.record.getId(); // DOMでdiv要素を追加し、「保存」ボタンの上に被せる。下記の場合、事前にjQueryのライブラリを読み込んでください。 $(".gaia-argoui-app-edit-buttons-contents").after("<div id='divId' style='height: 49px;width: 165px;position: absolute;margin: -65px 195px;'></div>") // 保存ボタンをクリックした時の動作 $("#divId").on('click',function(){ var body = { "app": appId, "id": recId, "record": { "recNo": { "value": "" }, "copy": { "value": "" } } }; kintone.api(kintone.api.url('/k/v1/record', true), 'PUT',body, function(resp) { location.href = "https://" + location.host + "/k/" + appId + "/show#record=" + recId; location.reload(); }); }); return event; }); })();
行っている処理としては、
「保存」ボタンにdiv要素を被せ、そのdivにクリックイベントを登録、
クリックイベントでは当該編集レコード内のルックアップフィールド及びコピーフィールドをクリアして上書き保存しています。
保存処理完了後、当該レコードの詳細画面に飛ばします。
×制約
- submitイベント(保存時イベント)が使えなくなります。
- 数値フィールドに文字列が入っている場合など、各フィールドのバリデーションチェックが保存時に必要になると思います。
- DOM操作のため、kintoneのアップデートによるクラス変更等により、プログラムが動作しなくなる危険性を生涯背負うこととなります。
※最終的にルックアップフィールドの中身を編集で削除することを主眼としています。
消さないのであれば、手動にて取得ボタンを押すか、lookup = trueで対応できると考えるためです。
致命的な制約が多く、代替できていないですね……。
もし、その他にもよろしい案があれば承りたいと存じます。
【更新】関連記事はこちら→