【kintone/krewData】krewDataの出力アプリ設定で「値の重複を禁止するが有効になっている必要があります」とエラーが出る場合の解決法

こんにちは!

バックエンドエンジニアのコバックです。

バックエンド
エンジニア

コバック

今回は、最近案件で使用していたkrewData(kintoneプラグイン)についてお話をしたいと思います。

krewDataとは

今kintoneプラグインの一種で、アプリのデータはもちろん、
外部ファイルなどからもデータを取得し、集計・計算・出力などを行うことができます。

KrewData公式サイトはこちら

発生した現象

アプリA、B、Cがあります。

アプリAにある数値フィールドをアプリBのルックアップフィールドでキーとして参照しており、
さらにそのルックアップフィールドをアプリCのルックアップフィールドでキーとして参照しています。

なぜアプリCからアプリAへ直接ルックアップを行わないのかというと、
アプリCにてルックアップのリンクを押下した際、アプリBへ遷移してほしいからです。

また、大本となるアプリAの数値フィールドに、「値の重複を禁止する」というオプションを設定しておきます。

これを設定したフィールドは、レコード間で重複する値を登録できなくなるので、
レコードを特定するキーとして使用できるようになります。

この状態でkrewDataの出力アプリ設定にて、
アプリCの当該ルックアップフィールドを更新キーとして設定すると・・・

なんか怒られました。

直接のルックアップ先になっているアプリBにも「値の重複を禁止する」を設定する必要があるのかな?

アプリBの設定画面を開いて、ルックアップフィールドの設定を変更します。

「値の重複を禁止する」の設定項目がない・・・

どうやらルックアップフィールドには「値の重複を禁止する」を設定することができないようです。

どうしようもないので公式に問い合わせ

色々試してみましたがどうしようもなくなり、krewDataのサポートページから問い合わせることに。

数日後いただいた回答の要点をまとめると

  • ルックアップフィールドの値を変更(今回の場合、アプリCのルックアップフィールド)する際には、
    コピー元フィールド(アプリBのルックアップフィールド)の「値の重複を禁止する」を設定する必要がある。
  • これはkintone APIの仕様のため、変更することはできない。

詰みました。前述の通りルックアップフィールドには「値の重複を禁止する」を設定できないため、どうしようもありません。

代替案もいくつか添えていただいていましたが

  • アプリCからアプリAを直接参照する
  • これは前述の通り。アプリC→アプリBへ遷移できなくなるため×。

  • アプリCをルックアップフィールドではなく文字列(1行)にする。
  • アプリAの内容をルックアップで取得する必要があるため×。

と、いずれもやりたいこととは少しマッチしない内容でした。

仕方がないので妥協案を考える

できないことはできないので、妥協案を考えることに。

まず今回の必須要件と、変更不可の仕様を整理します。

    必須要件

  • アプリA→B→Cとルックアップフィールドで紐づけ、
    アプリCからアプリAの情報を取得できるようにする。
  • ルックアップフィールドのリンクを押下した際、
    アプリCからアプリB、アプリBからアプリAへ遷移できるようにする。
    変更不可の仕様

  • ルックアップフィールドの値を変更する場合、
    コピー元フィールドの「値の重複を禁止する」を設定する必要がある。
  • 「値の重複を禁止する」は数値や文字列フィールドにしか設定できず、
    ルックアップフィールドに設定することはできない。

まず、要件を満たすため、アプリA→B→Cのルックアップを解除することはできません。

そして、仕様のため、コピー元には「値の重複を禁止する」を設定する必要があり、
これはルックアップフィールドに設定することはできません。

つまり、
アプリ間のルックアップの関係性は保ったまま、アプリB→Cのルックアップ元を数値フィールドにすれば
実現できそうです。

とはいえアプリBのルックアップを解除するわけにもいかないので、
ルックアップでキーとして設定しつつ、同じ値をアプリBに新設した数値フィールドにセット。
アプリCのルックアップからはそちらを参照するようにしました。

新設した数値フィールドに「値の重複を禁止する」を設定することも忘れずに。

この状態でkrewDataの設定を再度確認すると・・・

無事エラーが消えました!

実際に出力してみても問題なく、
アプリC→B→Aとルックアップのリンクを押下して遷移することも可能に。

目的を達成できた代償として、アプリBにルックアップフィールドの内容と重複するフィールドが増えてしまいましたが、

アプリの最下部に【krewData集計用】みたいな名前をつけて置いておいてもいいし、JSやプラグインで非表示にしてもいいし、

そこまで影響は大きくないのではないかと思います。

最後に

kintoneやkrewDataはすごく便利で使いやすいツールですが、こんな感じで仕様の壁にぶつかることもよくあります。

それをうまく回避しながら、最小の影響で要件を満たす方法を考える必要があり

そこが難しくも面白いところだなと思います!

ロジカルスタジオではエンジニアを募集しています。

気になる方は↓こちら↓をチェック!!