前提
業務が拡大し、発注書、契約書、見積/納品/請求書などの帳票を Word などから作るのが面倒臭くなってきた為、Salesforce からボタン一発で帳票出力できるようにしたい。
SVF/SVE/OPRO/Create!Form/Fleekform/JasperReports などなど数多の帳票ツールを試した結果、
料金面と、使い勝手の良さから GoogleスプレッドシートとSalesforceを連携させ、
GoogleスプレッドシートからPDF帳票を出力するように自前でプログラム開発した。
Google Apps Script 側は、Execution API を利用し、Salesforce → Google の認証は、認証プロバイダを利用する。
※認証プロバイダの作り方は以下などを参照
https://help.salesforce.com/articleView?id=sf.sso_provider_google.htm&type=5
メリット
1)専用のツールなどではなく、スプレッドシートで帳票を定義できる為、操作が簡単な事
2)Google Workspace1アカウントあれば利用可能な為、圧倒的に低コスト
システム概要
1)Googleスプレッドシートで帳票を設計

2)連携プログラムで帳票を自動生成

サンプルコード
1)Apex側
public with sharing class Google {
private static final String gasFileId = 'GAS_FILE_ID';
private static final String sheetFileId = 'SHEET_FILE_ID';
public static void createPDF() {
String token = Auth.AuthToken.getAccessToken('0SO2s0000008OIo', 'Open ID Connect');
// プロパティにはスプレッドシートの名前付き範囲の名前を指定
String invoiceData =
'{' +
' "INVOICE_NUMBER": "B0000001"' +
' "PAYMENT_DATE": "2021/5/30",' +
' "LIMIT_DATE": "2021/6/30",' +
' "ACCOUNT": "テスト商事株式会社",' +
' "SUBJECT": "以下の通りご請求申し上げます。",' +
' "ITEMS": [' +
' {' +
' "SUBJECT": "XXX様向け ABCシステム開発・保守",' +
' "PRICE": "XXX円"' +
' },' +
' {' +
' "SUBJECT": "XXX様向け ABCシステム設計",' +
' "PRICE": "XXX円"' +
' }' +
' ]' +
'}';
Http h = new Http();
HttpRequest req = new HttpRequest();
// Execution APIを利用
req.setEndpoint('https://script.googleapis.com/v1/scripts/' + gasFileId + ':run');
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');
req.setHeader('Authorization', 'Bearer ' + token);
req.setBody(JSON.serialize(new Map<String, Object> {
// GASメソッド名を指定
'function' => 'createPDF',
// GASメソッドへの引数を指定
'parameters' => new List<String> {
sheetFileId,
invoiceData
},
'devMode' => true
}));
HttpResponse res = h.send(req);
Blob pdfData = EncodingUtil.base64Decode(res.getBody());
// ファイルとして挿入
insert new ContentVersion(
Title = 'サンプル帳票.pdf',
VersionData = pdfData
);
}
}
2)Google Apps Script 側
弊社は Google Apps Script をコーディングする際は、VSCode などのエディタを利用して clasp でデプロイしています。
この辺りの細かい操作手順は以下の記事などをご参考にして下さい。https://qiita.com/HeRo/items/4e65dcc82783b2766c03
// PDF作成のオプション
const opts_a4pdf = {
exportFormat: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx
format: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx
size: "A4", // 用紙サイズの指定 legal / letter / A4
portrait: "true", // true → 縦向き、false → 横向き
fitw: "true", // 幅を用紙に合わせるか
sheetnames: "false", // シート名をPDF上部に表示するか
printtitle: "false", // スプレッドシート名をPDF上部に表示するか
pagenumbers: "false", // ページ番号の有無
gridlines: "false", // グリッドラインの表示有無
fzr: "false", // 固定行の表示有無
// gid: sheetId // シートIDを指定 sheetidは引数で取得
};
/**
* PDFを取得する
* @param ssId 事前定義したスプレッドシードID
* @param data {名前付範囲:データ}
*/
function createPDF(ssId, dataJson) {
let spreadSheet = SpreadsheetApp.openById(ssId);
let sheet = spreadSheet.getSheets()[0];
let sheetName = sheet.getName();
let data = JSON.parse(dataJson);
// 名前付範囲に値を差し込み
// ※注意:配列(ITEMS)の扱いは端折っています。
for (let key in data) {
let range = spreadSheet.getRangeByName(key);
range.setValue(data[key]);
}
// スプレッドシートをPDFにエクスポートするためのURL
let url = `https://docs.google.com/spreadsheets/d/${ssId}/export?`;
let url_ext = [];
for (opt in opts_a4pdf) {
url_ext.push(opt + "=" + opts_a4pdf[opt]);
}
// API使用のためのOAuth認証
let token = ScriptApp.getOAuthToken();
// PDF作成
let response = UrlFetchApp.fetch(url + url_ext.join("&"), {
headers: {"Authorization" : "Bearer " + token}
});
let pdfBlob = response.getBlob();
return Utilities.base64Encode(pdfBlob.getBytes());
}
結果のサンプル
Salesforce → ファイルタブ → 新しく作られたファイルを開くと、以下のような帳票が見事に出来上がり!

総括
自前でプログラムを作る必要はありましたが、そんなに高度ではなく導入できました。
結果として帳票設計の簡単さと、圧倒的な低コストで帳票システムが利用できるのがお気に入りです。
今回はPDF出力ですが、ゆくゆくはExcel出力もご紹介しようと思います。
お楽しみに!
追伸
導入のお手伝いもさせて頂いていますので、ご興味のある方は是非、お気軽にお問い合わせ下さい。