GASでスプレッドシートをPDF化してメール送付する方法

GAS
この記事は約8分で読めます。

スプレッドシートはそのまま共有することも可能ですが、ファイル自体は共有したくない(というか、相手が外部だから共有できない場合)という場合、PDF化してメールに添付するという方法がメジャーです。

GASで同じことを実装してみましょう。

これは、昨日公開したIPOスタートアップの報酬データを何人から送って欲しいと言われた際の、対応に急遽作ったものなので、コードは雑い点ご了承ください(動作はします)。

スポンサーリンク
もしも_楽天

スプレッドシートをPDF化する(PDF作成)

スプレッドシートは当然ながら、複数シートが含まれているケースが多いのですが、PDF化したい対象は主に以下の3パターンに分解されるかと思います。

  1. スプレッドシート全体をPDF化したい
  2. 特定の1つのシートをPDF化したい
  3. 特定の複数(2つ以上)のシートをPDF化したい

今回は1と2のケースについて、対応が必要になったので、この2つを説明します。

3の特定の複数シートをPDF化する方法は、2の特定の1つのシートの派生系ですので、別途記事を作成する予定です。

対象となるスプレッドシート

まずは、前提となるスプレッドシートは以下のようになっています。

  • まとめシート
  • 各社シート
まとめシート画像
各社シートサンプル

スプレッドシート全体をPDF化(PDF作成)する

では、早速全体をPDF化してメールする方法から。これは、メソッドが提供されているので、簡単にできます。

function createFilePDFAndEmail(mailAdress) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = ss.getName();
  // getAsは全てのシートをPDF化するしかできないのか。。
  var pdf = ss.getAs("application/PDF").setName(sheetName+"PDF");
  
  
  var recipient = mailAdress; 
  var subject = sheetName + "";
  var body = "報酬情報まとめファイル";
  var options = {attachments: pdf};

  GmailApp.sendEmail(recipient, subject, body, options)
}

ポイントはPDFを作成している、以下の部分と思います。

var pdf = ss.getAs("application/PDF").setName(sheetName+"PDF");

getAs(contentType)メソッドはスプレッドシートクラスに属するメソッドです。リファレンスは以下を参照ください。

Class Spreadsheet  |  Apps Script  |  Google Developers

スプレッドシート全体を指定した、MIME TYPEに応じて、ファイル作成(blob)してくれます。と言いつつ、contentTypeに含められるパラメータblobでは’application/pdf’のみ。

NameTypeDescription
contentTypeStringThe MIME type to convert to. For most blobs, 'application/pdf' is the only valid option. For images in BMP, GIF, JPEG, or PNG format, any of 'image/bmp''image/gif''image/jpeg', or 'image/png' are also valid.

要は、pdfか画像しか作れないメソッドです。。

かつ、スプレッドシートクラスに属するメソッドということは、つまりスプレッドシート全体をPDF化するメソッドという意味です。個別のシートだけPDF化したいときはだめですね。

特定の1つのシートをPDF化したい

実はこれはオフィシャルにはサポートされていません。シートクラスには実は、getAs(contentType)メソッドはないんです。

Class Sheet  |  Apps Script  |  Google Developers
sheetクラスのリファレンス

では、どうするかとググると以下の記事がヒットしました。

Google Apps Script で指定したシートをPDF化するスクリプト

みていくと、要は/export?format=pdfのようにパラメータを渡すことでPDFやCSV形式でダウンロードすることが可能だから、それを使ってUrlfetchして作成しようという感じです。

へぇ初めて知った。csvもこの形態で処理できるんだ。ってことはGASさん公開してないだけで、やろうと思えばメソッド作れるやん。。(実装してや。。)

という、心の声はおいておいて、ざっくり以下の感じにしました。

function createSheetPDFAndEmail(){
   // getAsは全てのシートをPDF化するしかできない->そのために、urlfetchで処理する
   //アクティブシートのIDとGIDを取得する(メニューバー項目開いているシートを送るようにするため)
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getActiveSheet();
   var sheetName = sheet.getName();
   var sheetID = sheet.getSheetId();
   var key = ss.getId();
 //OAuth対応のためにtokenを取得
   var token = ScriptApp.getOAuthToken();
 //URLを作る
   var url = "https://docs.google.com/spreadsheets/d/" + key + "/export?gid=" + sheetID + "&format=pdf&portrait=false&size=A4&gridlines=false&fitw=true"
 //PDF生成するためにURLfetch
   var pdf = UrlFetchApp.fetch(url, {headers: {'Authorization': 'Bearer ' +  token}}).getBlob().setName(sheetName + "報酬シート.pdf");
 //PDFアタッチでメール
   var recipet = "XXX";//mailadressいれる
   var subject = sheetName + "報酬シート";
   var body = sheetName + "ファイルを送ります";
   GmailApp.sendEmail(recipet, subject, body, {attachments:pdf});
 }

ポイントは以下かと思います。

URLを作成する
//URLを作る
   var url = "https://docs.google.com/spreadsheets/d/" + key + "/export?gid=" + sheetID + "&format=pdf&portrait=false&size=A4&gridlines=false&fitw=true"

シンプルにシートURLと?gid(ここが個別のシートを指定する要素)を設定して、他のパラメータを複数渡して作成する形です。

OAuthに必要なtokenの取得と利用

あとは、この方法OAuthでToken取得しないといけないので、ScriptAppクラスも利用します。

トークンの取得は以下。

//OAuth対応のためにtokenを取得
   var token = ScriptApp.getOAuthToken();

取得したトークンをheaderにBearerでくっつけます。

 //PDF生成するためにURLfetch
   var pdf = UrlFetchApp.fetch(url, {headers: {'Authorization': 'Bearer ' +  token}}).getBlob().setName(sheetName + "報酬シート.pdf");

ちなみに、Bearerというのは、持参人って意味合いです。トークンを持ってる人が正しい所有者って前提で作成されるOAuthの概念の一つ(マニアックだからノンプロメンバーは知らなくてもいいですw)

まとめ

なんで、sheetClassにはgetAsメソッドがないんだと思いつつ、/export?format=を使えば色々できることが把握できました。あまり使わないかもだけど覚えておこうと思います。

今回は会社別役員報酬のデータという、日頃誰も使わないデータが対象でしたが、別にその他のレポートでも、請求書でも同じことができますね。

実務に使える要素を学習して、適用していってください。

関連記事: spreadsheetをPDF化してメール送付する

spreadsheetで作成したデータをPDF化してメールしてみましょう。spreadsheetのPDF化の方法(1つのシート、全てのシート、特定の複数シート)を紹介しています。

  1. GASでスプレッドシートをPDF化してメール送付する方法
  2. GASでスプレッドシートをPDF化してメール送付する方法~その2 特定の複数シートを送付する〜
  3. GASでスプレッドシートをPDF化してメール送付する方法~その3 特定の複数シートを送付するver2〜