スプレッドシートはそのまま共有することも可能ですが、ファイル自体は共有したくない(というか、相手が外部だから共有できない場合)という場合、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)メソッドはスプレッドシートクラスに属するメソッドです。リファレンスは以下を参照ください。

スプレッドシート全体を指定した、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)メソッドはないんです。


では、どうするかとググると以下の記事がヒットしました。
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つのシート、全てのシート、特定の複数シート)を紹介しています。