公開日:2025-04-21
はじめに
サポートの沖です。
保存時の重複チェックにはいろいろな方法があると思います。1つのフィールドだと簡単なのですが、複数フィールドだったりテーブルが絡むと設定というか考え方がややこしくなります。
kintoneからAPIを利用してレコードを取得した場合はテーブルの構造を間違えやすいのですが(value多すぎ問題)、カスタマインではその辺をあまり意識せずにフィールド値の取得が可能です。カスタマインはこちらから試用可能ですので、未体験の方はお試しください。


では、色々なパターンを確認してみましょう。
1フィールドの値が同一
普通はフィールドに重複禁止を設定するのが簡単です。

しかし文字列の自動計算がある場合は重複禁止の設定が出来ません。

このように、重複禁止が設定できない場合は以下のような設定にすると可能になります。

追加画面で保存した時だけ、キーの値が同一のレコードが既に存在していれば重複ありと判定しています。追加画面だけにしておかないと、保存済みレコードを編集保存した時に自レコードが対象になって保存できなくなる為です。
ただ、この設定だと本当は出来てはいけないのですが、編集画面でキーの値を変更するような場合に重複チェックが実行されません。そのようなケースに対応する場合は「条件を組み立ててレコードを取得する」に変更して自レコード以外という指定にします。

ここで、詳しい人は「ん?」と思うかもしれません。というのも追加画面でレコードの保存直前だとレコード番号はまだ存在しないからです。存在しないものを値に指定だとどうなるのかというと、「kintoneアプリのカスタマイズ」の仕組みとしては空欄になります。(なお、「kintoneアプリのWebhook」だとエラーになります)
クエリの例はこんな感じです。
> query: (キー = “え”) and (レコード番号 != “”) limit 500 offset 0
編集画面で保存すると、以下のようなクエリになりレコード番号が入ります
> query: (キー = “え”) and (レコード番号 != “5”) limit 500 offset 0
重要な点でもありますので、色々と設定を変えてお試しいただくのも良いかと思います。
複数フィールドの値が同一
いわゆる複合キーになるので、文字列の自動計算で結合した値を保存しておけば上記の設定でも可能です。
ただ、そのようなフィールドを追加できない場合は、「条件を組み立ててレコードを取得する」の検索条件で対象の複数フィールドを全て指定することで対応できます。

この時の検索条件は以下のように全ての条件を満たすという内容になっています。

この条件ビルダーでは「いずれかの条件を満たす」と「全ての条件を満たす」を組み合わせることも可能です。以下の例では複数の組み合わせで指定をするグループのどちらかに一致した場合になります。なお、下画像の設定内容に、あまり意味はありません。あくまで組み合わせの例となります。

1フィールドの値が別アプリのテーブル内の1フィールドの値と同一
このような構成でチェックをするケースです。

この場合でも、[1フィールドの値が同一]の時と設定は同じです。なので、設定画像は省略します。設定の違いとしては、テーブル外のフィールド同士ではなく、検索先がテーブル内のフィールドになることです。
ただ、その検索結果はテーブル行のどこかに指定の値があるレコードを取得になります。取得できるのはあくまでレコードで、そのレコード内のテーブル行のどこかに一致する値がある、という状況ですので、画像のような例で商品名が一致する行の単価を利用したいような場合は更に「取得したレコードを絞り込む」が必要です。
今回はどの行にあっても重複とするので、レコード数が0件か1件以上かという判定で可能ということになります。
テーブル内の1フィールドの値が別アプリのテーブル外の1フィールドの値と同一
先ほどとは逆パターンです。関係性としては以下の画像のような感じです。

文字では難しい感じですが、以下のページのようにテーブルの1行の値が別アプリのレコード1行と対応しているようなケースです。
テーブルを別アプリのレコードに書き出し、常に同期を取る方法
今回の場合は、この1行の値がどこかのレコードにあればエラーという扱いなので、テーブル内のフィールドの値を全行分指定でレコード取得で可能になります。

1番の検索条件では、比較演算子は「次のいずれかを含む」にしてください。そうすると設定画像のように「q 関数」が自動的に追加されます。そして、カスタマイズ実行時にはq関数によって以下のようなクエリになります。
query: 商品名 in (“商品1”, “商品2”) limit 500 offset 0
これにより、テーブル内のどこかの行のフィールド値と等しいレコードを全て取得になります。
テーブル内の複数フィールドの値が別アプリのテーブル外の複数フィールドの値と同一
先ほどの設定とほぼ同じですが、キーとなるフィールドが複数のケースです。例えば、上の画像の組み合わせだと同一のものが存在しますが、下の画像の場合は商品名と単価が同一のレコードは無いので保存できます。

この場合、先ほどと同じように「次のいずれかを含む」を必要数だけ設定すれば可能のようにも思いますが、その指定だと正しくレコード取得ができません。
先ほどの設定をまねて、単純にフィールド単位で条件を追加するとこんな感じ。
query: (商品名 in (“商品1”, “商品2”)) and (単価 in (“500”, “800”)) limit 500 offset 0
ただ、このクエリだと上の画像のケースでもレコードが取得できるので保存キャンセルになってしまいます。本当は下の画像のようになって欲しいので、クエリはこうじゃないといけないわけで。。。
query: (商品名 in (“商品1”) and 単価 in (“500”)) or (商品名 in (“商品2”) and 単価 in (“800”)) limit 500 offset 0
これを生成するのは。。。編集画面でフィールドを使ってクエリ生成という方法もありますが、無理矢理過ぎるので素直に複数フィールドの値を結合したフィールドを用意しましょう。そうすると、先ほどの仕組みと同じになります。
ただ、そのようなキーを用意できない、という場合は、「リストから要素を取り出す」を使ってテーブル行毎にレコード取得をして、レコードがあればテーブル外のフィールドにフラグを立てておいて、リストの処理が終わったらフラグ有りだとキャンセルにするという仕組みも可能です。
・・・まぁ仕組みとしては作成可能ですが、難易度はかなり高いので、やっぱり結合した文字列を用意してもらうのが確実ですね。
テーブル内の1フィールドの値が他レコードのテーブル内のどこかの行と同一
・・・何それ?
通常のフィールド1つの重複禁止のようなことを、テーブル1行のフィールドでも実現したいというケースですね。重複判定はアプリの全レコードではなく、テーブル外に案件番号があったり場所などを特定する値があったりで、その条件に一致するレコード内で判定するようなイメージです。
以下のようなレコードとテーブルがある場合に、テーブル内の商品名に同一の値がある場合にレコード保存できなくなるという動きです。

この場合も、テーブル内フィールドを検索対象にして、比較演算子は「次のいずれかを含む」にしてから、値にはテーブル内フィールドを指定すればレコードが取得可能です。
設定は今までと見た目が同じなので省略します。
最後に
kintoneではテーブル内フィールドを検索できるのと、カスタマインの「q 関数」をうまく使うことで検索出来るパターンを増やすことが出来ます。それにより重複判定の幅も広がりますので、いろいろなパターンをお試しください。
念のために再度、カスタマインのお試し用のリンクを置いておきます。


他にも色々なテーマを用意していますので、リクエストがあれば優先してブログ化出来るかも?
ではまた、次の機会にー
投稿者プロフィール

-
"サイボウズ公認kintoneエバンジェリスト
カスタマインやデプロイットでも色々とやってます"
最新の投稿
gusuku2025年4月21日「保存時に重複していたら保存キャンセル」を色々と試す
gusuku2025年4月4日「recordsでWebhook通知」を検知してみよう!
gusuku2025年3月21日デプロイットの機能を確認しよう レコードのバックアップとリストア編
aws2025年3月7日JAWS DAYS 2025に行ってみた!