Yuki's bnb blog

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

【コピペでOK!】GASでGoogle DocsをPDF化する方法

Google Apps Script pdf docs

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

今回はGoogle Apps Script (GAS) を使ってGoogle Docs (Googleドキュメント) をPDF化してGoogle Driveに保存する方法を紹介します。

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

では見ていきましょう!

memo

スプレッドシートをPDF化してGoogle Driveに保存したい方は以下解説記事をご覧ください。
【コピペでOK!】GASで現在のシートをPDF化する方法

 

はじめに

今回実現したいこと

Google Apps Script pdf docs

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

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

 

今回使用するサンプルGoogle Docs

Google Docs

今回はこちらの架空の会社のニュースレターを使用して解説します。

もちろんみなさん自身のどんなドキュメントでも使用できます。

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

 

コピペでOK!GASでGoogle DocsをPDF化&保存する方法

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

Google Apps Script editor

PDF化したいGoogle Docsを開き、次の手順で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 doc = DocumentApp.getActiveDocument();

  //ドキュメントIDを取得する
  let docId = doc.getId();

  //★★★PDFのファイル名を入力してください★★★
  //※ポイント: ファイル名が重複しないようにしましょう
  let fileName = "テストドキュメント"; 
  
  //関数createPdfを実行し、PDFを作成して保存する
  createPdf(folderId, docId, fileName);
}

//PDFを作成し指定したフォルダーに保存する関数
//以下3つの引数を指定する必要がある
//1: フォルダーID (folderId)
//2: ドキュメントID (docId)
//3: ファイル名 (fileName)
function createPdf(folderId, docId, fileName){
  //PDFを作成するためのベースとなるURL
  let url = "https://docs.google.com/document/d/"
          +  docId
          + "/export?&exportFormat=pdf&format=pdf";

  //アクセストークンを取得する
  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

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

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

これでGoogle DocsをPDF化してGoogle Driveの指定フォルダーに保存するGASの完成です!

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

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

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

 

独自メニューを作成する

Google Apps Script menu

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

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

 
Google Apps Script menu

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

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

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

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

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

 
Google Apps Script menu

これでGoogle Docsに独自メニューを表示するGASの完成です!

memo

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

※スプレッドシートに独自メニューを追加する方法とGoogle Docsに独自メニューを追加するGASは若干異なりますが大半が同じです。

 

Google Docsを更新する

Google Docs

Google Docsに戻り[更新]ボタンをクリックしてGoogle Docsを更新してください。

 
gas menu

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

 

GASを実行してみよう!

Google Apps Script menu

ではいよいよGASを実行し、今開いているGoogle Docsを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

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

請求書や見積書などを書類番号があるGoogle DocsをPDF化する場合、書類番号を含めることをおすすめします。

もし単純にGoogle Docsのファイル名をそのままPDFのファイル名にしたい場合、変数fileNameを以下のように記述します。

  let fileName = doc.getName(); 

Google Drive

今回使用したサンプルGoogle Docsのファイル名「ニュースレター」と同じファイル名のPDFを保存することができました。

 

memo

getNameメソッドを使用すると対象のGoogle Docsのファイル名を取得できます。

 

誤クリックを防ぎたい場合

GASの実行ボタンをクリックすると「本当にPDFを作成しますか?」というメッセージボックスを表示させ、保存するかキャンセルするか選択させることもできます。

ひとつ操作が増えますが、誤クリックを防ぎたい場合におすすめです。

関数savePdfの最初の部分に以下スクリプトを挿入してください。

  let ui = DocumentApp.getUi();

  //確認メッセージボックスを表示する
  let confirmation  = ui.alert("本当にPDFを作成しますか?", ui.ButtonSet.OK_CANCEL);

  //「キャンセル」または「X印」をクリックすると保存せずにGASを終了する
  if(confirmation == ui.Button.CANCEL || confirmation == ui.Button.CLOSE) {
    ui.alert("操作をキャンセルしました");
    return;
  }


Google Apps Script alert

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

 
Google Apps Script alert

GASの実行ボタンをクリックすると「本当にPDFを作成しますか?」と表示されます。

[OK]をクリックするとPDF化&保存されます。

[キャンセル]もしくは右上の[X]印をクリックするとPDF化せずその時点でGASが終了します。

 

まとめ

今回はGoogle Apps Script (GAS) を使ってGoogle DocsをPDF化してGoogle Driveの指定フォルダーに保存する方法を紹介しました。

コピペでそのまま使用できるので、さまざまな場面で活用頂けるとうれしいです。

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