2018.05.23

DataSpider Cloudを使ってSalesforceからExcel帳票を作ってみました!コードサンプル付き!

みなさま、こんにちは。
テラスカイ西日本の張です。

今更感満載なテーマになってしまって大変恐縮ですが、業務現場では「Excel帳票」からなかなか離れられないのも現実ではないかと思います。ハイスピードかつ低コストでお客様にシステムを提供するのを大前提として、敢えてこのブログを書きました。

ある案件において見積書をExcelで作成することになりました。 その際の要件として、

  • Excelテンプレートを使って帳票を作成します。
  • Salesforceからリアルタイムで見積データを抽出し、抽出結果をExcelテンプレートの決まったセルに書き込みます。
  • Salesforce画面から直接Excel帳票ファイルをダウンロードします。
  • Excel帳票ファイルをSalesforceに自動で保存します。

実現する方法はいろいろありますが、コスト、拡張性と保守性を考慮し、下記の案を採用しました。

  • Salesforce画面にExcel帳票作成とダウンロードするインターフェース(Lightning Experience クイックアクション)を用意します。
  • ドラッグアンドドロップの操作だけでExcel帳票の作成ができるため、帳票の作成はDataSpider Cloudに任せます。
  • DataSpider CloudのHTTPトリガを利用し、SalesforceからExcel帳票作成処理を起動します。
  • DataSpider Cloudから作成されたExcel帳票を直接Salesforce Filesにアップロードします。
これからもう少し詳しく紹介したいと思います。少しでも皆様のお役に立てば幸いです。

システム構成

  1. オペレーターが見積詳細画面にある「見積ダウンロード」ボタンをクリックして、帳票作成を依頼します。裏でDataSpider CloudのHTTPトリガが起動されます。
  2. DataSpider Cloud側のHTTPトリガより帳票作成処理を起動します。
  3. 見積Record Idを持って見積オブジェクトからExcel帳票に必要な項目を検索し、事前に用意したExcelテンプレートに検索結果を書き込みます。
  4. Excel帳票ファイルをSalesforce Filesにアップロードし、アップロードの結果としてContent Version Idを取得します。
  5. HTTPトリガを呼び出した結果として、Content Version Idを返します。Salesforce画面からアップロードされたExcel帳票ファイルをダウンロードできます。

DataSpider Cloud側の処理

Excel帳票の作成

まず事前に用意されたExcelテンプレートをコピーします。次にSalesforceから見積データを検索して、検索結果をExcelファイルに書き込みます。

Excelへの書き込みは「セル指定書き込み」アダプタを利用します。ご覧のとおり、セルアドレスやフォマット等を直接指定できるため、テンプレートはどんな形でも問題なく値をセットできます。

Excel帳票のアップロード

帳票ファイルのアップロード処理はSalesforce データ書き込み(INSERT)アダプタを利用します。

バージョンデータ項目に作成されたExcel帳票のフルパスを指定するだけでファイルをSalesforceにアップロードできます。(Base64項目入力形式に「ファイルパス」を選ぶ必要があります)

HTTPトリガ

HTTPトリガーは、指定したURLに対しHTTPクライアントからリクエストを送ることで、スクリプトを実行する機能です。
詳細は下記をご参照ください。
https://doc.dataspidercloud.com/v1/help/ja/trigger/http_trigger.html
まず、HTTPトリガを登録します。
レスポンスのContent-Typeの設定値はhtml、xml、json、csvなど数種類ありますが、Content Version IDをそのままレスポンスとして返すため、「text/plain」を指定します。

トリガの実行ユーザや、サービスを設定します。
スクリプトの引数の値に「${trigger.inputData}をセットします。
スクリプトの出力の値に「${trigger.outputData}をセットします。

次に外部から上記のHTTPトリガを起動するため、連携サーバの一覧から対象サーバを選んで、下記のような設定を行います。設定を追加するには「+」ボタンをクリックします。

Salesforce側の処理

Lightning Componentの作成

ユーザインターフェースはLightning Experienceを採用しました。Lightning Experience ではJavaScript ボタンがサポートされていないため、専用のLightning Component を作りました。
<aura:component controller="ProjectDetailDownload" implements="flexipage:availableForRecordHome,force:hasRecordId,force:lightningQuickAction" access="global" >
    <aura:attribute name="recordId" type="String" />
    <aura:attribute name="contentVersionId" type="String" />
    <aura:handler name="init" value="{!this}" action="{!c.init}" />
    <aura:handler name="change" value="{!v.contentVersionId}" action="{!c.showDownload}"/>
    <div aura:id="download_block">
            <ui:message severity="info" closable="true">
                見積書を作成しました。
            </ui:message>
            
            <a href="{!'/sfc/servlet.shepherd/version/download/'+ v.contentVersionId}" target="_self">
                <lightning:icon iconName="utility:download" size="small"/>ダウンロード
            </a>
    </div>
</aura:component>
ProjectDetailDownload.cmp
({
    init : function(component, event) {
        var downloadBlock = component.find("download_block");
                $A.util.toggleClass(downloadBlock, "toggle");
        var action = component.get("c.download");
        console.log("redordId = " + component.get("v.recordId")); 
        action.setParams({"projectDetailId": component.get("v.recordId")});
        action.setCallback(this, function(response){
            var urlEvent = $A.get("e.force:navigateToURL");
            component.set("v.contentVersionId", response.getReturnValue());
            console.log("contentVersionId = " + response.getReturnValue());
        });
        $A.enqueueAction(action);
    },
    
    showDownload : function(component, event) {
        var downloadBlock = component.find("download_block");
        $A.util.toggleClass(downloadBlock, "toggle");
    },

})
ProjectDetailDownloadController.js
.THIS.toggle {
    display: none;
}
ProjectDetailDownload.css
global class ProjectDetailDownload {
    
    @AuraEnabled
    webService static String download(String projectDetailId) {
        try {
            String accessUrl = 'https://www.XXXXXXXX.xxx/ws/trigger/seamecprojectdetail?cid=a0G10000003lcwkEAA&sid=10017';
            String authorizationHeader = 'BASIC XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
            String contentVersionId = null;
            Http http = new Http();
            HttpRequest request = new HttpRequest();
            request.setHeader('Authorization', authorizationHeader);
            request.setEndpoint(accessUrl + '&projectDetailSfId=' + projectDetailId);
            request.setMethod('GET');
            HttpResponse response = http.send(request);
            if (response.getStatusCode() == 200) {
                contentVersionId = response.getBody();
            }
            return contentVersionId;
        } catch(exception ex) {
            System.debug('error: '+ex);
            return null;
        }
    }
}
ProjectDetailDownload.cls

クイックアクションの定義

上記のLightning Component を起動するクイックアクション「見積書ダウンロード」を定義します。

更に見積オブジェクトのページレイアウトに、見積書ダウンロードクイックアクションを追加します。

動作確認

Excel帳票のサンプルは下記になります。

終わりに

以上、Excel帳票の作成とダウンロードの一連の実装方法をご紹介しました。DataSpider Cloudの力を発揮しつつ、シンプルなコードでお客様のご要望を実現することができました。特に帳票のレイアウトが変更になった場合、プログラムを改修せず、DataSpider Cloud側の設定を変更するだけで済むので、拡張性と保守性も向上できたではないかと思います。

DataSpiderCloud資料ダウンロード

45 件
     
  • banner
  • banner

関連する記事