スプレッドシートはそのまま共有することも可能ですが、ファイル自体は共有したくない(というか、相手が外部だから共有できない場合)という場合、PDF化してメールに添付するという方法がメジャーです。
GASで同じことを実装してみましょう。
これは、昨日公開したIPOスタートアップの報酬データを何人から送って欲しいと言われた際の、対応に急遽作ったものなので、コードは雑い点ご了承ください(動作はします)。
スプレッドシートをPDF化する(PDF作成)
スプレッドシートは当然ながら、複数シートが含まれているケースが多いのですが、PDF化したい対象は主に以下の3パターンに分解されるかと思います。
- スプレッドシート全体をPDF化したい
- 特定の1つのシートをPDF化したい
- 特定の複数(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)メソッドはスプレッドシートクラスに属するメソッドです。リファレンスは以下を参照ください。
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet.html#getAs(String)
スプレッドシート全体を指定した、MIME TYPEに応じて、ファイル作成(blob)してくれます。と言いつつ、contentTypeに含められるパラメータblobでは’application/pdf’のみ。
| Name | Type | Description |
|---|---|---|
contentType | String | The 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)メソッドはないんです。
https://developers.google.com/apps-script/reference/spreadsheet/sheet.html

では、どうするかとググると以下の記事がヒットしました。
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つのシート、全てのシート、特定の複数シート)を紹介しています。
- GASでスプレッドシートをPDF化してメール送付する方法
- GASでスプレッドシートをPDF化してメール送付する方法~その2 特定の複数シートを送付する〜
- GASでスプレッドシートをPDF化してメール送付する方法~その3 特定の複数シートを送付するver2〜


