Yuki's bnb blog

こんにちは!Yukiといいます。本業のかたわら大阪で2016年夏から民泊運営のお手伝いをしています。民泊業務に関する様々なことを自動化・効率化したいと思い日々活動しています。 お気軽にコメント・お問い合わせください :) TOEICスコア 985

【コピペでOK!】GASで現在のシートをPDF化する方法

Google Apps Script spreadsheet pdf

こんにちは!
Yuki (@yukibnb) です。

今回はGoogle Apps Script (GAS) を使ってスプレッドシートの現在のシートをPDF化してGoogle Driveに保存する方法を紹介します。

コピペでできるスクリプトに加え、カスタマイズのポイントも詳しく紹介します。

では見ていきましょう!

 

はじめに

今回実現したいこと

Google Apps Script spreadsheet pdf

ボタン一つで現在開いているスプレッドシートのシートをPDF化し、指定したGoogle Driveのフォルダーに保存します。

手作業よりも大幅に時間短縮することができ、業務効率化を実現できます。

 

今回使用するサンプルスプレッドシート

spreadsheet

今回はこちらの架空の請求書スプレッドシートを使用して解説します。

もちろん請求書、発注書、納品書、報告書、企画書など普段みなさんが使用しているさまざまな形式のスプレッドシートで活用できます。

では方法を見てみましょう!

 

コピペでOK!GASで現在のシートをPDF化&保存する方法

スクリプトエディタを開く

Google Apps Script editor

PDF化したいスプレッドシートを開き、次の手順でGoogle Apps Scriptのスクリプトエディタを開いてください。

  1. 画面上部の[ツール]をクリックする
  2. [スクリプトエディタ]をクリックする

 
Google Apps Script editor

するとスクリプトエディタが開きます。次の2点はお好きな名前に変更してください。

  • プロジェクト名 (「無題のプロジェクト」と書いている箇所)
  • スクリプト名 (「コード.gs」と書いている箇所)

 

スクリプトをコピペする

スクリプトエディタに以下のスクリプトをコピペしてください。

スクリプトエディタにもともと入力されていたfunction myFunction() { }は消してください。

memo

変数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);
}

 

スクリプトを保存する

Google Apps Script editor

スクリプトをコピペするとこのようになります。

画像内のアイコンをクリックし、コピペしたスクリプトを保存してください。

これで現在開いているスプレッドシートのシートをPDF化してGoogle Driveの指定フォルダーに保存するGASの完成です!

関数savePdfを実行するとPDF化&保存できます。

ただ毎回スクリプトエディタを開いて関数savePdfを実行するのは手間なので、スプレッドシート上に独自メニューを作成します。

独自メニューを使用することで、スクリプトエディタを開かなくてもGASを実行してPDF化&保存できるようになります。

 

独自メニューを作成する

Google Apps Script menu

今開いているスクリプトエディタ内で、以下の手順で新しいスクリプトを作成してください。

  1. [+]アイコンをクリックする
  2. [スクリプト]をクリックする

 
gas menu

するとこのように新しいスクリプトが表示されます。

スクリプト名はお好きなものに変更してください。上記画像では「メニュー.gs」としました。

「メニュー.gs」のスクリプトエディタに以下のスクリプトをコピペしてください。

もともと入力されていたfunction myFunction() { }は消してください。

function onOpen() {
  let ui = SpreadsheetApp.getUi()
  
  //メニュー名を決定
  //★★★メニュー名は好きなものに置き換えてください★★★
  let menu = ui.createMenu("GAS実行");
  
  //メニューに実行ボタン名と関数を割り当て
  //★★★実行ボタン名は好きなものに置き換えてください★★★
  menu.addItem("PDF作成","savePdf");
  
  //スプレッドシートに反映
  menu.addToUi();
}

 
Google Apps Script editor

画像内のアイコンをクリックし、コピペしたスクリプトを保存してください。

これでスプレッドシートに独自メニューを表示するGASの完成です!

memo

独自メニューのスクリプトについての詳しい解説は以下記事をご覧ください。
【コピペでOK!】スプレッドシートのメニューバーにGAS実行ボタンを追加する方法

 

スプレッドシートを更新する

Google Apps Script spreadsheet

スプレッドシートに戻り[更新]ボタンをクリックしてスプレッドシートを更新してください。

 
Google Apps Script menu

更新すると、[ヘルプ]の右側に独自メニュー[GAS実行]が表示されました。

 

GASを実行してみよう!

Google Apps Script menu

ではいよいよGASを実行し、今開いているスプレッドシートのシートをPDF化しGoogle Driveのフォルダーに保存してみましょう。

独自メニュー[GAS実行]をクリックし、そして実行ボタン[PDF作成]をクリックしてください。

[PDF作成]をクリックすると関数savePdfが実行されます。

memo

GASの初回実行時に承認を求めるポップアップが表示されます。以下記事の手順に従って初回承認を行ってください。画像やGIF動画付きで詳しく確認できます。
【もう迷わない!】GAS初回実行時の承認方法

 
Google Apps Script pdf

Google Apps Script pdf

指定したGoogle Driveのフォルダーに無事PDFが保存されました!

これでGASの作成は完了です!

次にみなさん自身でカスタマイズしたい場合のポイントをいくつかご紹介します。

 

カスタマイズのポイントを紹介

ファイル名は重複しないようにしよう

  //★★★PDFのファイル名を入力してください★★★
  //※ポイント: ファイル名が重複しないようにしましょう
  let fileName = "テストファイル"; 

変数fileNameがPDFのファイル名となります。

今回のテストスクリプトではわかりやすいように"テストファイル"という文字列にしましたが、みなさんが実際に使用する際はファイル名が重複しないように動的な情報を変数fileNameに含めることをおすすめします。

注意

ファイル名が重複すると、GASを実行するたびに同じファイル名のファイルが増えてしまいます。同じファイル名でも上書きされないため、以下画像のようにどれがどれだか判別できなくなります。
Google Drive

 
動的な情報を含むファイル名とは以下のようなものです。

  • YYMMDD_請求書番号XXXX_お客様名
  • 請求書_XXXX_お客様名
  • 請求書XXXX

請求書番号は基本的に重複することのないユニークな番号です。

今回のように請求書や見積書などをPDF化する場合、書類の番号を含めることをおすすめします。

もしT6セルに請求書番号123が入力されている場合、以下にように記述します。

  //T6セルの請求書番号を取得する
  let fileNum = ss.getActiveSheet().getRange("T6").getValue();

  //★★★PDFのファイル名を入力してください★★★
  //※ポイント: ファイル名が重複しないようにしましょう
  let fileName = "請求書" + fileNum;

Google Drive

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;
  }

 
Google Apps Script editor

挿入するとこのようになります。

 
Google Apps Script message box

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: 用紙の向き

Google Apps Script pdf

portraitで用紙の向きを指定します。

trueで縦向き、falseで横向きにPDF化できます。

"&portrait=true""&portrait=false"というように記述します。

 

4種類のmargin: 余白

Google Apps Script pdf

+ "&top_margin=0.50" //上の余白
+ "&right_margin=0.50" //右の余白
+ "&bottom_margin=0.50" //下の余白
+ "&left_margin=0.50" //左の余白

4種類のmarginに対して数値を指定することで、上下左右の余白を指定できます。

上記例では4種類すべて0.50を指定していますが、それぞれ別々の数値を指定できます。

大きい数値を指定するほど余白が大きくなります。

 

horizontal_alignment: 水平方向の位置

Google Apps Script pdf

horizontal_alignmentで水平方向の位置を指定します。

LEFTで左揃え、CENTERで中央揃え、RIGHTで右揃えです。

"&horizontal_alignment=LEFT"というように記述します。

 

vertical_alignment: 垂直方向の位置

Google Apps Script pdf

vertical_alignmentで垂直方向の位置を指定します。

TOPで上揃え、MIDDLEで中央揃え、BOTTOMで下揃えです。

"&vertical_alignment=TOP"というように記述します。

 

printtitle: スプレッドシート名の表示有無

Google Apps Script pdf

printtitleでスプレッドシート名をPDFに表示させるか指定します。

trueで表示あり、falseで表示なしです。

"&printtitle=true"というように記述します。

なお表示箇所はPDFの左上です。

 

sheetnames: シート名の表示有無

Google Apps Script pdf

sheetnamesでシート名をPDFに表示させるか指定します。

trueで表示あり、falseで表示なしです。

"&sheetnames==true"というように記述します。

表示箇所はPDFの右上です。

memo

printtitlesheetnamesを両方trueにすることもできます。

 

gridlines: グリッドラインの表示有無

Google Apps Script pdf

gridlinesでグリッドラインをPDFに表示させるか指定します。

trueで表示あり、falseで表示なしです。

"&gridlines=true"というように記述します。

 

まとめ

今回はGoogle Apps Script (GAS) を使ってスプレッドシートの現在のシートをPDF化してGoogle Driveの指定フォルダーに保存する方法を紹介しました。

コピペでそのまま使ったり、カスタマイズして使ったり、さまざまな場面で活用頂けるとうれしいです。

次回記事もご期待ください!