はじめに
「ルックアップ」とは kintone で配置できるフィールドの 1 つで、ルックアップフィールドを配置すると、他のアプリにあるレコードの情報を参照してデータを取得(コピー)することができます。同じ内容のデータを繰り返し入力せずに済むことで、入力ミスを防ぎ、入力時間を短縮できます。
たとえば、案件管理アプリにルックアップフィールドを配置して、関連付けるアプリとして顧客管理アプリを指定します。これにより、案件管理アプリでレコードを登録するときに、顧客管理アプリのデータをコピーして入力できるようになります。
この例では、案件管理アプリにおける「顧客名」は「ルックアップ」フィールドで、「部署名」「担当者名」は「ほかのフィールドのコピー」として設定されており、ユーザーは入力する必要がなく顧客名をコピーする時に同時に顧客管理アプリからコピーされます。
課題:ルックアップで取得した値はその時点のコピーである
非常に便利なルックアップの機能ですが基本機能の仕様通りに使う場合、次のような課題点もあります。
ルックアップの機能を使用して他のアプリから取得した値は、「取得」ボタンを押した時点のコピーです。そのため、コピー元のデータに変更があった場合、再度「取得」ボタンを押さない限り、コピー先では反映されません。
この課題は、カスタマインを用いると解決する事ができます。
カスタマイズに用いるアプリ構成
今回は、kintone アプリストアにある「営業支援パック」を使用してカスタマイズを作成します。「営業支援パック」では各アプリ間は以下のような関係となっています。
※フィールドコードを分かりやすくするため、フィールドコードは「フィールド名_アプリ名」に変更しています。
カスタマイズ
この課題はコピー元のアプリを変更した時に、「コピー先アプリで『取得』ボタンを再度押す」ことをカスタマイズで実現できれば、解決する事ができます。
ですので、「顧客管理」アプリにカスタマイズを行います。
カスタマイズについては次の1アクションで実現できます。
やること「他アプリのルックアップを取得しなおす」、条件「レコードを保存した直後(削除後は除く)」を用います。
なお、アプリは「案件管理」を指定し、ルックアップフィールドとルックアップの値にはそれぞれ顧客名(ルックアップフィールドは「顧客名_案件管理」、ルックアップの値は「顧客名_顧客管理」)を設定します。
カスタマイズはたったこれだけです。このカスタマイズによって、「顧客管理」アプリ側でレコード保存した時に、ルックアップフィールドが存在している「案件管理」アプリ側でルックアップフィールドの「取得」ボタンを押したのと同じ動きになります。
カスタマイズを設定する時のポイント
カスタマイズの設定自体は非常に簡単ですが、このカスタマイズを作成する上でもいくつかのポイントがあります。
どのアプリにカスタマイズを入れるか?
カスタマインでカスタマイズを行う場合、どのアプリにカスタマイズを入れるか?を意識して作成する必要があります。これは前提として、カスタマイズはユーザーが開いているアプリで動くためです。
今回実現したいカスタマイズは「案件管理」と「顧客管理」の2つのアプリが関連するため、どちらにカスタマイズを適用するべきか悩むかもしれません。ここでどちらのアプリにカスタマイズを入れるべきか考えてみます。
まず、実現したいことを図で示すと以下のようになります。
では、これを踏まえて考えてみましょう。
「案件管理」アプリにカスタマイズを入れる場合
これは、条件「詳細画面を表示した時」を使用すれば、ユーザーが詳細画面を表示した時に動くカスタマイズを作成することで実現可能です。ただ、これだと一覧画面を表示した時点ではまだレコードが書き換わっていません。
この「条件」を使った場合に、もし全レコードを書き換えようとするならば、カスタマイズを動かすために書き換わった「顧客名_案件管理」を使用する全レコードを1件1件開く必要があり、これは現実的ではありません。
では、条件「一覧画面を表示した時」に変更するとどうでしょうか。
この場合は、一覧画面で表示されている全てのレコードを対象とする事ができます。ですが、どのレコードのルックアップコピー元が書き換わったかを判別する手段は無いため、全レコードを更新するカスタマイズを作成する必要があります。
このような全レコードに対しての更新処理は、処理時間がかかるだけでなくAPI の消費も多くなる懸念もあるため最適な方法とは言えません。
また、「案件管理」アプリの「顧客名_案件管理」フィールドを関連レコードで他アプリに表示している場合や表やグラフを使っている場合には、一覧画面を開くまでは古いレコードのまま更新されない、といった点が問題となるケースもあります。
このことから、「案件管理」アプリにカスタマイズを入れるのは良い方法とは言えません。
「顧客管理」アプリにカスタマイズを入れる場合
反対に、「顧客管理」アプリはユーザーが「顧客名_顧客管理」を変更する時に必ず操作するアプリです。そのため、「顧客管理」アプリ側でユーザーが操作したタイミングで動くカスタマイズを実装すれば、漏れがなくなります。
このように複数のアプリが関連するカスタマイズを作成する場合には、「どちらのアプリで操作した時にデータを反映したいか」を考えて、それに合わせたカスタマイズを作成してください。
どの「条件」を使うか?
「どのアプリにカスタマイズを入れるか?」で記載したとおり、今回のカスタマイズは「顧客管理」アプリに入れます。次に考えるのは、どの「条件」を使うか?です。
使えそうな選択肢としてイメージできるものは
フィールドの値を編集して値が変わった時
レコードを保存する直前(削除時は除く)
保存後
があると思います。このうち、どれを使うのが最適か考えてみます。
●フィールドの値を編集して値が変わった時
条件「フィールドの値を編集して値が変わった時」で実行するメリットは、ほぼリアルタイムに処理が実行される点があります。そのため、これが一番良いのでは?と思ってしまいがちです。
しかし、この条件で動かすと
入力した際に即時処理が実行されるため、誤って入力した際などに無駄な更新が発生する
レコードを保存せずキャンセルした場合でも更新されてしまう
上記による API 消費が増大する
といった問題があるため、適しているとは言えません。
●レコードを保存する直前(削除時は除く)
条件「レコードを保存する直前(削除時は除く)」だと全ての入力が終わっているためこれで良いような気がします。ただし、この場合にも注意点があります。必須チェックのエラー、型のエラー、同時編集のエラーなどがあったときレコードの保存ができていないのにカスタマイズが動いてしまうため、こちらも適していません。
●レコードを保存した直後(削除後は除く)
今回のカスタマイズのように他のアプリを更新する用途で作成するカスタマイズは、条件「レコードを保存した直後(削除後は除く)」を使うのがオススメです。先述の条件「レコードを保存する直前(削除時は除く)」などでは、エラーなどで保存に失敗した時にも動いてしまいますが、この「条件」であれば、確実に保存に成功したときのみ動かす事ができます。
上記で記載した3つの条件の特性を簡単に纏めます。
このカスタマイズにおけるその他注意点
i.「値の重複を禁止する」にチェックが入っている必要がある
ルックアップフィールドを更新する場合、コピー元のフィールドで「値の重複を禁止する」の設定を行う必要があります。
今回の場合、「顧客管理」アプリの「顧客名_顧客管理」フィールドで「値の重複を禁止する」の設定が必要です。
ii.ルックアップのキーが変わった場合にはカスタマイズは動かない
このカスタマイズは「顧客名_顧客管理」に入力されている値と同じ値を持つ「案件管理」アプリ内のレコードで、ルックアップの「取得」ボタンを押すことを自動で行うためのカスタマイズです。
そのため、「顧客名_顧客管理」の値自体が変更になった場合にはこのカスタマイズを使用することはできません。
コラム:ページを分けましょう
次のカスタマイズに移る前に、「ページ」を分けましょう。カスタマインの設定は数が増えるとページ自体が縦長になり視認性が悪くなるだけではなく、メンテナンス時にもどこを修正すべきかわかりづらくなるため、異なる要件のカスタマイズを作成するときにはページを分けることをお勧めします。
画面右上の「+」ボタンを押すと新しいページが作成されます。また、ページごとに名前をつけておくことでページ数が増えたときにも目的のカスタマイズを探しやすくなると思います。この例では「ルックアップ自動更新」という名前をつけています。
※注意点
ページを跨ったカスタマイズを作成することはできません。例として設置したボタンや他のアクションを参照する場合には、同一ページ内でアクションを作成する必要があります。
おわりに
この記事では、やること「他アプリのルックアップを取得しなおす」を使ったルックアップの再取得についてお伝えしました。
カスタマインではルックアップフィールドに関連するデータの最新化はシンプルに実現する事ができます。ぜひ活用してみてください!
また、ご不明点等ございましたら、チャットにてご質問ください!