今回、フローで請求書作成+添付メール送信の作成手順をご紹介します。請求書ファイルはOffice File Creatorで作成します。Office File Creatorは、画面フローに組み込むことが可能です。添付メール送信は、Salesforceのフローで呼び出し可能な添付メール送信Apexクラスを作成する で作成したApexクラスをフロー内で呼び出します。
完成イメージ
完成イメージとして、商談レコードページの「請求書メール送信」ボタンをクリックでポップアップ画面が表示され、フローを実行で以下の処理を行います。
・請求書PDFがファイルに保存されます。
・取引先責任者に添付メールを送信します。取引先責任者は、取引先責任者の役割より、プライマリがチェックオンの取引先責任者を取得します。
・商談の「請求書メール送信日」に実行日が設定されます。
デモ
フロー作成のポイント
- レコード画面からレコードIdをフローで受け取るパラメータは、"recordId"です。フローでテキスト型の変数"recordId"を作成します。他の変数名はレコードIdを受け取ることができません。
- 請求書作成は、officeFileCreatorForFlowコンポーネントを画面フローに配置します。結果(成功・失敗)を返し、失敗の場合はエラーメッセージを返却します。
- 請求書添付メール送信は、Salesforceのフローで呼び出し可能な添付メール送信Apexクラスを作成する で作成したApexクラスを呼び出します。
フロー処理概要
1. 商談取得
商談レコードを取得します。請求書メール送信日、金額、商談名を取得します。請求書メール送信日、金額はメール送信条件のチェックに使用します。商談名はメールの件名に使用します。
2. 取引先責任者の役割取得
商談に紐づく取引先責任者の役割レコードより、プライマリがチェックオンの取引先責任者を取得します。
3. メール送信条件判定
メール送信条件のOK・NGを判定します。請求書メール送信日が空欄ではない、または金額が0円以下、または取引先責任者のメールが空欄の場合、エラーとします。OKの場合、4の処理へ進みます。エラーの場合、3eの処理へ進みます。
3e. エラー画面(送信条件)
エラーメッセージを表示し、フローを終了します。
4. トップ画面
実行確認メッセージを表示します。
5. OFC帳票作成
officeFileCreatorForFlowコンポーネントを画面フローに配置します。Office File Creatorにより請求書PDFファイルを作成し、ファイルに保存します。
6. OFCエラー判定
OFC帳票作成の成功・エラーを判定します。成功の場合、7の処理へ進みます。エラーの場合、6eの処理へ進みます。
6e. エラー画面(OFC)
エラーメッセージを表示し、フローを終了します。
7. メールパラメータ割り当て
OFC帳票作成で保存したファイルIdをコレクション変数に追加します。
8. 請求書添付メール送信
メール送信ApexクラスSendEmailWithAttachmentを呼び出し、取引先責任者に請求書添付メールを送信します。
9. メール送信エラー判定
メール送信の成功・エラーを判定します。成功の場合、10の処理へ進みます。エラーの場合、9eの処理へ進みます。
9e. エラー画面(メール送信)
エラーメッセージを表示し、フローを終了します。
10. 商談更新
商談の請求書メール送信日を更新します。成功の場合、11の処理へ進みます。エラーの場合、10eの処理へ進みます。
10e. エラー画面(商談更新)
エラーメッセージを表示し、フローを終了します。
11. 完了画面
完了メッセージを表示します。
フロー作成
それでは、フローを作成していきましょう。設定よりフローを開き、「新規フロー」ボタンをクリックします。
「画面フロー」を選択し、「作成」ボタンをクリックします。
変数作成
まず、以下の変数を最初に作っておきます。
変数名 | 説明 |
recordId | レコード画面から受け取るレコードId |
varFileIds | ファイルIdリスト |
txtTmplEmailBody | メール本文 |
画面左上の「ツールボックスを切替」ボタンをクリックし、「新規リソース」ボタンをクリックします。
recordId変数
リソース種別: 変数
API参照名: recordId
説明: レコード画面から受け取るレコードId
データ型: テキスト
入力で使用可能: チェックオン
※recordIdはレコード画面からのレコードIdを受け取る変数です。"recordId"(Iだけ大文字)で設定してください。他の変数名はレコードIdを受け取ることができません。
varFileIdsコレクション変数
リソース種別: 変数
API参照名: varFileIds
説明: ファイルIdリスト
データ型: テキスト
複数の値を許可 (コレクション): チェックオン
txtTmplEmailBodyテキストテンプレート
リソース種別: テキストテンプレート
API参照名: txtTmplEmailBody
説明: メール本文
本文: 「プレーンテキストとして表示」を選択
仮
※あとで本文を設定しますので、ここでは一旦"仮"としておきます。
ここでフローを一度保存しておきます。
任意の名前で保存します。ここでは以下で保存します。
フローの表示ラベル: 請求書メール送信
フローのAPI参照名: SendEmailWithInvoiceScreenFlow
説明: 商談のレコード画面から請求書ファイルを作成し、主担当の取引先責任者に請求書添付メールの送信
警告が表示されたら、「×」で閉じます。
1. 商談取得
「画面フロー」の下の「+」マークをクリックし、「レコードを取得」を選択します。
プロパティを設定します。
表示ラベル: 商談取得
API参照名: GetOpportunity
----------------------------------------------------------------------
オブジェクト: 商談
----------------------------------------------------------------------
条件の要件: すべての条件に一致 (AND)
項目: Id
演算子: 次の文字列と一致する
値: {!recordId}
----------------------------------------------------------------------
並び替え順: 並び替えなし
保存するレコード数: 最初のレコードのみ
レコードデータの保存方法: 項目を選択して後は Salesforce に任せる
項目: ID
項目: Amount
項目: InvoiceEmailSendDate__c
項目: Name
2. 取引先責任者の役割取得
「商談取得」の下の「+」マークをクリックし、「レコードを取得」を選択します。
プロパティを設定します。
表示ラベル: 取引先責任者の役割取得
API参照名: GetOpportunityContactRoles
----------------------------------------------------------------------
オブジェクト: 商談 取引先責任者の役割
----------------------------------------------------------------------
条件の要件: すべての条件に一致 (AND)
項目: OpportunityId
演算子: 次の文字列と一致する
値: {!recordId}
AND
項目: IsPrimary
演算子: 次の文字列と一致する
値: {!$GlobalConstant.True}
----------------------------------------------------------------------
並び替え順: 並び替えなし
保存するレコード数: 最初のレコードのみ
レコードデータの保存方法: すべての項目を自動的に保存
3. メール送信条件判定
「取引先責任者の役割」の下の「+」マークをクリックし、「決定」を選択します。
プロパティを設定します。
表示ラベル: メール送信条件判定
API参照名: DecEmailSendConditions
表示ラベル: NG
結果のAPI参照名: decEmailSendConditions_NG
結果を実行する条件の要件: いずれかの条件に一致 (OR)
リソース: {!GetOpportunity.Amount}
演算子: 以下
値: 0
OR
リソース: {!GetOpportunity.Amount}
演算子: null
値: {!$GlobalConstant.True}
OR
リソース: {!GetOpportunity.InvoiceEmailSendDate__c}
演算子: null
値: {!$GlobalConstant.False}
OR
リソース: {!GetOpportunityContactRoles.Contact.Email}
演算子: null
値: {!$GlobalConstant.True}
左サイドバーの「デフォルトの結果」をクリックします。
プロパティを設定します。
表示ラベル: OK
3e. エラー画面(送信条件)
「NG」の下の「+」マークをクリックし、「画面」を選択します。
プロパティを設定します。
表示ラベル: エラー画面(送信条件)
API参照名: ErrorScreen_SendCondition
コンポーネントより、表示テキストをドラッグ&ドロップし、プロパティを設定します。
API参照名: dispErrorMessage_Amount
テキスト: 商談金額が0円以下です。
コンポーネントを表示するタイミング: いずれかの条件に一致 (OR)
リソース: {!GetOpportunity.Amount}
演算子: 以下
値: 0
OR
リソース: {!GetOpportunity.Amount}
演算子: null
値: {!$GlobalConstant.True}
続いて、表示テキストをドラッグ&ドロップし、プロパティを設定します。
API参照名: dispErrorMessage_DuplicateEmail
テキスト: 既に請求書メールは送信済みです。
コンポーネントを表示するタイミング: すべてのの条件に一致 (AND)
リソース: {!GetOpportunity.InvoiceEmailSendDate__c}
演算子: null
値: {!$GlobalConstant.False}
続いて、表示テキストをドラッグ&ドロップし、プロパティを設定します。
API参照名: dispErrorMessage_NoContactRoles
テキスト: メール送信対象の取引先責任者が存在しません。
コンポーネントを表示するタイミング: すべてのの条件に一致 (AND)
リソース: {!GetOpportunityContactRoles.Contact.Email}
演算子: null
値: {!$GlobalConstant.True}
「エラー画面(送信条件)」の下の「+」マークをクリックし、「終了」を選択します。
4. トップ画面
「OK」の下の「+」マークをクリックし、「画面」を選択します。
プロパティを設定します。
表示ラベル: トップ画面
API参照名: TopScreen
コンポーネントより、表示テキストをドラッグ&ドロップし、プロパティを設定します。
API参照名: dispConfirmMessage
テキスト:
以下の宛先に請求書をメール送信します。よろしいですか?
{!GetOpportunityContactRoles.Contact.LastName} {!GetOpportunityContactRoles.Contact.FirstName} 様
{!GetOpportunityContactRoles.Contact.Email}
5. OFC帳票作成
「トップ画面」の下の「+」マークをクリックし、「画面」を選択します。
プロパティを設定します。
表示ラベル: OFC帳票作成
API参照名: OFCScreen
フッターを表示: チェックオフ
※ユーザがofficeFileCreatorForFlowの実行中に「次へ」や「前へ」のボタンをクリックしないようにフッターを非表示にします。
コンポーネントより、「officeFileCreatorForFlow」をドラッグ&ドロップし、プロパティを設定します。
API参照名: OFCComp
recordId: {!recordId}
save: file
template: OpportunityInvoicePdf ※OFC_TemplateレコードのテンプレートApi名を入力します。
6. OFCエラー判定
「OFC帳票作成」の下の「+」マークをクリックし、「決定」を選択します。
プロパティを設定します。
表示ラベル: OFCエラー判定
API参照名: DecOFCError
表示ラベル: エラー
結果のAPI参照名: decOFCError_Yes
結果を実行する条件の要件: すべての条件に一致 (AND)
リソース: {!OFCComp.isSuccess}
演算子: 次の文字列と一致する
値: {!$GlobalConstant.False}
左サイドバーの「デフォルトの結果」をクリックします。
プロパティを設定します。
6e. エラー画面(OFC)
「エラー」の下の「+」マークをクリックし、「画面」を選択します。
プロパティを設定します。
表示ラベル: エラー画面(OFC)
API参照名: ErrorScreen_OFC
[前へ]ボタン: [前へ]を非表示
※メールが二重で送信されたり、OFCで二重に帳票が作成されないように、これ以降、すべての画面でフッターの[前へ]ボタンは非表示にします。
コンポーネントより、表示テキストをドラッグ&ドロップし、プロパティを設定します。
API参照名: dispErrorMessage_OFC
テキスト: {!OFCComp.errorMessage}
「エラー画面(OFC)」の下の「+」マークをクリックし、「終了」を選択します。
7. メールパラメータ割り当て
「成功」の下の「+」 マークをクリックし、「割り当て」を選択します。
プロパティを設定します。
表示ラベル: メールパラメータ割り当て
API参照名: AsgEmailParameters
変数: {!varFileIds}
演算子: 追加
値: {!OFCComp.contentVersionId}
8. 請求書添付メール送信
「メールパラメータ割り当て」の下の「+」マークをクリックし、「アクション」を選択します。
カテゴリは「すべて」を選択し、アクションに"apex"と入力し、「メール送信 (添付ファイル付きの単一メール送信)」を選択します。
プロパティを設定します。
表示ラベル: 請求書添付メール送信
API参照名: SendEmailWithAttachment
[入力値]
メールのテキスト本文: {!txtTmplEmailBody}
関連レコードId: {!recordId}
件名: 御請求書_{!GetOpportunity.Name}
送信ユーザのメールの署名をセット *デフォルトはtrue: {!$GlobalConstant.False}
対象オブジェクトId(取引先責任者、リード、ユーザ) *テンプレートIdがセットされている場合、必須: {!GetOpportunityContactRoles.Contact.Id}
添付ファイルId *ContentVersionId, AttchmentId or DocumentId: {!varFileIds}
トランザクションコントロール: フローの決定に任せる (推奨)
画面左上の「ツールボックスを切替」ボタンをクリックし、検索ボックスに"body"と入力し、「txtTmplEmailBody」を選択します。
本文を設定します。
本文:
{!GetOpportunityContactRoles.Contact.Account.Name} {!GetOpportunityContactRoles.Contact.LastName} 様
いつもお世話になっております。
請求書を添付させていただきますので、ご査収のほどよろしくお願いいたします。
--------------------------------------------------------------------
AppExchange株式会社
{!$User.LastName} {!$User.FirstName}
{!$User.Email}
〒100-0005
東京都千代田区丸の内1-2-3 ABCビル1F
--------------------------------------------------------------------
9. メール送信エラー判定
「請求書添付メール送信」の下の「+」マークをクリックし、「決定」を選択します。
プロパティを設定します。
表示ラベル: メール送信エラー判定
API参照名: DecSendEmailError
表示ラベル: エラー
結果のAPI参照名: decSendEmailError_Yes
結果を実行する条件の要件: すべての条件に一致 (AND)
リソース: {!SendEmailWithAttachment.isSuccess}
演算子: 次の文字列と一致する
値: {!$GlobalConstant.False}
左サイドバーの「デフォルトの結果」をクリックします。
プロパティを設定します。
表示ラベル: 成功
9e. エラー画面(メール送信)
「エラー」の下の「+」マークをクリックし、「画面」を選択します。
プロパティを設定します。
表示ラベル: エラー画面(メール送信)
API参照名: ErrorScreen_SendEmail
[前へ]ボタン: [前へ]を非表示
コンポーネントより、表示テキストをドラッグ&ドロップし、プロパティを設定します。
API参照名: dispErrorMessage_SendEmail
テキスト: {!SendEmailWithAttachment.errorMessage}
「エラー画面(メール送信)」の下の「+」マークをクリックし、「終了」を選択します。
10. 商談更新
「成功」の下の「+」マークをクリックし、「レコードを更新」を選択します。
プロパティを設定します。
表示ラベル: 請求書出力日更新
API参照名: UpdateOpportunity
更新するレコードを検索してその値を設定する方法: レコードを識別する条件を指定し、項目を個別に設定
オブジェクト: 商談
レコードを更新する条件の要件: すべての条件に一致 (AND)
項目: Id
演算子: 次の文字列と一致する
値: {!recordId}
項目: InvoiceSendEmailDate__c
値: {!$Flow.CurrentDate}
※商談に請求書メール送信日(API名:InvoiceSendEmailDate__c)のカスタム項目(日付型)を作成しています。
10e. エラー画面(商談更新)
「商談更新」をクリックします。
「障害パスを追加」をクリックします。
「障害」の下の「+」マークをクリックし、「画面」を選択します。
プロパティを設定します。
表示ラベル: エラー画面(商談更新)
API参照名: ErrorScreen_UpdateOpportunity
[前へ]ボタン: [前へ]を非表示
コンポーネントより、表示テキストをドラッグ&ドロップし、プロパティを設定します。
API参照名: dispErrorMessage_UpdateOpportunity
テキスト:
エラーにより、商談の請求書メール送信日を更新できませんでした。
{!$Flow.FaultMessage}
11. 完了画面
「商談更新」の下の「+」マークをクリックし、「画面」を選択します。
プロパティを設定します。
表示ラベル: 完了画面
API参照名: CompletionScreen
[前へ]ボタン: [前へ]を非表示
コンポーネントより、表示テキストをドラッグ&ドロップし、プロパティを設定します。
API参照名: dispCompletionMessage
テキスト:
請求書メールを送信しました。
ファイル: {!OFCComp.fileName}
これでフローは完成です。おつかれさまでした。
「保存」ボタンをクリックし、保存します。
デバッグ
「デバッグ」ボタンをクリックします。
商談のレコードIdを入力し、「実行」ボタンをクリックします。
確認画面が表示されます。
フローを実行で請求書ファイルが保存され、添付メールが送信され、商談の請求書メール送信日が更新されることを確認します。
「もう一度実行」ボタンをクリックすると、エラーメッセージが表示されます。再実行する場合は、商談の請求書メール送信日を空欄にします。
テスト完了後、フローの「有効化」ボタンをクリックし、フロー画面を閉じます。
カスタムボタン作成
レコード画面に配置するフロー実行用のカスタムボタンを作成します。
設定のオブジェクトマネージャより、対象のオブジェクトを開きます。左サイドバーの「ボタン、リンク、およびアクション」をクリックし、「新規アクション」ボタンをクリックします。
アクション情報を設定します。設定後、「保存」ボタンをクリックします。
アクション種別: フロー
フロー: 請求書メール送信
表示ラベル: 請求書メール送信
名前: SendEmailWithInvoice
左サイドバーの「ページレイアウト」をクリックし、作成した帳票出力ボタンを配置し、「保存」ボタンをクリックします。
フローを実行
レコードページの「請求書メール送信」ボタンをクリックします。
ファイルが保存され、請求書メール送信日に実行日がセットされ、メールが活動に保存されます。
取引先責任者に請求書添付付きメールが送信されます。