スプレッドシートをPDF化してメールを送付する方法を紹介していきます。
スプレッドシートのPDF化をするときに生じるパターンは主に以下だと思います。
- スプレッドシート全体をPDF化したい
- 特定の1つのシートをPDF化したい
- 特定の複数(2つ以上)のシートをPDF化したい
前回1と2については、みていきました。確認されたい方は以下の記事をご確認ください。
今回は残っている3.特定の複数(2つ以上)のシートをPDF化したい、というパターンに対応していきます。
特定のスプレッドシートをPDF化するための準備
実現方法を考えてみよう
特定のスプレッドシートをPDF化するといった場合どのようなやり方が想定されるでしょうか?ここはまずは頭の使い方についての説明です。
パッと思いつく方法は以下の2つではないでしょうか?
- 送りたいシートだけ選択する
- 送りたくないシートを除外する
対象を選ぶ、もしくは対象外を除くという2つのパターンがイメージできましたでしょうか?
別に両方とも実装は可能なのですが、まずはどういう方法ができるかパターンを考えてその中で実装しやすいものを選んでいくというステップが効率的に実装できるようになっていくためには必要です。
GASに限らずpythonやその他の言語でも選択肢を思い描いてから実装する癖をつけていきましょう。
今回実装する方法
さて、上記2つの方法のなかで、今回は直感的に作る“送りたいシートだけ選択する”という方法を考えていきます。
対象となるスプレッドシート
まずは、前提となるスプレッドシートは以下のようになっていました。
- まとめシート
- 各社シート


ここに、今回シートを選択する機能をつけるために1つシートを追加していきます。

要素としては、以下となります。
・シートインデックス(対象シートを選ぶために使うので、sheetのインデックス、最初のシートを0としてカウントアップで入力)
・会社名(わかればなんでもいいです)
・チェックボックス
今回はシートインデックスとチェックボックス(クリックするとtrueが入る特性を利用)を利用していきます。
特定のシートを選択してPDF化して送付
では、早速特定のシートを選択して送るためのコードを説明します。
まず、大前提で、選択対象シートでいづれか複数の会社名をチェックしておいてください。以下のような感じに。

では、上のような画像のように選択されている前提で、スクリプトを作成していきましょう。
function createSpecificSheetPDFAndEmail(){ // getAsは全てのシートをPDF化するしかできない->そのために、urlfetchで処理する var ss = SpreadsheetApp.getActiveSpreadsheet(); var key = ss.getId(); var sheets = ss.getSheets(); //OAuth対応のためにtokenを取得 var token = ScriptApp.getOAuthToken(); //送付対象チェックを取得 var comList = ss.getSheetByName("送付対象シート").getDataRange().getValues(); Logger.log(comList); //送付対象だけ抜き出し var checkedCom = []; for(var i=0; i<comList.length; i++){ if(comList[i][2]===true){ checkedCom.push(comList[i][0]); } } //作成したPDFを仮置きするフォルダーを指定 var tmpFolder = DriveApp.getFolderById(id); //送付シート作成(複数前提のためfor loopで) for(var i=0; i< checkedCom.length; i++){ var sheet = sheets[checkedCom[i]]; var sheetName = sheet.getName(); var sheetID = sheet.getSheetId();//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をtmpFolderに保存(ファイル作成)tmpFolder.createFile(pdf);
} //pdfを仮保存したフォルダから取得する var pdfs = tmpFolder.getFiles(); // pdffileを配列データにして、attachmentに入れ込むようの元配列 var pdfFiles = []; // whileでフォルダ内にpdfが有る限りpdfFiles配列に入れ込む while(pdfs.hasNext()){ pdfFiles.push(pdfs.next().getAs("application/PDF")); } var recipet = "メールアドレス"; var subject = "報酬シート"; var body = "ファイルを送ります"; GmailApp.sendEmail(recipet, subject, body, {attachments:pdfFiles}); }
基本的には前回説明した特定のシートをPDF化する時と同様にurlFetchでPDFを作成していきます。その部分が選択したシート分だけ実行されて、tmpフォルダにPDFファイルが作成されていく形です。
チェックボックスのデータはどうなっている?
今回新たに機能として織り込んだチェックボックスでのシート選択について少しみていきましょう。対象コードは以下です。
//送付対象チェックを取得
var comList = ss.getSheetByName("送付対象シート").getDataRange().getValues();
Logger.log(comList);
//送付対象だけ抜き出し
var checkedCom = [];
for(var i=0; i<comList.length; i++){
if(comList[i][2]===true){
checkedCom.push(comList[i][0]);
}
}
まずは、チェックボックスをクリックしたデータ、していないデータで何が違っているのかみていきます。Logger.logでcomListをみてみます。

各要素の3つ目の値がチェックボックスの値になります。以下のようになっていることが確認できますか?
・クリックされている→ true
・クリックされていない→ false
非常にシンプルですが、ありがたいboolean型のデータが得られますね。ということで、データを一覧で取得して、trueのものだけ選択すると対象シートがデータとして取得できることがわかります。
tmpフォルダに入れたpdfを取得して添付する
まず、添付ファイルが複数になる場合、attachmentsに配列を渡してあげれば対応可能です。
なので、複数のPDFデータが入っている配列を作っていっています。実際のコードは以下の部分です。
//pdfを仮保存したフォルダから取得する
var pdfs = tmpFolder.getFiles();
// pdffileを配列データにして、attachmentに入れ込むようの元配列
var pdfFiles = [];
// whileでフォルダ内にpdfが有る限りpdfFiles配列に入れ込む
while(pdfs.hasNext()){
pdfFiles.push(pdfs.next().getAs("application/PDF"));
}
フォルダを指定して、getFiles()メソッドを使用すると、fileiteratorが返ってきます。
fileiteratorを利用して、hasNext()メソッドで、存在確認して、存在する場合は配列に対象のfileオブジェクトを作成して(pdfs.next()の部分)、getAs(content type)でPDFファイルとして取得してpdfFilesにpushしていきます。
まとめ
特定のシートを選択してPDF化する方法をみていきました。
今回は選択したものを選ぶという方法を紹介しています。この方法の場合PDFが全てバラバラに出てきます。もちろんPDFファイルを結合してから、添付すればいいのですが、実は結合する必要がない方法が実はあります。
それが、今回紹介しなかった、送りたくないシートを除外するという方法になります。こちらは次回紹介していきます。
実装のための考え方や応用できそうな要素をぜひ身につけていってください。
関連記事: spreadsheetをPDF化してメール送付する
spreadsheetで作成したデータをPDF化してメールしてみましょう。spreadsheetのPDF化の方法(1つのシート、全てのシート、特定の複数シート)を紹介しています。