こんにちは!
Yuki (@yukibnb) です。
今回はGoogle Apps Script (GAS) を使ってスプレッドシートの現在のシートをPDF化してGoogle Driveに保存する方法を紹介します。
コピペでできるスクリプトに加え、カスタマイズのポイントも詳しく紹介します。
では見ていきましょう!
Google DocsをPDF化してGoogle Driveに保存したい方は以下解説記事をご覧ください。
【コピペでOK!】GASでGoogle DocsをPDF化する方法
はじめに
今回実現したいこと
ボタン一つで現在開いているスプレッドシートのシートをPDF化し、指定したGoogle Driveのフォルダーに保存します。
手作業よりも大幅に時間短縮することができ、業務効率化を実現できます。
今回使用するサンプルスプレッドシート
今回はこちらの架空の請求書スプレッドシートを使用して解説します。
もちろん請求書、発注書、納品書、報告書、企画書など普段みなさんが使用しているさまざまな形式のスプレッドシートで活用できます。
では方法を見てみましょう!
コピペでOK!GASで現在のシートをPDF化&保存する方法
スクリプトエディタを開く
PDF化したいスプレッドシートを開き、次の手順でGoogle Apps Scriptのスクリプトエディタを開いてください。
- 画面上部の[ツール]をクリックする
- [スクリプトエディタ]をクリックする
するとスクリプトエディタが開きます。次の2点はお好きな名前に変更してください。
- プロジェクト名 (「無題のプロジェクト」と書いている箇所)
- スクリプト名 (「コード.gs」と書いている箇所)
スクリプトをコピペする
スクリプトエディタに以下のスクリプトをコピペしてください。
スクリプトエディタにもともと入力されていたfunction myFunction() { }
は消してください。
変数folderId
にPDFを保存したいGoogle DriveのフォルダーのフォルダーIDを入力してください。フォルダーIDの確認方法がわからない場合、以下記事をご覧ください。
【簡単!】GASでフォルダーを指定する方法
変数fileName
にPDFのファイル名を入力してください。
function savePdf(){ //PDFの保存先 //★★★フォルダーIDを入力してください★★★ let folderId = "フォルダーID"; //アクティブなスプレッドシートを取得する let ss = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートIDを取得する let ssId = ss.getId(); //シートIDを取得する let shId = ss.getActiveSheet().getSheetId(); //★★★PDFのファイル名を入力してください★★★ //※ポイント: ファイル名が重複しないようにしましょう let fileName = "テストファイル"; //関数createPdfを実行し、PDFを作成して保存する createPdf(folderId, ssId, shId, fileName); } //PDFを作成し指定したフォルダーに保存する関数 //以下4つの引数を指定する必要がある //1: フォルダーID (folderId) //2: スプレッドシートID (ssId) //3: シートID (shId) //4: ファイル名 (fileName) function createPdf(folderId, ssId, shId, fileName){ //PDFを作成するためのベースとなるURL let baseUrl = "https://docs.google.com/spreadsheets/d/" + ssId + "/export?gid=" + shId; //★★★自由にカスタマイズしてください★★★ //PDFのオプションを指定 let pdfOptions = "&exportFormat=pdf&format=pdf" + "&size=A4" //用紙サイズ (A4) + "&portrait=true" //用紙の向き true: 縦向き / false: 横向き + "&fitw=true" //ページ幅を用紙にフィットさせるか true: フィットさせる / false: 原寸大 + "&top_margin=0.50" //上の余白 + "&right_margin=0.50" //右の余白 + "&bottom_margin=0.50" //下の余白 + "&left_margin=0.50" //左の余白 + "&horizontal_alignment=CENTER" //水平方向の位置 + "&vertical_alignment=TOP" //垂直方向の位置 + "&printtitle=false" //スプレッドシート名の表示有無 + "&sheetnames=false" //シート名の表示有無 + "&gridlines=false" //グリッドラインの表示有無 + "&fzr=false" //固定行の表示有無 + "&fzc=false" //固定列の表示有無; //PDFを作成するためのURL let url = baseUrl + pdfOptions; //アクセストークンを取得する let token = ScriptApp.getOAuthToken(); //headersにアクセストークンを格納する let options = { headers: { 'Authorization': 'Bearer ' + token } }; //PDFを作成する let blob = UrlFetchApp.fetch(url, options).getBlob().setName(fileName + '.pdf'); //PDFの保存先フォルダー //フォルダーIDは引数のfolderIdを使用します let folder = DriveApp.getFolderById(folderId); //PDFを指定したフォルダに保存する folder.createFile(blob); }
スクリプトを保存する
スクリプトをコピペするとこのようになります。
画像内のアイコンをクリックし、コピペしたスクリプトを保存してください。
これで現在開いているスプレッドシートのシートをPDF化してGoogle Driveの指定フォルダーに保存するGASの完成です!
関数savePdf
を実行するとPDF化&保存できます。
ただ毎回スクリプトエディタを開いて関数savePdf
を実行するのは手間なので、スプレッドシート上に独自メニューを作成します。
独自メニューを使用することで、スクリプトエディタを開かなくてもGASを実行してPDF化&保存できるようになります。
独自メニューを作成する
今開いているスクリプトエディタ内で、以下の手順で新しいスクリプトを作成してください。
- [+]アイコンをクリックする
- [スクリプト]をクリックする
するとこのように新しいスクリプトが表示されます。
スクリプト名はお好きなものに変更してください。上記画像では「メニュー.gs」としました。
「メニュー.gs」のスクリプトエディタに以下のスクリプトをコピペしてください。
もともと入力されていたfunction myFunction() { }
は消してください。
function onOpen() { let ui = SpreadsheetApp.getUi() //メニュー名を決定 //★★★メニュー名は好きなものに置き換えてください★★★ let menu = ui.createMenu("GAS実行"); //メニューに実行ボタン名と関数を割り当て //★★★実行ボタン名は好きなものに置き換えてください★★★ menu.addItem("PDF作成","savePdf"); //スプレッドシートに反映 menu.addToUi(); }
画像内のアイコンをクリックし、コピペしたスクリプトを保存してください。
これでスプレッドシートに独自メニューを表示するGASの完成です!
独自メニューのスクリプトについての詳しい解説は以下記事をご覧ください。
【コピペでOK!】スプレッドシートのメニューバーにGAS実行ボタンを追加する方法
スプレッドシートを更新する
スプレッドシートに戻り[更新]ボタンをクリックしてスプレッドシートを更新してください。
更新すると、[ヘルプ]の右側に独自メニュー[GAS実行]が表示されました。
GASを実行してみよう!
ではいよいよGASを実行し、今開いているスプレッドシートのシートをPDF化しGoogle Driveのフォルダーに保存してみましょう。
独自メニュー[GAS実行]をクリックし、そして実行ボタン[PDF作成]をクリックしてください。
[PDF作成]をクリックすると関数savePdf
が実行されます。
GASの初回実行時に承認を求めるポップアップが表示されます。以下記事の手順に従って初回承認を行ってください。画像やGIF動画付きで詳しく確認できます。
【もう迷わない!】GAS初回実行時の承認方法
指定したGoogle Driveのフォルダーに無事PDFが保存されました!
これでGASの作成は完了です!
次にみなさん自身でカスタマイズしたい場合のポイントをいくつかご紹介します。
カスタマイズのポイントを紹介
ファイル名は重複しないようにしよう
//★★★PDFのファイル名を入力してください★★★ //※ポイント: ファイル名が重複しないようにしましょう let fileName = "テストファイル";
変数fileName
がPDFのファイル名となります。
今回のテストスクリプトではわかりやすいように"テストファイル"
という文字列にしましたが、みなさんが実際に使用する際はファイル名が重複しないように動的な情報を変数fileName
に含めることをおすすめします。
ファイル名が重複すると、GASを実行するたびに同じファイル名のファイルが増えてしまいます。同じファイル名でも上書きされないため、以下画像のようにどれがどれだか判別できなくなります。
動的な情報を含むファイル名とは以下のようなものです。
YYMMDD_請求書番号XXXX_お客様名
請求書_XXXX_お客様名
請求書XXXX
請求書番号は基本的に重複することのないユニークな番号です。
今回のように請求書や見積書などをPDF化する場合、書類の番号を含めることをおすすめします。
もしT6
セルに請求書番号123
が入力されている場合、以下にように記述します。
//T6セルの請求書番号を取得する let fileNum = ss.getActiveSheet().getRange("T6").getValue(); //★★★PDFのファイル名を入力してください★★★ //※ポイント: ファイル名が重複しないようにしましょう let fileName = "請求書" + fileNum;
T6
セルに入力されている請求書番号は123でしたので、「請求書123」というファイル名のPDFを保存できました。
YYMMDD
などの年月日をファイル名に含める場合、Moment.jsライブラリを使用するとシンプルに記述できて便利です。
Moment.jsライブラリの使い方は以下ふたつの記事をご覧ください。
誤クリックを防ぎたい場合
GASの実行ボタンをクリックすると「本当にPDFを作成しますか?」というメッセージボックスを表示させ、保存するかキャンセルするか選択させることもできます。
ひとつ操作が増えますが、誤クリックを防ぎたい場合におすすめです。
関数savePdf
の最初の部分に以下スクリプトを挿入してください。
//確認メッセージボックスを表示する //「キャンセル」をクリックすると保存せずにGASを終了する let confirmation = Browser.msgBox("本当にPDFを作成しますか?", Browser.Buttons.OK_CANCEL); if(confirmation == "cancel") { Browser.msgBox("操作をキャンセルしました"); return; }
挿入するとこのようになります。
GASの実行ボタンをクリックすると「本当にPDFを作成しますか?」と表示されます。
[OK]をクリックするとPDF化&保存されます。
[キャンセル]をクリックするとPDF化せずその時点でGASが終了します。
PDFのオプションを指定しよう
//★★★自由にカスタマイズしてください★★★ //PDFのオプションを指定 let pdfOptions = "&exportFormat=pdf&format=pdf" + "&size=A4" //用紙サイズ (A4) + "&portrait=true" //用紙の向き true: 縦向き / false: 横向き + "&fitw=true" //ページ幅を用紙にフィットさせるか true: フィットさせる / false: 原寸大 + "&top_margin=0.50" //上の余白 + "&right_margin=0.50" //右の余白 + "&bottom_margin=0.50" //下の余白 + "&left_margin=0.50" //左の余白 + "&horizontal_alignment=CENTER" //水平方向の位置 + "&vertical_alignment=TOP" //垂直方向の位置 + "&printtitle=false" //スプレッドシート名の表示有無 + "&sheetnames=false" //シート名の表示有無 + "&gridlines=false" //グリッドラインの表示有無 + "&fzr=false" //固定行の表示有無 + "&fzc=false" //固定列の表示有無;
変数pdfOptions
ではPDF化する際のさまざまなオプションを指定できます。
スクリプト内にコメントを付与していますが、主なものを詳しく紹介します。
portrait: 用紙の向き
portrait
で用紙の向きを指定します。
true
で縦向き、false
で横向きにPDF化できます。
"&portrait=true"
、"&portrait=false"
というように記述します。
4種類のmargin: 余白
+ "&top_margin=0.50" //上の余白 + "&right_margin=0.50" //右の余白 + "&bottom_margin=0.50" //下の余白 + "&left_margin=0.50" //左の余白
4種類のmarginに対して数値を指定することで、上下左右の余白を指定できます。
上記例では4種類すべて0.50
を指定していますが、それぞれ別々の数値を指定できます。
大きい数値を指定するほど余白が大きくなります。
horizontal_alignment: 水平方向の位置
horizontal_alignment
で水平方向の位置を指定します。
LEFT
で左揃え、CENTER
で中央揃え、RIGHT
で右揃えです。
"&horizontal_alignment=LEFT"
というように記述します。
vertical_alignment: 垂直方向の位置
vertical_alignment
で垂直方向の位置を指定します。
TOP
で上揃え、MIDDLE
で中央揃え、BOTTOM
で下揃えです。
"&vertical_alignment=TOP"
というように記述します。
printtitle: スプレッドシート名の表示有無
printtitle
でスプレッドシート名をPDFに表示させるか指定します。
true
で表示あり、false
で表示なしです。
"&printtitle=true"
というように記述します。
なお表示箇所はPDFの左上です。
sheetnames: シート名の表示有無
sheetnames
でシート名をPDFに表示させるか指定します。
true
で表示あり、false
で表示なしです。
"&sheetnames==true"
というように記述します。
表示箇所はPDFの右上です。
printtitle
とsheetnames
を両方true
にすることもできます。
gridlines: グリッドラインの表示有無
gridlines
でグリッドラインをPDFに表示させるか指定します。
true
で表示あり、false
で表示なしです。
"&gridlines=true"
というように記述します。
まとめ
今回はGoogle Apps Script (GAS) を使ってスプレッドシートの現在のシートをPDF化してGoogle Driveの指定フォルダーに保存する方法を紹介しました。
コピペでそのまま使ったり、カスタマイズして使ったり、さまざまな場面で活用頂けるとうれしいです。
次回記事もご期待ください!