【GAS】Google Apps Script 活用事例 Google Documentを任意のGoogle DriveのフォルダにPDF変換してアップロードするスクリプト
GASを本格的に学び始めて、半年が経過しました。今やSpreadsheetの自動計算だけではなく、Slideの自動翻訳、Documentの差し込みファイルの作成、SNSだと、SLack Botの作成、LINE Botの作成。色々な事をこの半年だけで実現してきました。
今回は、GASを組もうと思えば、出来るんだろうけど、Spreadsheetに比べたら利用頻度が、そこまで高くないという事で、見送っていたDocumentのPDF化に取り組みました。
完成系のコード
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を指定したフォルダに保存
}
こんな記事も書いています。
この記事が気に入ったらサポートをしてみませんか?