📘
GASでGoogle スプレッドシートの任意のシートをPDFで保存する
何をしたかったか
長野県長和町で行われたシッカソンというハッカソンでLINE Botと連携した何かを作ることになり、そこでGASとSpredsheetで書類を自動生成したかったのです。
GASでGoogle スプレッドシートの任意のシートをPDF形式で保存するコードを説明します。
コード
とりあえず全体を記載します。
const SpreadSheet_ID = "スプレッドシートのID";
const drive_ID = '保存するGoogle DriveのID';
const sheet_Name = '保存するシート名';
const output_file = '出力するファイル名.pdf'
function savePDF() {
var spreadsheets = SpreadsheetApp.openById(SpreadSheet_ID);
var form_sheet = spreadsheets.getSheetByName(sheet_Name)
var sheet_id = form_sheet.getSheetId();
var output_url = createUrlForPdf(spreadsheets);
Logger.log(output_url);
/** @type {string} ユーザーのOAuth2.0アクセストークン */
const token = ScriptApp.getOAuthToken();
// URLからblobデータを取得する
const blob = UrlFetchApp.fetch(output_url, {headers: {'Authorization': 'Bearer ' + token}}).getBlob();
var folder_id = getFolderIdBySpreadsheet(spreadsheets);
var fileName = output_file;
// ファイル名を設定してフォルダにPDFファイルを出力する
DriveApp.getFolderById(folder_id).createFile(blob.setName(fileName));
}
/**
* PDF出力用のURLを作成する.
* @param {Spreadsheet} 出力対象のスプレッドシート.
*/
function createUrlForPdf(spreadsheet) {
const params = {
'exportFormat': 'pdf',
'format': 'pdf',
'gid': spreadsheet.getSheetByName('Application_form').getSheetId(), // シート名を指定して出力対象シートのIDを指定
'size': 'A4', // 用紙サイズ:A4
'portrait': true, // 用紙向き:縦
'fitw': true, // 幅を用紙に合わせる
'horizontal_alignment': 'CENTER', // 水平方向:中央
'gridlines': false, // グリッドライン:非表示
}
const query = Object.keys(params).map(function(key) {
return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
}).join('&');
return `https://docs.google.com/spreadsheets/d/${spreadsheet.getId()}/export?${query}`;
}
/**
* スプレッドシートが格納されているフォルダのIDを取得する.
* @param {Spreadsheet} 対象のスプレッドシート.
*/
function getFolderIdBySpreadsheet(spreadsheet) {
const parents = DriveApp.getFileById(spreadsheet.getId()).getParents();
const folder = parents.next();
return folder.getId();
}
これで指定したGoogle DriveにPDF形式で保存されます。
ちなみに、取得したblobデータをメールで添付して送ることもできるます。
その場合、以下のようなコードをblobを取得した後に追加します。
var to = "送付先メールアドレス";
var subject = "メールのSubject";
var body ="";
GmailApp.sendEmail(to,
subject,
body,
{attachments: blob});
例えば、EPSON Connect APIにプリンタを登録するとメールを送ることで添付のPDFを印刷することができたりして便利です。
Discussion