// 申請書テンプレートファイル
const DOC_TEMPLATE = DriveApp.getFileById('ドキュメントID');
// PDF出力先
const PDF_OUTDIR = DriveApp.getFolderById('フォルダID');
function gaslog_formSubmit(e) {
let itemResponses;
// フォームの回答をイベントオブジェクトまたはフォーム自身から取得する。
if (e !== undefined) {
itemResponses = e.response.getItemResponses();
} else {
const wFormRes = FormApp.getActiveForm().getResponses();
itemResponses = wFormRes[wFormRes.length-1].getItemResponses();
}
// 回答をもとに領収書を作成する
let wFileRtn = createGDoc(itemResponses);
// PDF変換してファイルIDを取得する
let wPdfId = createPdf(wFileRtn[0], wFileRtn[1]);
// PDF変換したあとは元ファイルを削除する
DriveApp.getFileById(wFileRtn[0]).setTrashed(true);
// 今回はPDFファイルを添付してメールを送信する
sendEmailEx(
e !== undefined ? itemResponses[0].getResponse() : 'デフォルト送信先アドレス@sample.com'
, '【自動送信メール】領収書の送信'
, `領収書のPDFを送付致します。(このアドレスは送信専用のため返信しないで下さい)`
, {attachments: DriveApp.getFileById(wPdfId).getBlob()}
);
DriveApp.getFileById(wPdfId).setTrashed(true);
}
function createGDoc(itemResponses) {
// テンプレートファイルをコピーする
const wCopyFile = DOC_TEMPLATE.makeCopy()
, wCopyFileId = wCopyFile.getId()
, wCopyDoc = DocumentApp.openById(wCopyFileId); // コピーしたファイルをGoogleドキュメントとして開く
let wCopyDocBody = wCopyDoc.getBody() // Googleドキュメント内の本文を取得する
, today = dayjs.dayjs();
// 商品情報マッピング(質問タイトル → [テンプレ変数, 単価キー])
const productMap = {
'冊子「薄い本・上巻」購入部数': ['冊子「薄い本・上巻」', '500'],
'冊子「薄い本・下巻」購入部数': ['冊子「薄い本・下巻」', '500'],
'冊子「厚い本」購入部数': ['冊子「厚い本」', '1000'],
'アクリルグッズ購入数': ['アクリルグッズ', '500'],
'ミニ色紙購入数': ['ミニ色紙', '2000']
};
let totalPrice = 0;
let itemListText = '';
itemResponses.forEach(function(itemResponse) {
const title = itemResponse.getItem().getTitle();
const response = itemResponse.getResponse();
if (title === 'お名前(領収書に記載)') {
wCopyDocBody = wCopyDocBody.replaceText(`{{name}}`, response || '');
return;
}
if (productMap[title]) {
const [itemName, priceKey] = productMap[title];
const unitPrice = Number(priceKey);
const qty = Number(response);
if (!response || isNaN(qty) || qty === 0) return;
const price = unitPrice * qty;
totalPrice += price;
itemListText += `・${itemName}(¥${unitPrice.toLocaleString()} × ${qty}部)= ¥${price.toLocaleString()} -\n`;
}
});
// 差し込み処理
wCopyDocBody = wCopyDocBody.replaceText(`{{itemList}}`, itemListText || '(該当商品なし)');
wCopyDocBody = wCopyDocBody.replaceText(`{{total}}`, totalPrice.toLocaleString());
wCopyDoc.saveAndClose();
// ファイル名を変更する
let fileName = 'イベント領収書_'+today.format('YYYYMMDD');
wCopyFile.setName(fileName);
// コピーしたファイルIDとファイル名を返却する(あとでこのIDをもとにPDFに変換するため)
return [wCopyFileId, fileName];
}
function createPdf(docId, fileName){
// PDF変換するためのベースURLを作成する
let wOtions = {
headers: {
'Authorization': `Bearer ${ScriptApp.getOAuthToken()}`
}
};
// PDFを作成する
let wBlob = UrlFetchApp.fetch(wUrl, wOtions).getBlob().setName(fileName + '.pdf');
//PDFを指定したフォルダに保存する
return PDF_OUTDIR.createFile(wBlob).getId();
}
function sendEmailEx(_recipient, _subject, _body, _option) {
// 引数の内容でメールを下書き保存する
const mailDraft = GmailApp.createDraft(_recipient, _subject, _body, _option);
// 下書き保存したメールIDから下書きを取得し、メール送信を依頼する
GmailApp.getDraft(mailDraft.getId()).send();
}