Kintoneでの複数列組み合わせへの一意性制約実装

Native Kintoneの世界における、プラグインなしJavaScriptで出来る複数列組み合わせの一意性制約実現コードの紹介。

課題

Kintoneでは一つ一つの列に「値の重複を禁止する」設定を施せばそれぞれの列を一意に(ユニークに)出来るが、この設定では複数列組み合わせでの一意性制約は実現出来ない。

例えばアプリに建物とフロア(1階、2階、3階….)の関係性を持たせたい場合。

「建物ID:1234」⇒「フロア:1階」の行や「建物ID:1234」⇒「フロア:2階」や「建物ID:1235」⇒「フロア:1階」の行を一行ずつ載せたく、同じ建物であれば同じフロアを重複登録出来ないようにしたいから、仕組的にどうにかしたいというのがトピックであり、これをプラグインなしで実現したいのが前提条件である。

対策例

1.建物ID、フロア列を持つアプリにID列を設け、「値の重複を禁止する」にチェックを入れておく。

2.レコード作成時/更新時に自動的に建物IDと建物名を結合した値がID列に入るよう、JavaScriptで更新する。具体的には以下コードをupdate_id.jsファイルに保存(UTF-8 BOMなし)する。

3.管理者としてKintoneにログインし、当該アプリの設定画面から「JavaScript / CSSでカスタマイズ」を選択し、PC用にもスマートフォン用にもアップロードして保存する

4.アプリを更新する。

この方式であれば、record.ID.value = … の部分を編集すれば列数が増えても対応出来るし、他の列にも値を入力したければそれ用の処理行を足せば済む。

注意事項

結合に用いる文字

例では _(アンダースコア)の記号を使って建物IDとフロアを結合しているが、仮に建物IDやフロアに _(アンダースコア)を使っていれば一意制約が正常動作しなくなる場合がある。

究極的には結合元の列に使わない記号で結合すれば複数列による一意制約をかけられるため、取り扱うデータに応じて結合に用いる記号は変えること。

JavaScriptで利用する列名

JavaScriptコードで指定するのは、画面表示に用いる「フィールド名」の値ではなく「フィールドコード」に用いる値である

上述の「ID」で言えば、下図の通りフィールドコードの内容が record.ID.value で用いる列名と一致するよう確認すること

Kintoneのコーディングガイドラインへの適合

https://cybozu.dev/ja/kintone/docs/guideline/coding-guideline

Kintoneのコーディングガイドラインに適合した書き方にすること。

適合しない場合、Kintoneの既存機能や将来のアップデート時に不具合が生じ易いのだが、ちまたには本来Kintone開発に不要なライブラリインストールが手順に載っていたり、動作はするもののコーディングガイドラインを無視して例示しているものがあるため本番利用に向けては注意して欲しい。

不安になった場合はCopilotやGeminiなど生成AIにコードを添えて質問。『引用したJavaScriptコードはリンク先URL:https://cybozu.dev/ja/kintone/docs/guideline/coding-guideline/ のコーディングガイドラインに適合していますか。していない場合は適合するよう修正したコードを示してください』のように修正してもらうと良いだろう。