dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

follow us in feedly

[Salesforce] 入力規則で「行動」の名前/関連先に特定のSObjectしかひもづけられないようにする

Apex 無しで実現できるか?と思って調べてみたらできた。

やり方

入力規則にこんな感じで入力する。

# 例) 名前にリードを指定した時にエラーにしたい場合
LEFT(WhoId, 3) = '00Q'

ちょっとだけ解説

Salesforce のレコードの先頭3文字は SObject の種類を識別する prefix になっていることを利用。
(prefix は組織によらないので決めうちでもまあなんとかなりますね)

prefix は各 Sobject のタブをクリックした URL から取得するか、
開発者コンソールで

[prefixを取得したいSObject].SObjectType.getDescribe().getKeyPrefix();

としてもいいです。

応用編

さて、次はこんなことができるか考えてみる。

ロスト済みの商談は行動にひもづけることができない

先ほどと違い、 WhoId/WhatId だけでなくその Id が示す Sobject のレコードを実際に取得する必要がある。
で、調べてみたんだけどこれはさすがに無理そう。。。

以下、調べた記録。

VLOOKUP 関数

入力規則で使える関数の中に、VLOOKUP というのがあった。

参考: Formula Operators and Functions I – Z

VLOOKUP

  1. 特定の field を検索対象として
  2. 特定の SOjbect のレコードを検索し
  3. レコードが見つかったら、指定した項目 (1.とは別で良い) を返す

ことができるという大変便利なもの。

が、カスタムオブジェクトにしか使えない という制限が。。。
( IdeaExchange に早く標準オブジェクトに対応しろ!ってのがありますね)

カスタムオブジェクトなら可能なのか

ということで、さらにこんなことができるか考えてみる。

カスタムオブジェクト MyObj を活動にひもづける場合、Status__c という項目が '完了' になっているものは許可しない

これも結論から言うと できない みたい。

というのも、VLOOKUP

VLOOKUP(field_to_return, field_on_lookup_object, lookup_value)

field_to_return: 返す field
field_on_lookup_object: SObjectの検索対象の field
lookup_value: 検索値

という書き方をするのだけれど、この field_on_lookup_object という部分、
実際には Name しか指定できない みたい。

Name 以外を指定すると、

f:id:dackdive:20150203193832p:plain

と怒られちゃいました。。。

VLOOKUP のサンプル

件名に一致するカスタムオブジェクト MyObjStatus__c を取得する。

VLOOKUP(
  $ObjectType.MyObj__c.Fields.Status__c,
  $ObjectType.MyObj__c.Fields.Name,
  Subject)

VLOOKUP の注意事項

最後に、公式リファレンスから注意点を抜き出し。

  • field_to_return のデータ型は、自動採番、積み上げ集計、参照関係、主従関係、チェックボックス、日付、日時、メール、数値、パーセント、電話番号、選択リスト、テキスト、テキストエリア、または URL にする必要があります。
  • field_on_lookup_object は、カスタムオブジェクトの [レコード名] 項目にする必要があります。
  • field_on_lookup_objectlookup_value は、同じデータ型にする必要があります。
  • 一致するレコードが複数ある場合は、最初のレコードの値が返されます。
  • 返される値は、カスタムオブジェクトのものであることが必要です。
  • この関数で参照されるカスタム項目またはカスタムオブジェクトは削除できません。
  • この関数は、入力規則でのみ使用できます。

というわけで、すごく便利そうに見えて色々使い勝手の悪い VLOOKUP でした。

リファレンス

Event - Make Related To Required Field via Validation Rule - Answers - Salesforce Success Community

VLOOKUP explanation needed with example - Answers - Salesforce Success Community