Mark Hammer's Blog

SalesforceやTrailheadに関する情報を投稿しているブログです。

Trailhead モジュール:Field Service Dispatcher Console for Dispatchers

※この内容は2022/5時点のものです。

Take a Field Service Journey

https://trailhead.salesforce.com/ja/content/learn/modules/field-service-dispatcher-console-for-dispatchers/take-a-field-service-journey

  • 説明:英語
  • Challenge:英語選択問題

Explore the Dispatcher Console

https://trailhead.salesforce.com/ja/content/learn/modules/field-service-dispatcher-console-for-dispatchers/explore-the-dispatcher-console

  • 説明:英語
  • Challenge:英語選択問題

Customize Your View

https://trailhead.salesforce.com/ja/content/learn/modules/field-service-dispatcher-console-for-dispatchers/customize-your-view

  • 説明:英語
  • Challenge:英語ハンズオン

Challenge要約

事前作業:2番目のUnit(Explore the Dispatcher Console)の説明通り、Field Serviceのパッケージインストールとサンプルデータ入りのDeveloper Edition組織のサインアップとTrailheadへの紐づけを行ってください。

  • 以下の内容で新規パレットを作成してください。
    • 名前:Short Jobs
    • 次に基づく:所要時間(分)
    • 最小値:0
    • 最小値の色:#797dc8
    • 最大値:120
    • 最大値の色:#d2d179
    • 色の数:4
    • 有効にチェックを入れる
  • ガントチャートを更新し、Short Jobs パレットを適用してください。

Manage Service Appointments

https://trailhead.salesforce.com/ja/content/learn/modules/field-service-dispatcher-console-for-dispatchers/manage-service-appointments

  • 説明:英語
  • Challenge:英語選択問題

Handle the Unexpected

https://trailhead.salesforce.com/ja/content/learn/modules/field-service-dispatcher-console-for-dispatchers/handle-the-unexpected

  • 説明:英語
  • Challenge:英語ハンズオン

Challenge要約

  • 以下の内容でリソースの不在を設定してください。
    • 時間:60分
    • 理由:Medical
    • ガントチャートの表示ラベル:Dentist appointment
    • ガントチャートの配置場所:James Clifton の明日の予定(筆者注:おそらく日時は不問)

Trailhead モジュール:Record-Triggered Flows

※この内容は2022/5時点のものです。

Get Started with Triggered Flows

https://trailhead.salesforce.com/ja/content/learn/modules/record-triggered-flows/get-started-with-triggered-flows

  • 説明:英語
  • Challenge:英語選択問題

Build a Record-Triggered Flow

https://trailhead.salesforce.com/ja/content/learn/modules/record-triggered-flows/build-a-record-triggered-flow

  • 説明:英語
  • Challenge:英語ハンズオン

    Challenge要約

  • 以下の通りレコードトリガフローを作成してください。
    • オブジェクト:商談(Opportunity)
    • トリガを設定:レコードが作成または更新された
    • エントリ条件を設定:
      • 条件の要件:すべての条件に一致(AND)
      • 条件1:
        • 項目:フェーズ(StageName)
        • 演算子:次の文字列と一致する
        • 値:Negotiation/Review
      • 条件2:
        • 項目:金額(Amount)
        • 演算子:より大きい
        • 値:100000
    • 更新されたレコードでフローを実行するタイミング:条件の要件に一致するようにレコードを更新したときのみ
    • フローを最適化:レコードを作成できるオプションを選択してください
  • フローに以下の要素を追加してください。
    • 要素:レコードを作成
      • 表示ラベル:Create Email Task
      • API参照名:Create_Email_Task
      • 説明:Create a task for the opportunity owner to send a follow email to the account owner today (実際には文言はチェックしません)
      • 作成するレコード数:1
      • レコード項目の設定方法:フローをトリガーしたレコード以外のレコードを参照できるオプションを選択してください
      • オブジェクト:ToDo(Task)
      • ToDoの項目値を設定:
        • 項目:件名(Subject)、値:Follow up with the account owner by email(実際には文言はチェックしません)
        • 項目:期日のみ(ActivityDate)、値:今日の日付(実際は日付が入っていることのみチェックします。任意の日付で問題ありません。)
        • 項目:割り当て先ID(OwnerId)、値:$Record>所有者ID(OwnerId)
        • 項目:関連先ID(WhatId)、値:$Record>取引先ID(AccountId)
  • 作成したフローを以下の通り保存してください。
    • フローの表示ラベル:Review Opportunity with Account Owner
    • フローのAPI参照名:Review_Opportunity_with_Account_Owner
    • 説明:When a high-value opportunity is ready for negotiation and review, create a task for the owner to follow up with the account owner (実際には文言はチェックしません)

Add a Scheduled Task to Your Flow

https://trailhead.salesforce.com/ja/content/learn/modules/record-triggered-flows/add-a-scheduled-task-to-your-flow

  • 説明:英語
  • Challenge:英語ハンズオン

Challenge要約

筆者注:このChallengeは前のChallangeに成功してから行ってください。

  • 前のChallengeで作成したフローに以下の通りスケジュール済みパスを追加してください。
    • フロー:Review Opportunity with Account Owner(前のChallangeで作成したフロー)
    • パスの表示ラベル:3 Days After Last Modified Date
    • API参照名:X3_Days_After_Last_Modified_Date
    • 時間取得元:Opportunity:最終更新日
    • オフセット数:3
    • オフセットオプション:日後
  • 作成したスケジュール済みパスに以下の要素を追加してください。
    • 要素:レコードを作成
      • 表示ラベル:Create Phone Call Task
      • API参照名:Create_Phone_Call_Task
      • 説明:Create a task for the opportunity owner to check in with the customer by phone (実際には文言はチェックしません)
      • 作成するレコード数:1
      • レコード項目の設定方法:フローをトリガーしたレコード以外のレコードを参照できるオプションを選択してください
      • オブジェクト:ToDo(Task)
      • ToDoの項目値を設定:
        • 項目:件名(Subject)、値:Outreach phone call(実際には文言はチェックしません)
        • 項目:説明(Description)、値:Call to check in with the customer(実際には文言はチェックしません)
        • 項目:期日のみ(ActivityDate)、値:今日の日付(実際は日付が入っていることのみチェックします。任意の日付で問題ありません。)
        • 項目:関連先ID(WhatId)、値:$Record>商談ID(Id)
        • 項目:割り当て先ID(OwnerId)、値:$Record>取引先ID(Account)>所有者ID(OwnerId)
  • フローを保存してください。

Meet Flow Trigger Explorer

https://trailhead.salesforce.com/ja/content/learn/modules/record-triggered-flows/meet-flow-trigger-explorer

  • 説明:英語
  • Challenge:英語選択問題

Trailhead モジュール:アンケートの基本

※この内容は2022/5時点のものです。

初めてのアンケートの準備

https://trailhead.salesforce.com/ja/content/learn/modules/survey-basics/prepare-for-your-first-survey

  • 説明:日本語
  • Challenge:英語ハンズオン

Challenge要約

  • 「アンケートの設定」からアンケートを有効化してください。
  • 共有設定にて「アンケート」と「アンケートへの招待」の共有設定を「非公開」にしてください。

アンケートの作成

https://trailhead.salesforce.com/ja/content/learn/modules/survey-basics/build-your-survey

  • 説明:日本語
  • Challenge:英語ハンズオン

Challenge要約

  • 新しいアンケートを作成してください
    • 名前:Solar Panel Feedback Survey
  • 参加者向けのお知らせページを無効化してください
  • 以下の通り1番目のページを作成してください。
    • ページ名:Solar Panel Installation
    • 質問1:
      • 種別:評価
      • 質問:Rate your experience with the solar panel installation.
    • 質問2:
      • 種別:ロングテキスト
      • 質問:Tell us what didn’t go well with the installation.
  • 以下の通り2番目のページを作成してください。
    • ページ名:Score Solar Panel
    • 質問1:
      • 種別:スコア
      • 質問:Score our solar panels.
  • 以下の通り3番目のページを作成してください。
    • ページ名:Low Score Details
    • 質問1:
      • 種別:ロングテキスト
      • 質問:Tell us why you rated our solar panels.
  • 質問「Score our solar panels.」の回答を質問「Tell us why you rated our solar panels.」の質問文の中に挿入してください。
  • お礼ページに感謝のメッセージを入力してください。
  • 感謝のメッセージの最後に画像を挿入してください。
  • アンケートを保存してください。

アンケートへのロジックの追加

https://trailhead.salesforce.com/ja/content/learn/modules/survey-basics/add-logic-to-survey

  • 説明:日本語
  • Challenge:英語ハンズオン

Challenge要約

注意:このチャレンジに取り掛かる前に、前のチャレンジを成功させてください。

  • 「Solar Panel Installation」ページに以下の内容で2つ目の質問の表示ロジックを作成した後、保存してください。
    • 条件を選択:すべての条件に一致
    • 質問:Rate your experience with the solar panel installation.
    • 演算子:次の値以下
    • 回答:3
  • 「Score Solar Panel」ページに以下の内容で分岐ロジックを作成した後、保存してください。
    • ページに移動:条件に基づく
    • ページを選択:お礼ページ
    • 条件を選択:すべての条件に一致
    • ロジック種別:質問に回答
    • 質問:Score our solar panels.
    • 演算子:次の値以上
    • 回答:4
  • アンケートを保存し、有効化してください。

アンケートの送信と追跡

https://trailhead.salesforce.com/ja/content/learn/modules/survey-basics/send-out-and-track-your-survey

  • 説明:日本語
  • Challenge:英語ハンズオン

Challenge要約

注意:このチャレンジに取り掛かる前に、前のチャレンジを成功させてください。

  • アンケートへの招待リンクを生成してください。

ドメインにSPF、DKIMを設定してSalesforceから送信するメールから「経由」を外す

はじめに

Salesforceからメールを送信する場合、メールアクションやリストメールによる送信を行うことはよくあると思います。
しかし、「なりすましメール」と判定されないように気をつけなければなりません。

「なりすましメール」は、攻撃者がメールの差出人(From)を知り合いや信用できる人、または実在する機関のものに変更し、受信者をだましてリンクのURLや添付ファイルにアクセスさせるものです。 ent.iij.ad.jp

通常、会社のアドレスからメールを送信する場合、会社が設置したメールサーバを通じてメールを送信しますので正しく受信されるはずです。
しかしSalesforceサーバを介して会社のアドレスを差出人としたメールを送る場合、外部からは「Salesforceのサーバから別のドメインのメールが送られている」と見えるため、「なりすましメール」と判定される場合があります。

これを避けるため、Salesforce側では「SPF(Sender Policy Framework)」「DKIM(DomainKeys Identified Mail)」の設定方法を案内しています。
SPFでは「このドメインのアドレスを差出人としたメールはSalesforceサーバを介することもある」ことを示すことで、DKIMでは送信メールの電子署名で「なりすましメール」ではないことを示します。

ここでは、Salesforceサーバを介して自分/会社が保有するドメインからメールを送る際のSPF、DKIMの設定方法、及びメールの見え方を記載します。

なお、今回はSales Cloud、Service Cloudが対象です。Marketing Cloud系製品(旧Pardot含む)等は扱いません。

実際にSPF、DKIMを設定してみる

準備

まずは独自ドメインのメールの送受信ができる環境を作る必要があります。
今回は検証ができればいいので、以下のブログを参考にZoho MailのFreeプランを選びました。 yoshidashingo.hatenablog.com

メール送受信用ドメインはサブドメインをつけて mail.markhammer.net にします。
メール送受信ができるようになった時点でのDNSサーバの状況は以下です。

  • SPF
    • mail.markhammer.net. 3600 IN TXT "v=spf1 include:zoho.jp ~all"
  • DKIM
    • なし

SPFレコード設定

ここからヘルプを参考にSalesforceサーバをSPFレコードに追加します。
追加後のSPFレコードは以下になります。

mail.markhammer.net. 3600 IN TXT "v=spf1 include:zoho.jp include:_spf.salesforce.com ~all"

SPFレコード自体はテキスト編集で変更できますが、正しく変更できているか(スペースの抜けなどがないか)はチェックできないので、以下のようなSPFチェッカーで確認することをお勧めします。 mxtoolbox.com

DKIM設定

DKIMはSalesforce側の設定とDNSサーバの設定両方必要になります。

Salesforce側の設定その1
  • 設定|DKIM鍵 より「鍵を新規作成」をクリック
  • 以下設定を行い、「保存」をクリック
    • 鍵サイズ:1024ビット/2048ビット
      • 注意書きの通り、業界固有のセキュリティ規制またはメール受信者の制限を考慮する必要があります。セキュリティ強度が高いのは2048ビットです。
    • セレクタ、代替セレクタ:DKIM鍵を識別する一意の名前。何でもいいですが、既存のDKIM鍵があるドメインの場合は被ってはいけません。またセレクタと代替セレクタの名前も被ってはいけません。
    • ドメイン:DKIM鍵を設定するドメイン。今回の場合は markhammer.net で設定しますが、 mail.markhammer.net と設定してもOKです。詳細は後述。
    • ドメイン一致:正確なドメインのみ・ドメインのサブドメインのみ・正確なドメインとサブドメイン の中から選びます。
      • 正確なドメインのみ:「ドメイン」項目で設定したドメインのみに適用。今回の場合は @markhammer.net のみに適用され、 @mail.markhammer.net には適用されません。
      • ドメインのサブドメインのみ:「ドメイン」項目で設定したドメインのサブドメインのみに適用。今回の場合は @mail.markhammer.net のようなサブドメインがついたアドレスのみに適用され、 @markhammer.net には適用されません。
      • 正確なドメインとサブドメイン:今回の場合は @markhammer.net@mail.markhammer.net 両方に適用されます。
    • なお、一度保存すると「ドメイン一致」以外の項目は編集できません。それ以外の項目を編集したい場合は新規作成することになります。念のため使わない方は削除しましょう。
  • 鍵を作成後、しばらく待つとDKIM鍵適用のためのCNAMEレコードが表示されます。なおDNSサーバ側にCNAMEレコードが追加されるまで「有効化」ボタンは押せません。

ここまで完了したSalesforce設定画面

DNSサーバ側設定

上記でSalesforce側に表示された「CNAME レコード」と「代替 CNAME レコード」を登録します。

Salesforce側の設定その2

CNAMEレコードの追加がSalesforce側から確認できるとDKIM鍵を有効化できるようになるので「有効化」ボタンを押します。

有効化後の設定画面

注意事項

DNSレコードの追加・更新はDNSキャッシュの更新が必要となる場合があるため、設定から反映を確認するまで一定の時間がかかる場合があります。
DNSキャッシュについては以下のページも参照ください。 www.nic.ad.jp

設定前後の受信メール画面

以下、全てブラウザでのgmail上の表示です。

SPF、DKIMなし

差出人をgmailアドレスにしてSalesforceからメールを送信した場合、当然SPF、DKIM設定はできません。
ここでは「同じアカウントからのメールだがgmailのものではない」と判定されたのでなりすましメールの警告メッセージが表示されます。

SPF、DKIMなしのメール受信時画面

SPFあり、DKIMなし

DNSにてSPFレコードのみ設定した場合、Salesforceサーバから送信したことを示す「経由」は表示されます。

SPFあり、DKIMなしのメール受信時画面

SPF、DKIMあり

さらにDKIMも設定完了した場合は「経由」も消え、画面上からではSalesforceサーバから送られたことが分からなくなります。*1

SPF、DKIMありのメール受信時画面

おわりに

ちなみにZoho Mail側では「SPFあり、DKIMなし」の状態でもZoho Mailの設定を緩和しなければSalesforceサーバからのメールを受信できませんでした。
Salesforceサーバを介してメールを送信する場合は、迷惑メール判定や受信拒否を受けないようSPF、DKIMの設定を行うことをお勧めします。

追記(サブドメイン指定について)

メールアドレスのドメインが今回の@mail.markhammer.netのようなサブドメインありの場合、以下いずれの設定でもDKIM鍵は適用されます。

  • ドメインに markhammer.net 、ドメイン一致に「ドメインのサブドメイン」、または「正確なドメインとサブドメイン」
  • ドメインに mail.markhammer.net 、ドメイン一致に「正確なドメインのみ」、または「正確なドメインとサブドメイン」

*1:さすがにメールヘッダを見ればSalesforceサーバから送られたことは分かります。

Lightning環境で「私の個人情報」メニューの一部がアクセス不可になる

事象

Lightning環境にて画面右上のアイコン→設定をクリックし、「私の個人情報」内のメニューをクリックした際に一部のメニューが「アクセス権がありません」エラーとなる。
システム管理者権限を持っていても発生する。

実際のエラー画面

対象メニュー

  • セキュリティセントラル
  • ログイン履歴
  • 承認者の設定
  • 接続
  • 言語とタイムゾーン

原因

設定→ユーザインターフェース→ユーザインターフェース にて「新改良型設定ユーザインターフェースを有効化」にチェックがない場合に発生します。

「ユーザインターフェース」設定画面

最近作成した組織であればこの項目はチェックが入っているはずですが、古い組織の場合はチェックがないまま使い続けている場合があります。

回避策

「新改良型設定ユーザインターフェースを有効化」にチェックを入れればアクセス可能になります。
また、エラー対象となるメニューの内容は「高度なユーザの詳細」でも確認できますので、そちらを代用する方法もあります。

Trailhead モジュール:認定アドミニストレーター資格の更新 (Spring '22)

※この内容は2022/4時点のものです。

Spring '22 での認定アドミニストレーター資格の更新

https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-maintenance-spring-22/maintain-your-administrator-certification-for-spring22

  • 説明:日本語
  • Challenge:英語ハンズオン

【Challenge要約】

※このChallengeにはSalesforce社による日本語訳があります。

  • ToDoオブジェクトに以下の通り制限ルールを作成してください。
    • ルール名: Keep Tasks Private
    • 氏名: Keep_Tasks_Private
    • ユーザ条件:
      • 項目: ユーザ→有効
      • 演算子: 次の文字列と一致する
      • 種別: Boolean
      • 値: True
    • Record Criteria
      • 項目: 割り当て先 ID (User)→ユーザ ID
      • 演算子: 次の文字列と一致する
      • 種別: 現在のユーザ
      • 値: ユーザ ID
    • 有効にチェックを入れて保存してください。

Lightning Experience環境のレポート条件に表示される「選択された参照オブジェクト」とは

はじめに

最近このような質問を受けました。

レポート条件に「選択された参照オブジェクト」という値が設定されているが、これが何なのか分からない。

実際のキャプチャ

確かに「選択された参照オブジェクト」以外何も情報がないので、困ってしまいました。

Lightning画面とClassic画面の違い

そこで、何の気もなしにClassic画面に変更すると…

Classicでの画面

レポート検索条件ではなく、標準での表示機能で「キャンペーンを選択」を選び、特定キャンペーンを選択した状態であることが確認できました。
これはレポート検索条件で「キャンペーン名」を設定した時と同様、キャンペーンでの絞り込みができます。
また、Lightning環境でもClassic環境と同じレポートは表示されますが、どのキャンペーンで絞り込んだかの情報は一切表示されません。

この動作の影響

この動作が問題となるのは、Classic環境からLightning環境へ切り替え、かつClassic環境に戻せないよう制限をかけたときです。
この場合、該当レポートがどのような絞り込みを行っているかを確認する術はないため、一時的にClassic環境に戻せるよう設定を変更するか、「表示」を「選択された参照オブジェクト」から別の選択肢に変更したうえで新たにレポート検索条件を設定するしかなさそうです。

このような動作である以上、Lightning環境への移行を考えている方は「表示」欄にて絞り込みを行うのではなく、レポート検索条件で絞り込みを行うことをお勧めします。

Lightningでユーザを力技でコピーしたい

はじめに

今回の検証のきっかけはこちらの投稿です。 sf.forum.circlace.com

ユーザはLightningでコピーできるのか、機能を試すという意味で興味を持ったのでやってみることにしました。

検証

実現可否の確認

※以下Salesforce URLは https://mydomain.lightning.force.com/... とします。実際に使用する際はURLはご自身の組織URLに読み替えてください。

まず前提として、LightningでcloneURLパラメータは使えません
以前業務で必要になってSalesforce社に問い合わせたのですが、「無理」という回答でした。

そのため、Lightningでコピーをするには defaultFieldValues を用いて必要な項目を1つずつ指定する必要があります。
参考:Salesforceヘルプ:デフォルト項目値を含むレコード作成ページの起動

次に、ユーザ新規作成画面で defaultFieldValues URLパラメータが使えるかを検証します。
一般的にユーザを新規作成する際は 設定|ユーザ|ユーザ の画面から「新規ユーザ」をクリックしますが、その時のURLは以下のように独特です。

https://mydomain.lightning.force.com/lightning/setup/ManageUsers/page?address=%2F005%2Fe%3FretURL%3D...

試しにこのURLに defaultFieldValues URLパラメータを追加したのですが、全く効きませんでした。

次に、先述したブログの「検証 2 カスタムリンクの作成→Lightningの場合」に記載された新規ユーザ画面に注目します。
この画面は https://mydomain.lightning.force.com/lightning/o/User/new にアクセスすれば表示されます。

もう1つの新規ユーザ画面

しかし、この画面にはユーザ作成に必要なプロファイル等の項目が配置されていないので、ユーザを作ろうとしてもエラーになります。

エラー画面

項目がないならページレイアウトで追加すればいいじゃない、ということで該当ページのページレイアウトを探します。
すると、ユーザオブジェクト設定にある「ユーザプロファイルページレイアウト」が該当ページのページレイアウトであることを確認しました。

ユーザプロファイルページレイアウト編集画面

ここまで確認できれば、このページレイアウトに必要な項目を配置し、 defaultFieldValues URLパラメータで必要項目を設定すればできるのでは、ということで試してみることにしました。

ユーザコピーを行う

まず、ユーザプロファイルページレイアウトに以下項目を配置します。

  • 名前
  • 別名
  • メール
  • ユーザ名
  • ニックネーム
  • プロファイル
  • メールの文字コード
  • タイムゾーン
  • 地域
  • ロール(必須ではない)
  • 有効(必須ではない)
  • その他必要な項目

なお、ユーザ作成には上記項目の他「言語」項目も必要ですが、ユーザプロファイルページレイアウトにはなぜか配置できません。
そのため、この画面からユーザを作成することはできません。

エラー画面

しかし、defaultFieldValues URLパラメータで「言語」項目を指定すればユーザ作成できるかもしれません。

次に、このユーザ作成画面にdefaultFieldValues URLパラメータを使ってアクセスするカスタムリンクを作成します。
作成したカスタムリンクURLは以下になります。

/lightning/o/User/new?defaultFieldValues=
FirstName={!URLENCODE(User.FirstName)},
LastName={!URLENCODE(User.LastName)},
Alias={!URLENCODE(User.Alias)},
Email={!URLENCODE(User.Email)},
Username={!URLENCODE(User.Username)},
CommunityNickname={!URLENCODE(User.CommunityNickname)},
ProfileId={!User.ProfileId},
TimeZoneSidKey={!URLENCODE(TEXT(User.TimeZoneSidKey))},
LocaleSidKey={!URLENCODE(TEXT(User.LocaleSidKey))},
LanguageLocaleKey={!URLENCODE(TEXT(User.LanguageLocaleKey))}

ちなみにメールの文字コード(User.EmailEncodingKey)、ロール(User.UserRoleId)はカスタムリンクの差し込み項目として使用できなかったため加えていません。
しかし言語(LanguageLocaleKey)は指定できました。

このリンクをクリックして表示された画面が以下になります。

コピーリンクをクリックした際の画面

メールの文字コードはデフォルト値が使用されていました。
そしてこの画面で保存をクリックすると…無事保存できました。

保存後の画面

おわりに

今回力技でユーザコピーを試しましたが、以下の理由で実用性がないと考えます。

  • カスタムリンクの時点でメールの文字コード、ロールがコピー対象から抜け落ちる。
  • マーケティングユーザ等の機能ライセンスを割り当てられない。
  • ユーザ設定画面から作成した場合には使える「パスワードをリセットしてユーザに通知する」が使えない。

個人的にはユーザをコピーするならデータローダを使うと思います。
理由は上記欠点のうち「パスワードをリセットしてユーザに通知する」が使えない点以外に対応できること、また複数コピーが同時にできるためです。

MFA必須化に対する1年前の予想の答え合わせと今後の予想

SalesforceのMFAが2022/2/1より契約上必須になりました。
これをご覧いただいている皆様は既にMFAを対応されましたでしょうか。
ちなみに私は利用者10人未満の組織を管理してますが、無事MFA対応を完了しました。

1年前の予想の答え合わせ

さて、私は1年前にSalesforce Saturday 赤坂にてMFAについてLTをしました。

speakerdeck.com

この時に「本当に2022/2/1にMFAを必須にするのか?」について、【「MFA対応不可顧客に対する救済策が確定後に実際の必須化を行う(救済策確定まで延期)」と予想します。】と書きました。
ちなみにこの当時は「2022/2/1からMFAを必須にします」とは言われてましたが、「MFA必須化って具体的に何するの?」という質問に対するSalesforce社の回答はなかったんですね。
なので、ここで書いた「実際の必須化」とは、機能的にSalesforceログイン時にMFAを強制する制限を加えることを指します。

で、実際は

  • 2022/2/1から契約上はMFAを必須にします。これ以降MFAを使用していないユーザは「契約違反」となります。
  • ただししばらくはMFAを使用していなくても契約違反状態ではありますがSalesforce自体は利用できます。
  • 今後は2023年までにMFAを対象組織に強制適用する予定です。ロードマップはありますが確定していません。

となりました。
正直この発表を見たときは「契約違反状態だが強制適用はしない、そういうのもあるのか!」と思いました。
まぁ「機能的な制限の適用は延期する」という意味では予想的中としていいでしょう。

今後の予想

ここでは「現時点でMFAを有効化していないユーザに何らかのペナルティはあるのか」という疑問について予想します。
というのも、FAQでも以下のように2022/2/1時点でMFAを適用しなかったユーザに対する明確な回答はないんですね。

MFA 要件の期限 (2022 年 2 月 1 日) に間に合わないとどうなりますか?
2022 年 2 月 1 日までに MFA を有効にしていないお客様は、契約上の義務を遵守していないことになります。法務部門と相談のうえ、要件の期日までに MFA を有効化しないことによる帰結について理解しておくことをお勧めします。
一部のお客様にとって MFA は大きな変更になる可能性があります。MFA 要件に関する Salesforce の目標はお客様のビジネスを守ることで、MFA はお客様の会社のセキュリティ面やコンプライアンス面への影響を回避するための方策となるものです。この要件を満たすことに関して懸念がある場合は、Salesforce の担当者にお問い合わせください。Salesforce がお客様と協力して解決策を模索します。

で、MSAとかを読みながら「実際に発生し得るペナルティとは何か?」を考えた結果、自分の中で結論が出たのでここに書きます。

注意書き

  • この予想は現時点で確認できた情報を基にした私個人の見解で、Salesforce社とは無関係です。
  • この予想はマスターサブスクリプション契約(以下MSA)下でSalesforceを利用していることを前提としています。特殊な契約を結んでいる場合は適用されません。
  • この予想は契約違反状態のままSalesforceを使い続けることを肯定するものではありません。
  • 免責事項の通り、この投稿に沿って行動したことにより損失や損害などの被害が発生したとしても、当ブログ及び筆者は責任を負いません。あくまで読み物としてご覧ください。

今後の予想

MFA適用ロードマップに記載された「MFA 適用予定日」(ログイン時にMFAを強制する&システム管理者がMFA強制を解除する機能を削除する日)までMFAに対応しなかったとしても、Salesforce社によるペナルティはない。

理由

まず、MFA必須化が何をもって「契約上の義務」となっているかを記載します。
Salesforce Notices and License Informationには、MFA必須化のために以下文言が追加されています。

MFA Requirement for Using the Covered Services
Starting February 1, 2022, Salesforce will begin requiring customers to enable Multi-Factor Authentication (MFA) for all Covered Services, unless otherwise approved by Salesforce in accordance with Salesforce internal policies and procedures. Customer must satisfy the MFA requirement by either: (1) enabling Multi-Factor Authentication for all users who log in to Customer’s Covered Services through the user interface or (2) ensuring MFA is enabled for all users who use Single Sign-On (SSO) to access Customer’s Covered Services, by using the SSO provider’s MFA services or, where supported, by turning MFA on in Salesforce products. Further information on MFA, including acceptable verification methods for MFA, can be found here.

(以下DeepLによる翻訳に手を入れたもの)

対象サービスを利用するためのMFA要件
2022年2月1日より、SalesforceはSalesforceの社内ポリシーおよび手続きに従ってSalesforceが別途承認した場合を除き、すべての対象サービスにおいて多要素認証 (MFA) を有効にするようお客様に要求します。お客様は、以下のいずれかにより、MFA 要件を満たす必要があります。(1) ユーザインタフェースを通じてお客様の対象サービスにログインするすべてのユーザに対して多要素認証を有効にする、または (2) シングルサインオン (SSO) を使用してお客様の対象サービスにアクセスするすべてのユーザに対して、SSO プロバイダの MFA サービスを使用して、またはサポートされる場合は Salesforce 製品で MFA をオンにして、MFA が有効になっていることを確認します。MFA の許容される検証方法など、MFA の詳細については、こちらをご覧ください。

そして、MSAには以下の記載があります。

「本ドキュメンテーション」とは、該当する本サービスの、 https://www.salesforce.com/company/legal/trust-and-compliancedocumentation/ に掲載されている Trust and Compliance という表題(「トラスト及びコンプライアンス」「信頼とコンプライアンス」等と表示される場合があります)の文書、並びに該当する本サービスの利用ガイド及びポリシーで、随時更新され help.salesforce.com 経由で、又は該当する本サービスにログインすることによってアクセス可能なものを意味します。

前述した「Salesforce Notices and License Information」は「Trust and Compliance Documentation」に含まれているので、MSAでいう「本ドキュメンテーション」に含まれます。
続いてSalesforceユーザの責任に関する条項は以下です。

3.3 お客様の責任。
お客様は、以下の義務を負います。
(a) 本ユーザの本契約、本ドキュメンテーション及び本注文書の遵守について責任を負うこと
(中略)
お客様もしくは本ユーザによる上記に違反した本サービスの利用によって、SFDC のサービスのセキュリティ、完全性、可用性が脅かされると判断した場合には、SFDC は、直ちに本サービスを停止することができます。ただし、SFDC は、当該停止前にお客様に通知し、お客様に当該違反又は脅威を是正する機会を与えるよう、その状況における商業上合理的な努力を行います。

つまり、FAQでいう「契約上の義務」及び違反時のペナルティは以下になります。

  • Salesforceユーザは「本ドキュメンテーション」に記載された「MFA 要件を満たす」というルールの遵守について責任を負う。
  • MFA要件を満たさない(=上記に違反した本サービスの利用)ことによりSFDCが「セキュリティ、完全性、可用性を脅かす」と判断した場合、SFDCはサービスを停止することができる。
  • ただし、SFDCはサービス停止前にユーザに対し、当該違反又は脅威を是正する(本件ではMFA要件を満たす)機会を与えるよう商業上合理的な努力を行う。

つまり、SFDCは商業上合理的な努力を行う前にサービス停止することはない、ということです。
では「商業上合理的な努力」とは何か、ですが、まずは「ユーザに対しMFA要件を満たすよう様々な方法で依頼、呼びかけをする」ことでしょう。
それでもMFAに対応しなかった場合、もしサービス停止するのであれば「XX年XX月XX日までにMFA対応しない場合はサービスを停止する」といった最後通告がSalesforce社より送られるはずです。

しかし、仮にサービス停止するのであればMFA適用ロードマップを用意するでしょうか。
「MFA 適用予定日」に適用される内容は「ログイン時にMFAを強制する&システム管理者がMFA強制を解除する機能を削除する」です。つまりこれで強制的にMFA要件を満たさせることができます。
方法はともかく、MFA要件を満たしたのであればルールは遵守されたことになりますのでサービス停止にはならないはずです。
となるとサービス停止にするのは「MFA 適用予定日」前でなければなりませんが、「MFA 適用予定日」までにMFA適用していないユーザをサービス停止するのであれば、「MFA 適用予定日」時点では全ユーザがMFA適用済みなのですから、「ログイン時にMFAを強制する&システム管理者がMFA強制を解除する機能を削除する」必要もないです。

また、サービス停止以外のペナルティですが、MSAの「3.3 お客様の責任」節にサービス停止以外のペナルティが記載されていない以上、それ以外のペナルティはないと思います。*1
よって、「今後の予想」節の通り「MFA 適用予定日」まで対応しなくてもペナルティはない、という予想になりました。

おわりに

「MFAは契約上の義務」、「2022/2/1時点でMFA対応しなかったら契約違反」とはずっと言われてきましたが、「対応しなかったらどうなるの?ペナルティはあるの?」に対する回答は今までSalesforce社からもらったことがありません。
ということでMSA等を読んで上記の結論に至ったわけですが、私は法律等の専門家でもありませんので、注意書きに書いたようにあくまで読み物として扱ってください。

皆さんはルールを守ってSalesforceログイン時はMFAを導入しましょう。

皆さんはルールを守ってSalesforceログイン時はMFAを導入しましょう。

大事なことなので2回書きました。

*1:何か見逃した条項がある or 今後MSAにペナルティを追記する可能性はありますが

選択リストを基に作った日付から年度判定をしたい

はじめに

以下のような質問を受けました。

  • あるオブジェクトに、以下の項目がある。
    • 年/月を項目値とした選択リスト項目(項目値として2022/01、2022/02、…のように並んでいる)
    • 上記選択リスト項目を基に、年月は選択リスト項目値のものを、日は15日に固定した数式(日付)項目
      • 例:選択リスト項目が「2022/1」の場合は「2022/1/15」となる。
  • この時、数式(日付)項目が今年度かどうかを判定する数式項目を作りたい。

この数式作りに結構苦戦したのでここに残しておきます。

数式作り

前提

数式に用いる項目のAPI参照名及び仕様は以下とします。

  • 年/月を項目値とした選択リスト項目: picklist_date__c
    • 選択リスト項目値は2022/01、2022/02、…のように、月の部分は2桁固定とします。
  • picklist_date__c から作成した数式(日付)項目:formula_date__c
    • 数式は DATE(VALUE(LEFT(TEXT(picklist_date__c),4)), VALUE(RIGHT(TEXT(picklist_date__c),2)), 15) とします。
  • 今年度か判定する数式項目:chk_thisyear__c (テキスト項目)
    • 今年度の場合は「今年度」、そうでない場合は「今年度以外」と表示します。

年度が固定の場合

これは formula_date__c が該当年度(〇年4月1日~〇+1年3月31日)の間であることをIF関数を用いてチェックすればOKです。
例として、2021年度か否かを判定する場合は以下数式になります。

IF(AND(formula_date__c >= DATE(2021,4,1), formula_date__c <= DATE(2022,3,31)),
"今年度", "今年度以外")

年度が「今日」を基準にする場合

これは年度固定の場合より少し複雑になります。
なぜなら今日の月によって年の判定が変わるからです。

  • 今日が1月~3月の場合
    • formula_date__c が去年の4月1日から今年の3月31日までなら「今年度」
  • 今日が4月~12月の場合
    • formula_date__c が今年の4月1日から来年の3月31日までなら「今年度」
formula_date__c を使った数式

そこで、以下のように今日の月によって判定が変わるようIF関数を追加して、以下の数式を作成します。

IF(MONTH(TODAY())<=3, 
    IF(AND(formula_date__c >= DATE(YEAR(TODAY())-1,4,1), formula_date__c <= DATE(YEAR(TODAY()),3,31)),
    "今年度", "今年度以外"),
    IF(AND(formula_date__c >= DATE(YEAR(TODAY()),4,1), formula_date__c <= DATE(YEAR(TODAY())+1,3,31)),
    "今年度", "今年度以外")
)

すると、数式サイズが5000文字オーバーとしてエラーになってしまいました。

formula_date__c を使うパターンではこれ以上簡単な数式を作れなかったので、再考を求められました。

formula_date__c を使わない数式

formula_date__c を使わないとなると、picklist_date__cから年、月を取り出して、そこから今日の日付と比較を行う必要があります。
また、数式サイズ削減のためDATE関数を使用できないので、年と月を個別に比較する必要があります。
考えた結果、以下の表を作成してからそれを数式に当てはめました。

picklist_date__c
1~3月 4~12月
今日 1~3月 年が同じ picklist_date__cの年が
今日の年の1年前
4~12月 picklist_date__cの年が
今日の年の1年後
年が同じ
  • 数式
IF( 
    OR(
        AND(MONTH(TODAY())<=3,VALUE(right(TEXT(picklist_date__c),2))<=3,VALUE(left(TEXT(picklist_date__c),4))=YEAR(TODAY())),
        AND(MONTH(TODAY())>=4,VALUE(right(TEXT(picklist_date__c),2))>=4,VALUE(left(TEXT(picklist_date__c),4))=YEAR(TODAY())),
        AND(MONTH(TODAY())<=3,VALUE(right(TEXT(picklist_date__c),2))>=4,VALUE(left(TEXT(picklist_date__c),4))=YEAR(TODAY())-1),
        AND(MONTH(TODAY())>=4,VALUE(right(TEXT(picklist_date__c),2))<=3,VALUE(left(TEXT(picklist_date__c),4))=YEAR(TODAY())+1)
    ),
    "今年度", "今年度以外")

これで数式サイズも5000文字以下となり、利用可能になりました。