Salesforceのフローで請求書作成+添付メール送信する – Office File Creator応用編 –

今回、フローで請求書作成+添付メール送信の作成手順をご紹介します。請求書ファイルは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

 

左サイドバーの「ページレイアウト」をクリックし、作成した帳票出力ボタンを配置し、「保存」ボタンをクリックします。

 

 

フローを実行

レコードページの「請求書メール送信」ボタンをクリックします。

 

ファイルが保存され、請求書メール送信日に実行日がセットされ、メールが活動に保存されます。

 

取引先責任者に請求書添付付きメールが送信されます。

 

 

タイトルとURLをコピーしました