はじめに
往々にして表計算ソフトでは、VLOOKUP関数などのルックアップ関数で、マスタ運用のような要件を満たすケースがあります。
この記事では、そういった要件をkintoneとカスタマインで満たせるようなカスタマイズの実現を目指し、どうやってカスタマイズを重ねていくかについて記載しています。
なお、今回の記事ではイメージを掴みやすくするために、Excelのデータ形式をそのままkintoneアプリで再現していますが、実際のkintoneアプリ開発では必ずしもExcelのデータと同一の構造のアプリにすることが最適とは限らない点にご注意ください。
元々運用されていた表計算ソフト
まずは、「注文管理」アプリの入力をスムーズに行えるようにカスタマイズします。
これまでの「注文管理」シートの運用は次の通りです。
運用:取引先コードをキーに、「取引先マスタ」から取引先名・担当者名をExcelのVLOOKUP関数(以下、VLOOKUPと記載)で検索し、指定のセルに入力を行っている。
ルール①:会社名の変更がある場合は「取引先マスタ」シートを更新する。
ルール②:レンタルが終了した取引についてはVLOOKUPを削除(セルをコピーして値貼り付け)して値を固定し、「取引先マスタ」シートに変更があっても上書きしない。
ルール③:担当者名は注文により異なるケースが多くあるため、「取引先マスタ」の担当者名と異なる担当者による注文の場合には都度「取引先マスタ」シートの変更は行わず、「注文管理」シート上で上書きする。
アプリの準備
まず、次の要領で2つのアプリを作成してください。
※この記事内で必要となるフィールドのみ記載しています
取引先マスタ
※フィールド名とフィールドコードは同じものを指定
注文管理
※フィールド名とフィールドコードは同じものを指定
まずは基本機能のルックアップを活用してみる
まず、「注文管理」アプリでは、VLOOKUPを用いていた箇所をkintoneの基本機能のルックアップで設定しました。これにより取引先コードをもとに、「取引先マスタ」アプリから、取引先名と担当者名をコピーする動きが実現できます。
「注文管理」アプリ
ただし、これだけでは「取引先マスタ」アプリの値を変更してもVLOOKUPの動きとは異なり、「注文管理」アプリのレコードが更新されません。
これは、kintone のルックアップが、その時点での情報をコピーする機能だからです。そのため、この運用を基本機能だけで実現しようとするならば、すでに作成したレコードに対して「取引先マスタ」アプリの変更を反映させたいときには、毎回ルックアップの取得ボタンを押して最新の情報に更新する必要があります。
「取引先マスタ」アプリ
「注文管理」アプリ
これをカスタマイズで解決すると?
こういった更新を毎回手動で更新することは面倒ですし、更新漏れも発生するかもしれません。
ですが、カスタマインを用いたカスタマイズであれば、「取引先マスタ」アプリにおける変更に伴い、「注文管理」アプリのレコードも自動で変更する事ができます。
具体的な例としては次の記事があります。
ルックアップしているフィールドの自動更新をするkintoneのカスタマイズ
カスタマイズ
このカスタマイズについても、先ほどの記事「ルックアップしているフィールドの自動更新をするkintoneのカスタマイズ」の内容を元に、「取引先マスタ」アプリをカスタマイズします。
ここでは、やること「他アプリのルックアップを取得しなおす」、条件「レコードを保存した直後(削除後は除く)」を用います。
実行結果
「注文管理」アプリ
「取引先マスタ」アプリ
「注文管理」アプリ
これで課題1はクリアできました。
しかしこのカスタマイズだと、すでにレンタルが終了している(商品が返却済)注文も情報が更新されてしまうため、このままではルール②(レンタルが終了した取引については値を固定し、「取引先マスタ」シートに変更があっても上書きしない。)に対応できていません。
課題2:「取引先マスタ」アプリの変更が、「注文管理」アプリの全てのレコードに自動で反映されてしまう
更に、これまでのカスタマイズに加えてルール②(レンタルが終了した取引については値を固定し、「取引先マスタ」シートに変更があっても上書きしない。)に対応させるように、カスタマイズの修正を行ってみましょう。
※注:レンタルが終了した取引は返却日が空欄となるため、その条件で判定します。
カスタマイズ
ここでは、「取引先マスタ」アプリをカスタマイズします。
2つのアクションを設定します。
アクション2では、先ほどの課題1のアクション2を置き換えるように設定しています。
やること「条件を組み立ててレコードを取得する」、条件「レコードを保存した直後(削除後は除く)」を用います。
「やること」の「検索条件」は次の様に条件ビルダーを設定してください。
また、新規に設定するアクション3では、やること「レコードを書き出す」、条件「他のアクションの実行が完了した時」を用います。
「やること」のパラメータについては、「書き出し先アプリ」は「注文管理」を設定し、マッピングでは「取引先コード」に「取引先コード」が入るようにします。
※これは、「取引先コード」を同じ値で再更新する事で、ルックアップの再取得を発生させています。
実行結果
「注文管理」アプリ
これで、レンタルが終了されている注文のみ、「取引先マスタ」アプリで変更があった場合、その内容に更新する動きを作ることはできましたが、ここで新たな課題が出てきました。
課題3:「注文管理」アプリの担当者名フィールドが編集できない
ルール③(担当者名は注文により異なるケースが多くあるため、都度「取引先マスタ」シートの変更は行わず、「注文管理」シート上で上書きする。)に対応するためには、これまで通り「注文管理」アプリ上で担当者名を変更できるようにする必要があります。
しかし、ルックアップコピー先のフィールドは、kintone基本機能のみだとルックアップの仕様で編集することができません。
「注文管理」アプリ
この課題についても、更にカスタマインで解決を図ってみましょう。
追加するカスタマイズは1アクションのみです。
カスタマイズ
ここでは、「注文管理」アプリにカスタマイズを行います。
やること「フィールドを有効化する」、条件「追加画面・編集画面を表示した時」を用います。
実行結果
「注文管理」アプリ
これで、担当者名を自在に「注文管理」アプリ上で変更することができるようになり、業務改善が順調に進んできたと思いきや、ここで想定外の問題が発生しました。
課題4:「注文管理」アプリ上で変更した担当者名が、「取引先マスタ」アプリの情報に上書きされてしまう
というのも、担当者名を「注文管理」アプリで確かに変更したはずなのに、担当者名が「取引先マスタ」アプリの担当者名に戻ってしまっているという現象が発生してしまいました。
この原因を確かめるため、kintoneの変更履歴を調べたところ、どうやら「取引先マスタ」アプリの所在地フィールドを編集したタイミングで、「注文管理」アプリの担当者名が「取引先マスタ」アプリ側の情報に上書きされているようです。
さらに調査を進めると、ルックアップの自動更新のカスタマイズにより、「取引先マスタ」アプリでレコードが更新された際、「注文管理」アプリの担当者名フィールドが「取引先マスタ」アプリの情報に自動更新されていたことが原因だとわかりました。
実務担当者と議論した結果、業務要件としては自動更新も、担当者名を可変にすることもそれぞれ必要だったので、「注文管理」アプリで担当者名を変更したレコードについてはそれを識別できるようなフラグを立てるようにし「取引先マスタ」アプリの情報が変更されても、自動更新の対象外とすることになりました。
これを踏まえて手入力したレコードであることを識別するために、「注文管理」アプリに新たに「自動更新対象外」チェックボックスフィールドを追加したうえ、カスタマイズを修正しました。
「注文管理」アプリ
カスタマイズ
ここでは、「取引先マスタ」にカスタマイズを行います。
2つのアクションを設定します。
アクション4では、先ほどの課題2のアクション2を置き換えるように設定しています。
やること「条件を組み立ててレコードを取得する」、条件「レコードを保存した直後(削除後は除く)」を用います(「やること」、「条件」は先ほどと同様です)。
「やること」の「検索条件」は次の様に条件ビルダーを設定してください。
また、アクション5では、やること「レコードを書き出す」、条件「他のアクションの実行が完了した時」を用います(こちらは、先ほどの課題2のアクション3と全くおなじものです)。
さらに、「注文管理」アプリにも自動更新対象外にチェックがついた場合のみ、担当者名フィールドを有効化するカスタマイズを追加します。
カスタマイズは、初期表示時と、「自動更新対象外」フィールドの値が変わった時に処理を行うようにします。
初期表示時のカスタマイズを次のように設定します。
このアクション2では、先ほどの課題3のアクション1を置き換えるように設定しています。
やること「フィールドを有効化する」、条件「追加画面・編集画面を表示した時」、「フィールド値が特定の値ならば」を用います(※カスタマイズの差分となるのは、「フィールド値が特定の値ならば」のみです)。
更に、自動更新対象外フィールドの値が変わった時のカスタマイズを次のように設定します。
このアクションでは、やること「フィールドを有効化する」、条件「フィールドの値を編集して値が変わった時」、「フィールド値が特定の値ならば」を用います。
このアクションでは、やること「フィールドを有効化する」、条件「フィールドの値を編集して値が変わった時」を反転させた「フィールド値が特定の値でないならば」、「フィールド値が特定の値ならば」を用います。
条件の反転については、次の記事も併せてご覧ください。
実行結果
「注文管理」アプリ
「取引先マスタ」アプリ
「注文管理」アプリ
まとめ
kintoneの基本機能のルックアップで、表計算ソフトのVLOOKUP関数と同様にマスタ側の情報を参照先アプリにコピーする動きは実現できます。
ただし表計算ソフトのVLOOKUP関数では、マスタ側の情報を変更すると参照先のデータも自動的に変更されますが、kintoneのルックアップは、マスタ側を更新してもコピー先の情報は自動的に更新されません。
これは、kintoneのルックアップが、あくまでルックアップの取得ボタンを押した時点の情報を、参照先アプリにコピーするという仕組みになっているためで、再度取得ボタンを押さないかぎり、最新の値に上書きされることはありません。
カスタマインでは、やること「他アプリのルックアップを取得しなおす」を用いることで、マスタ側アプリの情報変更に伴い、コピー先アプリの情報も自動で更新することができるようになります(課題1:「取引先マスタ」アプリの変更が、「注文管理」アプリに自動で反映されない)。
その一方、運用上の理由で特定条件の場合のみ、自動更新をしたいという要件も想定されます。その場合は、その条件に該当するレコードをやること「条件を組み立ててレコードを取得する」で取得し、やること「レコードを書き出す」で、条件に合致するレコードのみ最新の情報に更新するというカスタマイズを行えば実現することができます(課題2:「取引先マスタ」アプリの変更が、「注文管理」アプリの全てのレコードに自動で反映されてしまう)。
さらに、ルックアップでコピーするフィールドは、kintone の仕様により編集ができないよう無効化されます。ですが、必ずしもマスタの情報を書き換えずに、そのときだけ情報を変更したいという要件もあるかと思います。その場合はやること「フィールドを有効化する」で、任意のフィールドを編集可能な状態にすることができます(課題3:「注文管理」アプリの担当者名フィールドが編集できない)。
注意点として、個別にフィールドを編集することができるようになりましたが、マスタアプリでレコードの編集を行い、この時に自動更新のカスタマイズが動いた場合は、マスタ側の情報に上書きされてしまいます。
今回のシナリオでは、自動更新とフィールドの有効化のいずれの要件も残す必要性があり、折衷案として自動更新する対象のレコードかどうかを識別するためのチェックボックスをもうけ、チェックがついていないレコードのみ自動更新するカスタマイズに変更することにしました(課題4:「注文管理」アプリ上で変更した担当者名が、「取引先マスタ」アプリの情報に上書きされてしまう)。
おわりに
この記事では、kintoneとカスタマインによるカスタマイズで、表計算ソフトのVLOOKUP関数に似た動きとなるものを実現してみました。
どうでしたか? ぜひルックアップフィールドを使う際に不便に感じた時は、この記事のノウハウを検討してみてください!
また、ご不明点等ございましたら、チャットにてご質問ください!






















