
スプレッドシートを自動でPDFにできたらなあ…



複数のシートを別々のPDFに分けられたらいいのになあ
スプレッドシートをPDFに変換したいとき、手作業で1シートずつしていたら、時間がかかると思います。
GASを使えば、数回のクリックでパッとPDFに変換できるんじゃないかと考えているかもしれませんね。
そこでこのページでは、スプレッドシートをPDF化するGASのテンプレートを配布したり、GASのプログラムを解説したりします。


すぐ使えるテンプレートファイル



自分でコードを書く時間はないから、完成版がほしい!
時間がないときは、自分でコードを書くのも面倒だと思うので、完成版を以下に用意しました。
複製して使ってみてください。


ちなみに、このGASで作れるPDFは以下の出力設定になっています。
設定を変更したい場合は、PDFの出力オプションを編集する方法を参考にしてくださいね。
- 用紙サイズ:A4
- 用紙の向き:横向き
- ページ幅を用紙にフィットさせるか:フィットさせる
- 上の余白:0.50
- 右の余白:0.50
- 下の余白:0.50
- 下の余白:0.50
- シート名の表示:なし
- スプレッドシート名の表示:なし
- ページ番号をどこに入れるか:入れない
- スケール:ページに合わせる
- 水平方向の位置:中央
- 垂直方向の位置:中央
- グリッドラインの表示:なし
- 固定行の表示:なし
- 固定列の表示:なし
ここからは、完成版の使い方を解説していきます。
「原本_GASでスプレッドシートのシートを1枚ずつPDFにする」を複製してください。
▼メニューバーの[ファイル]>[コピーを作成]をクリックします。


▼複製先のフォルダを指定したら[コピーを作成]をクリックしましょう。


新しいタブが開いて、複製されたスプレッドシートが表示されますよ。
B2とB3セルに以下のURLを入力してください。
- B2:PDF化したいスプレッドシートのURL
- B3:PDFを保存するGoogle DriveのフォルダのURL


▼こんな感じで、URLを入力します。


このGASでは、各シート名がPDFのファイル名になります。
もしシート名が「シート1」や「シート2」となっている場合は、希望のPDFファイル名に変更しておくのがいいと思います。


[GASメニュー]をクリックすると[スプレッドシートをPDF化する]が表示されるので、クリックしましょう。


このGASを初めて実行する場合、このような画面が出てくると思います。


これは、このGASを実行してもいいかの承認を求める画面です。
[続行]をクリックしたら、あとは画面の指示に従って、クリックして進めていきます。
どうすればいいかわからない場合は、以下のページを参考にしてみてください。
画像付きで、解説していますよ。


承認が終わったら、もう一度[GASメニュー]>[スプレッドシートをPDF化する]をクリックしてください。
GASが実行されます。
「スプリプトを実行しています」と表示されている間は、しばらく待ちましょう。
最大で6分ほどかかることがあります。


「スクリプトが終了しました」と表示されたら、PDF化が完了しています。


対象のGoogle Driveを見てみましょう。
PDFが保存されているはずです。
▼今回はシート名を「シート1〜3」のまま、PDF化しました。


GASのコード解説
このGASのプログラムは以下のとおりです。
/**
* この関数は、スプレッドシートをPDF化し、指定のGoogle Driveに保存します。
*/
function saveSheetsAsPdf() {
// 「PDF化準備」シートを取得する
const prepSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('PDF化準備');
// B2セルから「PDF化したいスプレッドシート」のURLを取得する
const spreadsheetUrl = prepSheet.getRange('B2').getValue();
// もしB2セルにURLが入っていなかったら、エラーを出し、処理を止める。
if (!spreadsheetUrl) {
Browser.msgBox('お願い','B2セルに「PDF化したいスプレッドシート」のURLを入力してください。',Browser.Buttons.OK);
return;
}
// URLを使って「PDF化したいスプレッドシート」を開く
const spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);
// 「PDF化したいスプレッドシート」のIDを取得する
const spreadsheetId = spreadsheet.getId();
//スプレッドシート内すべてのシートを取得する
const allSheets = spreadsheet.getSheets();
// B3セルからGoogle DriveのフォルダURLを取得する
const driveFolderUrl = prepSheet.getRange('B3').getValue();
// もしB3セルにURLが入っていなかったら、エラーを出し、処理を止める。
if (!driveFolderUrl) {
Browser.msgBox('お願い','B3セルにPDFを保存するGoogle DriveのURLを入力してください。',Browser.Buttons.OK);
return;
}
// URLからGoogle DriveフォルダIDを抽出する
const driveFolderId = driveFolderUrl.toString().split('/folders/')[1];
// すべてのシートに同じ処理をする
allSheets.forEach((sheet) => {
// Prepare the URL for generating PDF.
let pdfUrl = preparePdfUrl(spreadsheetId, sheet.getSheetId());
// PDFを取得するためにURLをfetchする
let response = UrlFetchApp.fetch(pdfUrl, {
headers: {
'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
}
});
// PDF blobを取得し、PDFに名前をつける(形式:シート名.pdf)
let pdf = response.getBlob().setName(sheet.getName() + '.pdf');
// Google Driveのフォルダを取得する
let folder = DriveApp.getFolderById(driveFolderId);
// フォルダにPDFを作成する
folder.createFile(pdf);
// rate limit error (error 429)を回避するための6秒スリープ
Utilities.sleep(6000);
});
}
/**
* この関数では、スプレッドシートのPDFを作るためのURLを準備します。
*
* @param {string} spreadsheetId - スプレッドシートのID
* @param {string} sheetId - シートのID
* @return {string} PDFを作るためのURL
*/
function preparePdfUrl(spreadsheetId, sheetId) {
let url = 'https://docs.google.com/spreadsheets/d/' + spreadsheetId + '/export?format=pdf&id=' + spreadsheetId;
// PDFの出力オプションをURLに追加する
url += '&gid=' + sheetId
+ '&size=A4'//用紙サイズ (A4)
+ '&portrait=false'//用紙の向き true: 縦向き / false: 横向き
+ '&fitw=true'//ページ幅を用紙にフィットさせるか true: フィットさせる / false: 原寸大
+ '&top_margin=0.50'//上の余白
+ '&right_margin=0.50'//右の余白
+ '&bottom_margin=0.50'//下の余白
+ '&left_margin=0.50'//左の余白
+ '&sheetnames=false'//シート名の表示有無
+ '&printtitle=false'//スプレッドシート名の表示有無
+ '&pagenum=UNDEFINED'//ページ番号をどこに入れるか
+ '&scale=4'//1= 標準100%, 2= 幅に合わせる, 3= 高さに合わせる, 4= ページに合わせる
+ '&horizontal_alignment=CENTER'//水平方向の位置
+ '&vertical_alignment=CENTER'//垂直方向の位置
+ '&gridlines=false'//グリッドラインの表示有無
+ '&fzr=false'//固定行の表示有無
+ '&fzc=false';//固定列の表示有無
return url;
}
/**
* スプレッドシートを開いたときに、自動でメニューが表示されるようにする
*/
function onOpen() {
var ui = SpreadsheetApp.getUi()
//メニュー名を設定する
var menu = ui.createMenu("GASメニュー");
//メニューに実行ボタン名と関数を割り当てる
menu.addItem("スプレッドシートをPDF化する","saveSheetsAsPdf");
//スプレッドシートに反映する
menu.addToUi();
}
GASの大まかな流れ
このコードの大まかな流れは、以下のとおりです。
- 「PDF化準備」シートを取得する
- B2セルから「PDF化したいスプレッドシート」のURLを取得する
- 「PDF化したスプレッドシート」内のすべてのシートを取得する
- B3セルからGoogle DriveのフォルダURLを取得する
- すべてのシートをPDF化する
- PDFをGoogle Driveの指定フォルダに保存する
スプレッドシートとGoogle DriveフォルダのURLさえ入れれば、すぐに使えますよ!
PDFの出力オプションの設定値
PDFに出力する際のオプション設定方法を解説します。
設定する項目がいくつかあるので、それぞれを表でまとめますね。
コード | 内容 |
---|---|
size | A3 / A4 / letterなど |
portrait | 用紙の向き true:縦向き / false:横向き |
fitw | ページ幅を用紙にフィットさせるか true:フィットさせる / false:原寸大 |
top_margin | 上の余白 |
right_margin | 右の余白 |
bottom_margin | 下の余白 |
left_margin | 左の余白 |
sheetnames | シート名をPDFに表示するか true:表示する / false:表示しない |
printtitle | スプレッドシート名をPDFに表示するか true:表示する / false:表示しない |
pagenum | ページ番号を表示するか true:表示する / false:表示しない |
scale | 1:標準100% / 2:幅に合わせる / 3:高さに合わせる / 4:ページに合わせる |
horizontal_alinment | 水平方向の位置 |
vertical_alinment | 垂直方向の位置 |
gridlines | グリッドラインを表示するか true:表示する / false:表示しない |
fzr | 固定行の表示有無 true:表示する / false:表示しない |
fzc | 固定列の表示有無 true:表示する / false:表示しない |
以下の項目は、シートの内容に応じて、変更する頻度が高いと思われます。
- portrait
- fitw
- scale
必要に応じて、値を変更してみてくださいね。
このGASを作った経緯
私は業務委託で、Webスクール事業の事務業務の効率化サポートをしています。
毎月このスクールでは、受講者に成績表をPDFで配布しています。
以前は、スプレッドシートに受講者の人数分のシートを用意して、それらを手作業でPDF化していました。
1カ月に100人以上の成績表をつくるので、手作業でPDF化していると、非常に時間がかかります。
そこで、GASで自動化できないかと、私が相談を受けました。
さいごに
スプレッドシートをPDF化するGASプログラムを解説しました。
テンプレートファイルを使えば、すぐにPDF化できるので、試してみてくださいね。
もしも「この作業もGASでできるかな?」というお悩みをお持ちの場合は、コメント欄でおしえてください。


コメント