📘

GASでGoogle スプレッドシートの任意のシートをPDFで保存する

2023/11/13に公開

何をしたかったか

長野県長和町で行われたシッカソンというハッカソンで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