見出し画像

【GAS】Google Apps Script 活用事例 Google Documentを任意のGoogle DriveのフォルダにPDF変換してアップロードするスクリプト

GASを本格的に学び始めて、半年が経過しました。今やSpreadsheetの自動計算だけではなく、Slideの自動翻訳Documentの差し込みファイルの作成、SNSだと、SLack Botの作成LINE Botの作成。色々な事をこの半年だけで実現してきました。

今回は、GASを組もうと思えば、出来るんだろうけど、Spreadsheetに比べたら利用頻度が、そこまで高くないという事で、見送っていたDocumentのPDF化に取り組みました。

スクリーンショット 2020-03-07 4.26.17

完成系のコード

function onOpen() {
 DocumentApp.getUi()
 .createMenu('PDF変換') // メニューの追加
 .addItem('PDF変換', 'exportAsPDF')
 .addToUi();
 }


function promptDialog() {
  /*UIでシート名を入力させる*/
const ui = DocumentApp.getUi();
const response = ui.prompt(
  'PDFに変換',
  'PDFを格納したいGoogle DriveのフォルダのURLを入力してください。',
  ui.ButtonSet.OK
);

const inputName = response.getResponseText().replace('https://drive.google.com/drive/folders/','');
console.log(inputName);

switch (response.getSelectedButton()) {
  case ui.Button.OK:
    console.log('%s と入力され、OKが押されました。',inputName);
    
    break;
    
  case ui.Button.CLOSE:
    console.log('閉じるボタンが押されました。');
    
}//switch

return inputName;
}


function exportAsPDF() {
 
 const folderId     = promptDialog();//promptDialogでフォルダIDを入力させる。
 const document     = DocumentApp.getActiveDocument();
 const documentId   = document.getId();
 const fileName     = document.getName();
 const folder       = DriveApp.getFolderById(folderId);
 const url          = 'https://docs.google.com/document/d/'+ documentId +'/export?';
 const opts         = {
   exportFormat: 'pdf',      // ファイル形式の指定 pdf / csv / xls / xlsx
   format:       'pdf',      // ファイル形式の指定 pdf / csv / xls / xlsx
   size:         'A4',       // 用紙サイズの指定 legal / letter / A4
   portrait:     'true',     // true → 縦向き、false → 横向き
   fitw:         'true',     // 幅を用紙に合わせるか
   docNames:     'false',    // シート名を PDF 上部に表示するか
   printtitle:   'false',    // スプレッドシート名を PDF 上部に表示するか
   pagenumbers:  'false',    // ページ番号の有無
   gridlines:    'false',    // グリッドラインの表示有無
   fzr:          'false',    // 固定行の表示有無
   range :       'A1%3AA1',  // 対象範囲「%3A」 = : (コロン)  

 };
 
 const urlExt = [];
 for(optName in opts){
   urlExt.push(optName + '=' + opts[optName]);
 }

 const options  = urlExt.join('&');
 const token    = ScriptApp.getOAuthToken();
 const response = UrlFetchApp.fetch(url + options, {
     headers: {
       'Authorization': 'Bearer ' +  token
     }
   });
 
 const blob = response.getBlob().setName(fileName + '.pdf');
 folder.createFile(blob);  // PDFを指定したフォルダに保存
 
}

ノンプロ研スニペットに、SpreadsheetのPDFを自動化するスクリプトがあったため、その先人の知恵をベースに今回の自動化が成功しました。

自分のオリジナリティは、フォルダーのURLを入力させるようにした事です。バックオフィス系なので、2020_01 とか 2020_02 とか月ごとに保存先のフォルダーを変えたいというニーズがあり、書き加えました。

スクリプト中に、folderIdを決め打ちで書いてしまうと、保存場所から手動で移動させる手間が発生していたので、書き加えた事により、汎用性が高まったかなと思います。

G Suiteではない方は、少し書き換えが必要です。

const inputName = response.getResponseText().replace('https://drive.google.com/drive/u/0/folders/','');

https://drive.google.com/drive/u/0/folders/
これが個人アカウントでのGoogle Driveのリンクの一部。

https://drive.google.com/drive/folders/
これがGsuite利用時のリンクの一部。

ユーザーが入力してくれたURLの部分からfolderId以外を削除して、別関数に値を渡しています。

Spreadsheetにも応用できますが、注意が必要

range :       'A1%3AA1',  // 対象範囲「%3A」 = : (コロン)  

この部分がSpreadsheetをPDF化する時の範囲なので、ここを直す必要があります。例えば、G180だったら、A1%3AG180みたいな具合に修正する必要があります。ここを修正しないと、エラーが出ないのに、白紙でPDFが保存されるハメになります。

function lastCell() {
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheet       = spreadsheet.getSheetByName('シート名');
 const lastRow     = sheet.getLastRow();
 const lastColumn  = sheet.getLastColumn();

 console.log(sheet.getRange(lastRow, lastColumn).getA1Notation());
 const lastCell    = sheet.getRange(lastRow, lastColumn).getA1Notation()
 return lastCell;
}

range : 'A1%3' + lastCell, // 対象範囲「%3A」 = : (コロン)
みたいにすれば、スクリプトをその都度編集しなくていいので、楽になりそう。ただし、ARRAYFORMULA関数を使用している場合は、最終行が上手く取得出来ないので、使わないようにするか、スクリプト側で、何かしらの設定が入ります。

ちなみに、ドキュメントでは、この範囲は関係ないみたいです。

2021.03.20 追記 特定のフォルダの全てのドキュメントを一括でPDFに変換する方法

function getDriveFiles(){
 const folder = DriveApp.getFolderById('**************');
 const files  = folder.getFiles();

 console.log(folder.getName());
 console.log(files);

 while (files.hasNext()) {
   const file = files.next();

   console.log('ファイル名の確認 ',file.getName());
   exportAsPDF(file.getId());
 }
}

function exportAsPDF(documentId) {
 const document = DocumentApp.openById(documentId);
 const url      = 'https://docs.google.com/document/d/'+ documentId +'/export?';
 const opts     = {
   exportFormat: 'pdf',      // ファイル形式の指定 pdf / csv / xls / xlsx
   format:       'pdf',      // ファイル形式の指定 pdf / csv / xls / xlsx
   size:         'A4',       // 用紙サイズの指定 legal / letter / A4
   portrait:     'true',     // true → 縦向き、false → 横向き
   fitw:         'true',     // 幅を用紙に合わせるか
   docNames:     'false',    // シート名を PDF 上部に表示するか
   printtitle:   'false',    // スプレッドシート名を PDF 上部に表示するか
   pagenumbers:  'false',    // ページ番号の有無
   gridlines:    'false',    // グリッドラインの表示有無
   fzr:          'false',    // 固定行の表示有無
 };

const urlExt = [];
for(optName in opts){
  urlExt.push(optName + '=' + opts[optName]);
}

 const options  = urlExt.join('&');
 const token    = ScriptApp.getOAuthToken();
 const response = UrlFetchApp.fetch(url + options, {
   headers: {
     'Authorization': 'Bearer ' +  token
   }
 });
 const fileName = document.getName();
 const blob     = response.getBlob().setName(fileName + '.pdf');
 const folder   = DriveApp.getFolderById('***************'); 
 folder.createFile(blob);  // PDFを指定したフォルダに保存

}

こんな記事も書いています。


この記事が気に入ったらサポートをしてみませんか?