GASのプログラミングをスプレッドシートでノーコード化 #7
GoogleAppsScript(GAS)とスプレッドシートを使って、ノーコードでGoogleドライブのフォルダにあるファイルを一括でPDFファイルとして自動生成する方法を解説したいと思います。
また今回具体的なコーディングについては、すでにPDFファイルを自動出力 #6 で解説していますので、まだ見ていない方は事前にそちらを確認頂いていた方が、理解がしやすいと思います。
またこれまでの内容については「GoogleAppScriptでPDFファイルの自動書き出し」にマガジンとしてまとめていますので、よければフォローをお願いします。
PDFファイルの自動生成ツールをスプレッドシートでノーコード化
今回は「①スプレッドシートにフォルダID記載」を行い「②スプレッドシートからデータ取得」して「③メニューにPDFボタン追加」という内容について解説してきたいと思います。
1.新しいスプレッドシートを作成
GoogleスプレッドシートからGASを作成しますので、Googleスプレッドシートにアクセスします。
GoogleスプレッドシートのURL ←クリック
スプレッドシートを作成できました。
2.スプレッドシート名を変更
スプレッドシートが作成できたら、デフォルトでは「無題のスプレッドシート」になっているので、 こちらをクリックして適当な名前に変更し、[OK]ボタンをクリックしてください。
3.コードを入力する
これから詳細については説明しますので、まずスプレッドシートのメニューから「拡張機能」→「Apps Script」と進みGoogleAppsScriptを開いてください。
AppsScriptを開く。
GASプロジェクトが作成できたら、デフォルトでは「無題のプロジェクト」になっているので、 こちらをクリックして適当な名前に変更し、[OK]ボタンをクリックしてください。
そして下記コードを「コード.gs」のところにコピー&ペーストしてください。
function myFunction() {
/*0 スプレッドシートから情報取得*/
const ss = SpreadsheetApp.getActiveSheet();
const inId = ss.getRange(2, 1).getValue();
const exId = ss.getRange(2, 2).getValue();
/*①フォルダIDとファイルを取得*/
const documentFolder = DriveApp.getFolderById(inId);
const files = documentFolder.getFiles();
const exportFolder = DriveApp.getFolderById(exId);
const oldFolder = exportFolder.getFolders();
/*③古いファイルをoldフォルダに移動*/
const exportFolderId = exportFolder.getId();
const oldFileId = oldFolder.next().getId();
moveToFiles(exportFolderId, oldFileId);
/*②スプレッドシートとドキュメントのファイルを判別してPDF化*/
while(files.hasNext()){
var file = files.next();
var fileid = file.getId();
var mimeType = file.getMimeType();
if(mimeType === "application/vnd.google-apps.document"){
var blob = DocumentApp.openById(fileid).getBlob();
}else if(mimeType === "application/vnd.google-apps.spreadsheet"){
var blob = SpreadsheetApp.openById(fileid);
}
var pdffile = blob.getAs("application/pdf");
exportFolder.createFile(pdffile);
}
}
/*③古いファイルをoldフォルダに移動*/
function moveToFiles(fromFolderId , toFolderId){
var fromFolder = DriveApp.getFolderById(fromFolderId);
var toFolder = DriveApp.getFolderById(toFolderId);
var movefiles = fromFolder.getFiles();
while (movefiles.hasNext()) {
var file = movefiles.next();
file.moveTo(toFolder);
}
}
/* メニューにボタン追加*/
function onOpen() {
let ui = SpreadsheetApp.getUi()
let menu = ui.createMenu("PDF");
menu.addItem("PDF作成" , "myFunction");
menu.addToUi();
}
こちらのコードを貼り付けたら、下記のような画面になると思います。
ここから難しく感じる方もいるかもしれませんが、肩の力を抜いて気楽に読んでください。
4.コードで何しているか理解する
コードで何をしているか、 少しづつ内容を分解して考えると理解しやすくなります。
①スプレッドシートにフォルダID記載
まずはじめに、スプレッドシートの2行目の1列目及び2列目に、書込用フォルダのIDと読込用フォルダのIDを入れましょう。
任意のフォルダIDをにいれるようにしてください。上記スプレッドシートにあるIDは、私が作成したフォルダIDが入っていますので、ご自分が作成したフォルダIDに変更してください。
②スプレッドシートからデータ取得
次にスプレッドシートから①で入力したフォルダIDを取得します。
const ss = SpreadsheetApp.getActiveSheet();
const inId = ss.getRange(2, 1).getValue();
const exId = ss.getRange(2, 2).getValue();
この辺りは、すでに学習した内容なので今回は省力しますが詳しく知りたい人はスプレッドシートからデータ取得を見て頂ければ幸いです。
③メニューにPDFボタン追加
そしてノーコード化する際に、重要なのがプログラミングを知らない人でも操作できるようにすることです。
今回は、メニューにPDFボタンを表示させるようにしましょう。
/* メニューにボタン追加*/
function onOpen() {
let ui = SpreadsheetApp.getUi()
let menu = ui.createMenu("PDF");
menu.addItem("PDF作成" , "myFunction");
menu.addToUi();
}
先にコードを書いていますが、こちらの部分です。
GoogleAppsScript(GAS)では、Class Menuというものがあり、そこにあるメソッドを使うと簡単にメニューを変更することができます。気になる方は、Googleリファレンスを確認してみてください。
5.プロジェクトを保存
情報を入力したら、「プロジェクトを保存」をクリックしましょう。今回は、こちらでコーディングに関する内容は以上です。
あとは全てスプレッドシートで操作していくことになります。まずブラウザを更新して、スプレッドシートを最新状態にしてください。
そしてメニューにPDFボタンが出現しているのが確認できますので「PDF」→「PDF作成」とクリックして、実行してみましょう。
6.権限を確認→許可
毎度のことですが、初めてプログラミングを実行する場合、権限の承認が求められます。
「このプロジェクトがあなたのデータへのアクセス権限を必要としています。」と言うポップアップが出ますので、「権限を確認」をクリックしてください。
次の画面で「このアプリはGoogleで確認されていません」と出るので「詳細」から「PDFツール(安全ではないページ)に移動」をクリックしてください。
次の画面で「許可」を求められますので、ご自身のアカウントであることを確認し「許可」をクリックしてください。
7.「実行完了」を確認
「許可」の確認が終わりましたらスクリプトが実行されます。プログラミングが実行されているかフォルダを確認してみましょう。
プログラミングに問題がなければ、 書き出しフォルダにPDFが生成されています。私の場合は、テスト.pdfが、サンプルフォルダに作成されていることが確認できます。
8.PDFファイルの自動生成ツールをスプレッドシートでノーコードについておさらい
これまで学んだことをスプレッドシートを使ってノーコードにすることができました。
今回は、ぜひClass Menuを覚えておいてください。今後もツール化する際には、非常に役立つメソッドです。
9.まとめ
いかがでしょうか? GASを学ぶ有用性がどんどんわかってきましたね。
ノーコード化することで、GASを全く知らない人にもツールを展開することができます。このような方法を学べば、自分以外の人にも便利ツールを共有することができるので、個人単位ではなく チーム単位での業務効率アップを実現することができます。
また徐々に業務で使えそうなスキルがついてきたのではないでしょうか。今後も投稿していきますので、フォローやいいねを頂けると嬉しく思います。引き続きよろしくお願いします。