目次
はじめに
皆さんは
「Salesforceで画面を作る」
という一文から、何を思い浮かべますでしょうか?
Lightning ページを作成してコンポーネントを配置していくことであったり、VisualforceやLWC(Lightning Web Component)でコーディングしていくことであったりとSalesforceの知識や経験よって、さまざまな方法があるかと思います。
今回はそんな画面作成の手段の1つである「画面フロー」に焦点を当て、実用的な機能を作ってみたいと思います。
「画面フロー」はドラック&ドロップで直観的に画面を作成することができ、加えて画面遷移、レコードの作成・更新、エラー処理などもノンコーディングで実現することができます。
手の込んだUIや複雑なデータ処理が必要ないのであれば、画面フローでの開発は選択肢の1つに挙げられるかと思います。
それでは、さっそく始めていきましょう!
「Salesforceで画面を作る」
という一文から、何を思い浮かべますでしょうか?
Lightning ページを作成してコンポーネントを配置していくことであったり、VisualforceやLWC(Lightning Web Component)でコーディングしていくことであったりとSalesforceの知識や経験よって、さまざまな方法があるかと思います。
今回はそんな画面作成の手段の1つである「画面フロー」に焦点を当て、実用的な機能を作ってみたいと思います。
「画面フロー」はドラック&ドロップで直観的に画面を作成することができ、加えて画面遷移、レコードの作成・更新、エラー処理などもノンコーディングで実現することができます。
手の込んだUIや複雑なデータ処理が必要ないのであれば、画面フローでの開発は選択肢の1つに挙げられるかと思います。
それでは、さっそく始めていきましょう!
権限セット付与機能
今回は画面フローを使って
「権限セット付与機能」
を作成します。
この権限セット付与機能には、2つの特徴があります。
①必要最小限のシンプルなインターフェース
ユーザに権限セットを付与する方法としては「1.ユーザの詳細ページから付与する」「2.権限セットの割り当ての管理から付与する」の2パターンありますが、どちらもいくつかの画面を経由して付与する必要があるため、少々手間が発生します。
シンプルに「権限セット」と「ユーザ」の入力項目がある画面を1つ用意して、権限セットを付与すれば、そういった手間も発生しませんので、作業の効率化が実現できます。
また、権限セットを付与する際にいつまで付与しておくかの「有効期限」も設定できますので、こちらもオプションとして設定できるような作りにします。
②権限セットを付与した履歴をレコードとして保持
権限セットを付与した履歴を確認するためには、「設定変更履歴の参照」から確認できますが、権限セットだけではなく、組織内の全ての設定変更内容を履歴として管理しているため、権限セットの変更だけをピックアップして確認したい場合は、こちらも手間が発生します。
そこで、「権限セット履歴」というカスタムオブジェクトを作成し、権限セット付与画面にて権限セットを付与した後に、付与した内容をレコードとして作成する処理を入れることで、レポートなどで簡単に付与履歴が確認できるようになります。
「権限セット付与機能」
を作成します。
この権限セット付与機能には、2つの特徴があります。
①必要最小限のシンプルなインターフェース
ユーザに権限セットを付与する方法としては「1.ユーザの詳細ページから付与する」「2.権限セットの割り当ての管理から付与する」の2パターンありますが、どちらもいくつかの画面を経由して付与する必要があるため、少々手間が発生します。
シンプルに「権限セット」と「ユーザ」の入力項目がある画面を1つ用意して、権限セットを付与すれば、そういった手間も発生しませんので、作業の効率化が実現できます。
また、権限セットを付与する際にいつまで付与しておくかの「有効期限」も設定できますので、こちらもオプションとして設定できるような作りにします。
②権限セットを付与した履歴をレコードとして保持
権限セットを付与した履歴を確認するためには、「設定変更履歴の参照」から確認できますが、権限セットだけではなく、組織内の全ての設定変更内容を履歴として管理しているため、権限セットの変更だけをピックアップして確認したい場合は、こちらも手間が発生します。
そこで、「権限セット履歴」というカスタムオブジェクトを作成し、権限セット付与画面にて権限セットを付与した後に、付与した内容をレコードとして作成する処理を入れることで、レポートなどで簡単に付与履歴が確認できるようになります。
0. 事前準備
画面フローの開発に入る前に、事前準備として「権限セット履歴」のカスタムオブジェクトを作成しておきましょう。
「権限セット履歴」(API参照名:PermissionSetHistory__c)というオブジェクトを作成し、以下4項目を作成してください。
「権限セット履歴」(API参照名:PermissionSetHistory__c)というオブジェクトを作成し、以下4項目を作成してください。
No. | 項目名 | API参照名 | データ型 |
---|---|---|---|
1 | 履歴No. | Name | 自動採番 |
2 | 権限セット名 | PermissionSetName__c | テキスト(255) |
3 | 付与ユーザ | SetUser__c | 参照関係(ユーザ) |
4 | 有効期限 | EndDate__c | 日付 |
「履歴No.」の自動採番の形式はご自由に設定していただいて構いません(※今回は P-{00000} の形式とします)
1. 入力画面
それでは、早速画面フローを作成していきましょう。
まずはフローを作成し、Flow Builderの中で入力画面を設定していきます。
設定 > プロセスの自動化 > フローより「新規フロー」ボタンをクリックします。
まずはフローを作成し、Flow Builderの中で入力画面を設定していきます。
設定 > プロセスの自動化 > フローより「新規フロー」ボタンをクリックします。
「画面フロー」を選択し、「作成」ボタンをクリック
Flow Builderが表示されますので、「画面フロー開始」 要素の下にある「+」アイコンをクリック
「画面」を選択
すると、画面の内容が設定できますので、1つずつ設定していきましょう。
画面のプロパティは
・表示ラベル = 権限セットを付与
・API参照名 = AssignPermissionSet
を設定します。
画面のプロパティは
・表示ラベル = 権限セットを付与
・API参照名 = AssignPermissionSet
を設定します。
ヘッダーについては
・ヘッダーを表示 にチェック
フッターについては
・フッターを表示 にチェック
・[次へ]ボタン または [完了]ボタン
・カスタム表示ラベルを使用 を選択
・"この内容で付与する"を表示ラベルの文言に設定
・[前へ]を非表示 を選択
・[一時停止]を非表示 を選択
を設定します。
・ヘッダーを表示 にチェック
フッターについては
・フッターを表示 にチェック
・[次へ]ボタン または [完了]ボタン
・カスタム表示ラベルを使用 を選択
・"この内容で付与する"を表示ラベルの文言に設定
・[前へ]を非表示 を選択
・[一時停止]を非表示 を選択
を設定します。
一度、この時点で「完了」ボタンをクリックしておきましょう。
作成した「権限セットを付与」画面の要素が表示されます。
作成した「権限セットを付与」画面の要素が表示されます。
続いて、入力項目を設定していきましょう。
入力項目は
1. 権限セット
2. ユーザ
3. 有効期限
の3項目となります。
まずは「1. 権限セット」から。
画面左のコンポーネントタブより「選択肢ルックアップ」を検索し、ドラッグ&ドロップします。
入力項目は
1. 権限セット
2. ユーザ
3. 有効期限
の3項目となります。
まずは「1. 権限セット」から。
画面左のコンポーネントタブより「選択肢ルックアップ」を検索し、ドラッグ&ドロップします。
・表示ラベル = 権限セット
・API参照名 = PermissionSetList
・必須 にチェック
を設定します。
・API参照名 = PermissionSetList
・必須 にチェック
を設定します。
「選択肢」の設定内容については、選択肢をクリックして、「+新規選択肢リソース」をクリックします
選択肢リソースの設定値としては
・リソース種別 = レコード選択肢セット
・API参照名 = PemissionSetResource
・オブジェクト = 権限セット
・権限セットレコードを絞り込み = なし - すべての権限セットレコードを取得
・各選択肢を設定
・選択肢表示ラベル = Label
・データ型 = テキスト
・選択肢の値 = Id
を設定して、「完了」ボタンをクリックします。
・リソース種別 = レコード選択肢セット
・API参照名 = PemissionSetResource
・オブジェクト = 権限セット
・権限セットレコードを絞り込み = なし - すべての権限セットレコードを取得
・各選択肢を設定
・選択肢表示ラベル = Label
・データ型 = テキスト
・選択肢の値 = Id
を設定して、「完了」ボタンをクリックします。
選択肢に {!PemissionSetResource} が設定され、権限セットの一覧が選択リストとして設定されます。
同様に権限セットを付与する「ユーザ」の項目も選択肢ルックアップで作成しましょう。
作成した権限セット項目の下に、「選択肢ルックアップ」をドラッグ&ドロップし、
・表示ラベル = ユーザ
・API参照名 = UserList
・必須 にチェック
を設定し、
選択肢に設定する「選択肢リソース」の設定値としては
・リソース種別 = レコード選択肢セット
・API参照名 = UserResource
・オブジェクト = ユーザ
・権限セットレコードを絞り込み = なし - すべてのユーザレコードを取得
・各選択肢を設定
・選択肢表示ラベル = Name
・データ型 = テキスト
・テキスト = Id
を設定しましょう。
作成した権限セット項目の下に、「選択肢ルックアップ」をドラッグ&ドロップし、
・表示ラベル = ユーザ
・API参照名 = UserList
・必須 にチェック
を設定し、
選択肢に設定する「選択肢リソース」の設定値としては
・リソース種別 = レコード選択肢セット
・API参照名 = UserResource
・オブジェクト = ユーザ
・権限セットレコードを絞り込み = なし - すべてのユーザレコードを取得
・各選択肢を設定
・選択肢表示ラベル = Name
・データ型 = テキスト
・テキスト = Id
を設定しましょう。
最後の入力項目として、「有効期限」を設定しましょう。
ユーザ項目の下に「日付」項目をドラック&ドロップし、
・表示ラベル = 有効期限
・API参照名 = EndDate
としておきましょう。
あくまでもオプションの項目ですので、必須は外しておきます。
ユーザ項目の下に「日付」項目をドラック&ドロップし、
・表示ラベル = 有効期限
・API参照名 = EndDate
としておきましょう。
あくまでもオプションの項目ですので、必須は外しておきます。
はい、これで画面の入力項目の設定が完了しました。
一旦、この時点で保存しておきましょう。
「完了」ボタンをクリックした後、Flow Builder画面右上の「保存」ボタンをクリックします。
このフローの名前(表示ラベル、API参照名)の入力が求められますので、
・フローの表示ラベル = 権限セット付与画面
・フローのAPI参照名 = AssignPermissionSet
と入力して「保存」ボタンをクリックします。
一旦、この時点で保存しておきましょう。
「完了」ボタンをクリックした後、Flow Builder画面右上の「保存」ボタンをクリックします。
このフローの名前(表示ラベル、API参照名)の入力が求められますので、
・フローの表示ラベル = 権限セット付与画面
・フローのAPI参照名 = AssignPermissionSet
と入力して「保存」ボタンをクリックします。
さて、次はこの画面の入力値を元に、権限セットの付与処理を作成しましょう。
2. 権限セットの付与処理
まず、フローから権限セットを付与するためには「権限セットの割り当て」(PermissionSetAssignment)というレコードを作成する必要があります。
この権限セットの割り当てレコードに「ユーザへの参照項目」「権限セットへの参照項目」の値をそれぞれ設定することで、誰に、どの権限セットを付与するかを設定できます。
この権限セットの割り当てレコードに「ユーザへの参照項目」「権限セットへの参照項目」の値をそれぞれ設定することで、誰に、どの権限セットを付与するかを設定できます。
設定方法としては、まず「権限セットを付与」画面下の「+」アイコンをクリックし、「レコードを作成」の要素をクリックします
レコードの作成要素では、以下の値を設定します。
・表示ラベル = 権限セットの割り当てレコードを作成
・API参照名 = CreatePermissionSetAssignment
・作成するレコード = 1
・レコード項目の設定方法 = 個別のリソースおよびリテラル値を使用
・オブジェクト = 権限セットの割り当て
・権限セットの割り当ての項目値を設定
・PermissionSetId = PermissionSetList(選択肢ルックアップ).selectedChoiceValues(選択された選択肢の値)
・AssigneeId = UserList(選択肢ルックアップ).selectedChoiceValues(選択された選択肢の値)
・ExpirationDate = EndDate
・表示ラベル = 権限セットの割り当てレコードを作成
・API参照名 = CreatePermissionSetAssignment
・作成するレコード = 1
・レコード項目の設定方法 = 個別のリソースおよびリテラル値を使用
・オブジェクト = 権限セットの割り当て
・権限セットの割り当ての項目値を設定
・PermissionSetId = PermissionSetList(選択肢ルックアップ).selectedChoiceValues(選択された選択肢の値)
・AssigneeId = UserList(選択肢ルックアップ).selectedChoiceValues(選択された選択肢の値)
・ExpirationDate = EndDate
権限セットの割り当てレコードに設定する項目ですが、「PermissionSetId」項目には権限セットのId、「AssigneeId」項目にはユーザのIdを設定します。
先ほど、「権限セット」と「ユーザ」の選択リスト項目を作成した際に「選択肢の値 = Id」と設定しましたが、これによって、「selectedChoiceValues(選択された選択肢の値)」を利用すると、選択した値のIdが設定される仕組みとなります。
これで権限セットの付与処理は完了しましたので、「完了」ボタンをクリックしてください。
「権限セットの割り当てレコードを作成」要素が追加されました。
先ほど、「権限セット」と「ユーザ」の選択リスト項目を作成した際に「選択肢の値 = Id」と設定しましたが、これによって、「selectedChoiceValues(選択された選択肢の値)」を利用すると、選択した値のIdが設定される仕組みとなります。
これで権限セットの付与処理は完了しましたので、「完了」ボタンをクリックしてください。
「権限セットの割り当てレコードを作成」要素が追加されました。
次は権限セット履歴レコードを作成...と思いきや....
権限セットを付与する処理が終わりましたので、続いて、履歴を残すために事前準備で用意した「権限セット履歴」のレコードを作成しましょう!
...と思いきや、ここで罠が...。
「権限セットの割り当て」レコードを作成した直後に、カスタムオブジェクトの「権限セット履歴」レコードを作成しようとすると、こんなエラーが出てしまいます...
「エラーメッセージ」
MIXED_DML_OPERATION: 非設定オブジェクトを更新した後の設定オブジェクト上の DML 操作 (またはその逆) は、許可されていません:
...と思いきや、ここで罠が...。
「権限セットの割り当て」レコードを作成した直後に、カスタムオブジェクトの「権限セット履歴」レコードを作成しようとすると、こんなエラーが出てしまいます...
「エラーメッセージ」
MIXED_DML_OPERATION: 非設定オブジェクトを更新した後の設定オブジェクト上の DML 操作 (またはその逆) は、許可されていません:
原因としては「設定オブジェクトと非設定オブジェクトはDML操作で同時には使用できない」(※1)というSalesforceの仕様によるものです。
権限セット割り当て(PermissionSetAssignment)は設定オブジェクトであり、カスタムオブジェクトは非設定オブジェクトですので、同じトランザクション内では作成・更新といったDML操作ができないとのこと...
同じトランザクション内が問題ですので、回避策としては、トランザクションを分けることにします。
画面フローは、画面要素を挟むとトランザクションが分かれる(※2)という仕様ですので、
・権限セット履歴レコードを作成する → 完了画面を表示
ではなく
・完了画面を表示し、画面内の「履歴を残して終了」ボタンをクリックする → 権限セット履歴レコードを作成する
の流れに変更したいと思います。
この仕様であれば、完了画面内でボタンを押さないと履歴レコードが作成されませんが、あえて「履歴を残して終了」というボタンを作成し、利用者には明示的に履歴を残してもらうように誘導することで、このリスクを回避したいと思います。
(参考)
※1 DML 操作で同時に使用できない sObject
※2 トランザクションのフロー
権限セット割り当て(PermissionSetAssignment)は設定オブジェクトであり、カスタムオブジェクトは非設定オブジェクトですので、同じトランザクション内では作成・更新といったDML操作ができないとのこと...
同じトランザクション内が問題ですので、回避策としては、トランザクションを分けることにします。
画面フローは、画面要素を挟むとトランザクションが分かれる(※2)という仕様ですので、
・権限セット履歴レコードを作成する → 完了画面を表示
ではなく
・完了画面を表示し、画面内の「履歴を残して終了」ボタンをクリックする → 権限セット履歴レコードを作成する
の流れに変更したいと思います。
この仕様であれば、完了画面内でボタンを押さないと履歴レコードが作成されませんが、あえて「履歴を残して終了」というボタンを作成し、利用者には明示的に履歴を残してもらうように誘導することで、このリスクを回避したいと思います。
(参考)
※1 DML 操作で同時に使用できない sObject
※2 トランザクションのフロー
3. 完了画面
というわけで、先に「完了画面」を作成しましょう。
「権限セットの割り当てレコードを作成」要素の下の「+」アイコンをクリックし、「画面」を選択します。
「権限セットの割り当てレコードを作成」要素の下の「+」アイコンをクリックし、「画面」を選択します。
以下の値を設定します。
・表示ラベル = 権限セットの付与完了
・API 参照名 = CompleteAssignPermissionSet
・フッターを表示にチェック
・[次へ]ボタンまたは[完了ボタン]
・カスタム表示ラベルを使用 を選択
・表示ラベル = 履歴を残して終了
・[前へ]を非表示 を選択
・[一時停止]を非表示 を選択
・表示ラベル = 権限セットの付与完了
・API 参照名 = CompleteAssignPermissionSet
・フッターを表示にチェック
・[次へ]ボタンまたは[完了ボタン]
・カスタム表示ラベルを使用 を選択
・表示ラベル = 履歴を残して終了
・[前へ]を非表示 を選択
・[一時停止]を非表示 を選択
メッセージを表示するために、「表示テキスト」をドラッグ&ドロップします
表示テキストのプロパティには
・API 参照名 = CompleteMsg
・テキスト内容 = 権限セットの付与が完了しました。 「履歴を残して終了」ボタンをクリックして、処理を終了させてください。
を設定します。
・API 参照名 = CompleteMsg
・テキスト内容 = 権限セットの付与が完了しました。 「履歴を残して終了」ボタンをクリックして、処理を終了させてください。
を設定します。
これで完了画面の設定は終了となります。
最後に「権限セット履歴」レコードの作成処理を設定しましょう。
最後に「権限セット履歴」レコードの作成処理を設定しましょう。
4. 権限セット履歴レコードの作成
権限セット履歴レコードの作成処理は、前述した権限セットの割り当てレコード作成と同じ要素である「レコードを作成」を使用します。
「権限セットの付与完了」要素の下に「レコードを作成」要素を追加しましょう。
「権限セットの付与完了」要素の下に「レコードを作成」要素を追加しましょう。
以下の値を設定します。
・表示ラベル = 権限セット履歴レコードの作成
・API参照名 = CreatePermissionSetHistory
・作成するレコード = 1
・レコード項目の設定方法 = 個別のリソースおよびリテラル値を使用
・オブジェクト = 権限セット履歴
・権限セットの割り当ての項目値を設定
・PermissionSetName__c = PermissionSetList(選択肢ルックアップ).selectedChoiceLabels(選択された選択肢の表示ラベル)
・SetUser__c = UserList(選択肢ルックアップ).selectedChoiceValues(選択された選択肢の値)
・EndDate__c = EndDate
・表示ラベル = 権限セット履歴レコードの作成
・API参照名 = CreatePermissionSetHistory
・作成するレコード = 1
・レコード項目の設定方法 = 個別のリソースおよびリテラル値を使用
・オブジェクト = 権限セット履歴
・権限セットの割り当ての項目値を設定
・PermissionSetName__c = PermissionSetList(選択肢ルックアップ).selectedChoiceLabels(選択された選択肢の表示ラベル)
・SetUser__c = UserList(選択肢ルックアップ).selectedChoiceValues(選択された選択肢の値)
・EndDate__c = EndDate
注意点としましては、権限セット履歴の「権限セット名」(PermissionSetName__c)には、選択された権限セットの表示ラベルを設定しますので、
PermissionSetList(選択肢ルックアップ)のselectedChoiceLabels(選択された選択肢の表示ラベル)を設定するようにしてください。
「完了」ボタンをクリックすると「権限セット履歴レコードの作成」要素が表示されます。
PermissionSetList(選択肢ルックアップ)のselectedChoiceLabels(選択された選択肢の表示ラベル)を設定するようにしてください。
「完了」ボタンをクリックすると「権限セット履歴レコードの作成」要素が表示されます。
はい、これで一通りの処理が完成しました!
早速、動作確認してみましょう。
早速、動作確認してみましょう。
動作確認
動作確認はFlow Builder内の「実行」ボタンをクリックします。
(※動作確認前に忘れずに「保存」ボタンをクリックしておきましょう)
(※動作確認前に忘れずに「保存」ボタンをクリックしておきましょう)
権限セット付与画面が表示されますので、「権限セット」「ユーザ」は選択リストから、「有効期限」はカレンダーから選択し、「この内容で付与する」ボタンをクリックします。
完了画面が表示されますので、
「履歴を残して終了」ボタンをクリックします。
「履歴を残して終了」ボタンをクリックします。
画面の動きは問題なさそうですね。
では実際に「権限セットがユーザに付与されているか?」「権限セット履歴レコードは作成されているか?」について確認してみましょう。
まずは、権限セットがユーザに付与されているかの確認をします。
では実際に「権限セットがユーザに付与されているか?」「権限セット履歴レコードは作成されているか?」について確認してみましょう。
まずは、権限セットがユーザに付与されているかの確認をします。
はい、しっかり付与されています。
有効期限も問題ないですね。
続いて、権限セット履歴レコードはどうでしょうか?
タブなどは設定していないため、開発者コンソールからSQOLを実行して確認してみます。
有効期限も問題ないですね。
続いて、権限セット履歴レコードはどうでしょうか?
タブなどは設定していないため、開発者コンソールからSQOLを実行して確認してみます。
こちらもしっかり権限セット履歴のレコードが作成されているのを確認できました。
最後に
今回は画面フロー実践編ということで、権限セットの付与機能を作成してみましたが、いかがでしたでしょうか?
機能を構築するうえでのロジカルな考え方やエラー発生時の対応は必要になってきますが、簡単な機能であればコーディングせずにサクッと作ることができるのが、この画面フローの魅力かと思います。
ご興味のある方はぜひ試してみてください。
ちなみに今回作成した権限セットの付与機能はシンプルなものとしましたが、より実用性を考えると
・承認プロセスと絡めて、承認時に権限セットが付与される仕組みにする
・有効期限ではなく、権限セットの付与日も設定できるようにする
・有効期限を時間単位で指定できるようにする
といった考慮も必要になるかと思います。
この辺りはまた別の機会に解説させていただければと思います。
最後まで読んでいただきありがとうございました。
機能を構築するうえでのロジカルな考え方やエラー発生時の対応は必要になってきますが、簡単な機能であればコーディングせずにサクッと作ることができるのが、この画面フローの魅力かと思います。
ご興味のある方はぜひ試してみてください。
ちなみに今回作成した権限セットの付与機能はシンプルなものとしましたが、より実用性を考えると
・承認プロセスと絡めて、承認時に権限セットが付与される仕組みにする
・有効期限ではなく、権限セットの付与日も設定できるようにする
・有効期限を時間単位で指定できるようにする
といった考慮も必要になるかと思います。
この辺りはまた別の機会に解説させていただければと思います。
最後まで読んでいただきありがとうございました。
89 件