【GAS】スプレッドシート内の任意のシートをPDFに変換する

【GAS】スプレッドシート内の任意のシートをPDFに変換する

GAS(Google Apps Script)の案件を手掛ける上でよく使い回す処理をファンクション化してみました。
コピーしてそのまま使うこともできますし、一部カスタマイズして使ってください。

「複数のサイトを横断的に見ないと答えにたどり着かない。。。」
そんな思いにこたえることができれば幸いです!

さて、今回は「スプレッドシート内の任意のシートをPDFに変換する」処理を紹介します。

処理概要

任意のスプレッドシートのシートをPDF化する

【引数】
folderId : 保存先フォルダのID
ssId : PDF化する任意のスプレッドシートのID
sheetId : PDF化する任意のシートのID
fileName : 作成したPDFのファイル名
【返り値】
なし

ファンクション

function createPDF(folderId, ssid, sheetId, fileName) {
  try {
    // 作成したPDFファイルの保存先のフォルダオブジェクトを取得
    let folder = DriveApp.getFolderById(folderId);

    // スプレッドシートをPDFにエクスポートするためのURL(色々なオプションを付けてPDFを作成)
    let url = "https://docs.google.com/spreadsheets/d/" + ssid + "/export?";

    // PDF作成のオプションを指定
    let opts = {
      exportFormat: "pdf",    // ファイルの形式 (pdf, csv, xls, xlsx)
      format:       "pdf",    // ファイルの形式 (pdf, csv, xls, xlsx)
      size:         "A4",     // 用紙サイズ (lega, letter, A4 etc...)
      portrait:     "true",   // 用紙が横向きか?
      fitw:         "true",   // 幅を用紙に合わせるか?
      sheetnames:   "false",  // シート名をPDF上部に表示するか?
      printtitle:   "false",  // スプレッドシート名をPDF上部に表示するか?
      pagenumbers:  "false",  // ページ番号を表示するか?
      gridlines:    "false",  // グリッドラインを表示するか?
      fzr:          "false",  // 固定行を表示するか?
      gid:          sheetId   // シートID (引数で指定)
    };

    // オプションをURLに渡す形に生成
    let url_ext = [];
    for (optKey in opts) {
      url_ext.push(optKey + "=" + opts[optKey]);
    }
    let options = url_ext.join("&");

    // APIを使用するためのヘッダ作成
    let header = {
      headers: {
        'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
      }
    };

    // PDF作成
    let response = UrlFetchApp.fetch(url + options, header);

    // PDFを指定したフォルダに保存
    let blob = response.getBlob().setName(fileName);
    folder.createFile(blob);
  } catch (e) {
    // エラー処理
  }
}

内部処理の説明

PDFを作成する際にポイントとなるのはオプションの作成方法です。
他にもパラメータはありまので、公式サイトで確認してみてください。
(パラメータ未指定時は規定値が設定されます)

オプションはURLにパラメータで与える必要があるので、「key=value」の形で「?」区切りで作成しています。
最後はURLにくっつけてUrlFetchApp.fetch()で実行するだけですね。

念のため、エラーハンドリングができるようにtey~catchを入れています。
ここで発生しうるエラーとして主なものは、以下になります。

  • 短時間に何回もURLが叩かれた
  • 指定したフォルダに既に同じ名前のPDFが存在する

この辺りは必要に応じて実装してください。
「指定したフォルダに既に同じ名前のPDFが存在する」に関しては、「folder.createFile(blob)」で保存する前に存在チェックを行ない、
存在したら削除する or 保存処理をスキップするなどの対応をすればいいかと思います。

基本的にはGASではファイルに関してはBlobデータとして扱うので、色々なケールを見て慣れておくのがいいかなと思います!

まとめ

今回は「スプレッドシート内の任意のシートをPDFに変換する」処理について紹介しました。

Google Apps Script は無料枠でも十分に使えとても便利です。
OSに依存せずに使えることから様々な環境で自動化・省力化してスローライフを楽しみましょう!

GASでの簡易システム制作に関するお問い合わせはこちらからお待ちしております。
LancersMENTAでも活動していますので、そちらからお仕事を依頼して頂けます。