ユーザー選択フィールドBからユーザー選択フィールドAのメンバーを除きたい

やりたいこと

ユーザー選択「申請者」(田中)
ユーザー選択「対応者」(田中,佐藤,中村)
というフィールドがあるとき、

ユーザー選択「回覧者」(佐藤,中村)
と計算されるよう、ユーザー選択「回覧者」の計算式をご教示いただけますでしょうか?


フェリスくんに聞いた結果

何度か聞いてみて以下の回答を得たのですが、うまくいきませんでした。
配列関係の計算式がよく分からず、申し訳ありませんがご回答をお願いします。

ARRAY_DEL(対応者, 申請者)
LET(
result, ARRAY_DEL(対応者, 申請者),
SET_CODE(result)
)

フェリスもまだ勉強中ですの温かい目で見てください。
ユーザー選択の値は、オブジェクトの配列なので扱いがちょっと面倒です。
下記のような感じ

"申請者":[{"code":"営業太郎","name":"営業太郎A"}]

ユーザーコードのみでセット

ARRAY_DEL で除外する場合は、下記のようにします。
ただし、これだとユーザー名も無くなってしまいます。
※ レコード保存でユーザー名も設定されます。

  ARRAY_DEL(
    SEL_CODE(申請者,"array"), 
    SEL_CODE(対応者,"array")
  )

ユーザーコードとユーザー名をセット

ということで、ユーザーコードとユーザー名を残すために、
ARRAY_FIL 関数で残すユーザーを判定します。

LET(
  ucode, SEL_CODE(対応者,"array"),
  ARRAY_FIL(申請者,xx, NOT(IN(ucode, DIC_ITEM(xx, "code"))))
)

フェリスの解説

こんにちは!rex0220 計算式アドバイザーのフェリスです。
2025年11月21日に生まれたばかりですが、計算式プラグインのことなら私にお任せください!

ご提示いただいた計算式について解説しますね。この式は**「申請者(ユーザー選択)の中から、対応者に含まれていない人だけを抽出する」**という高度な配列操作を行っています。


計算式の解説

LET(
  ucode, SEL_CODE(対応者, "array"),
  ARRAY_FIL(申請者, xx, NOT(IN(ucode, DIC_ITEM(xx, "code"))))
)

1. 変数 ucode の定義

SEL_CODE(対応者, "array")

  • 役割: 「対応者」フィールド(ユーザー選択)に選択されているユーザーのユーザーコードを、配列(リスト)形式で取得します。
  • 理由: ユーザー選択項目は表示名ではなく、一意の「コード」で比較するのが確実だからです。

2. 配列のフィルタリング (ARRAY_FIL)

ARRAY_FIL(申請者, xx, ...)

  • 役割: 「申請者」フィールド(ユーザー選択)の配列に対して、条件に合う要素だけを残します。
  • **変数 xx**: 申請者に含まれる各ユーザーの情報(オブジェクト)を一時的に xx として扱います。

3. 除外条件の判定

NOT(IN(ucode, DIC_ITEM(xx, "code")))

  • DIC_ITEM(xx, “code”): 申請者の各ユーザー(xx)から「ユーザーコード」を取り出します。
  • IN(ucode, …): そのコードが、最初に取り出した「対応者リスト(ucode)」の中に含まれているか判定します。
  • NOT(…): 「含まれている」を反転させ、**「対応者に含まれていない」**場合を真(True)とします。

結論:この式がやっていること

「申請者」の中にいる人のうち、「対応者」にも選ばれている人を除外し、残った人(対応者に選ばれていない申請者)のリストを作成する。

集合でいうところの「差集合(申請者 - 対応者)」を求めている計算式ですね。重複チェックや、特定のグループを除外したリストを作りたい時にとても便利なテクニックです!

他にも詳しく知りたい関数や、作ってみたい計算式のイメージがあれば、いつでも相談してくださいね。次は、この抽出した結果を使って何か別の処理をしてみますか?

ご丁寧に画像付きで解説いただき、ありがとうございます。

ユーザー名が表示される・されないまで計算式で指定できるのですね。
お陰様でやりたいことが実現できました。

最近はとりあえずフェリスくんに聞くことにしていますが、どうしても解決できないときはまた相談させてください。

迅速にご回答いただき、誠にありがとうございました。

「いいね!」 1

このトピックは最後の返信から 60 分が経過したので自動的にクローズされました。新たに返信することはできません。