こんにちは。たろ(@tarohibi)です。
今日は、「GASでGmailの特定メールをPDF化し、Google Driveに自動保存する方法」をご紹介します。
やりたいこと
例えば、特定のメール(今回は、Stores.jpからの購入確認メール)を自動でPDF化し、Google Driveに定期的に保存したいというニーズがあるとします。
GASを使えば、これを一気に実現できます。
具体的には、以下の手順を踏むことで、メールをPDFに変換してGoogle Driveに保存します。
- Gmailから特定のメールを検索・取得
- メールの内容をPDFに変換
- Google Driveの特定のフォルダにPDFを保存
それでは、詳細なコードを見ていきましょう。
完成形
以下が完成形のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
function saveEmailsToDriveOptimized() { // Gmailからメールを検索するためのクエリを設定 const searchQuery = 'from:hello@stores.jp subject:\'ご購入ありがとうございました。\''; // 検索条件に一致するメールを取得 const threads = GmailApp.search(searchQuery); // Google Driveの特定のフォルダを指定 const targetFolderId = 'あなたのフォルダID'; const targetFolder = DriveApp.getFolderById(targetFolderId); // 各メールスレッドに対して処理を行う const blobArray = []; for (let i = 0; i < threads.length; i++) { // メールスレッドから最新のメッセージを取得 const message = threads[i].getMessages()[0]; const subject = message.getSubject(); const messageId = message.getId(); // メッセージの日付を取得し、ファイル名に追加 const date = message.getDate(); const formattedDate = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyyMMdd'); const fileName = formattedDate + '_' + subject + '.pdf'; // 同名のファイルが存在するか確認 const existingFiles = targetFolder.getFilesByName(fileName); if (existingFiles.hasNext()) { // 同名のファイルが存在する場合、処理をスキップ continue; } // メッセージの内容を取得し、HTMLに変換 const content = message.getBody(); const htmlContent = '' + content + ''; // Blobを作成し、PDFに変換 const blob = Utilities.newBlob(htmlContent, 'text/html', fileName).getAs('application/pdf'); // Blobを一時的に配列に格納 blobArray.push(blob); } // PDFをGoogle Driveの特定フォルダに一括保存 for (let i = 0; i < blobArray.length; i++) { targetFolder.createFile(blobArray[i]); } sendMail(); } |
これが全体のコードとなります。最後の部分では、作成したPDFをGoogle Driveに一括保存し、その後メールを送信しています。
sendMail()の詳細な内容〈特定のアドレスにメールを送る処理〉はここでは省略していますが、適宜自身の状況に合わせてカスタマイズしてください。
左端の歯車を押して、プロジェクトの設定を出します。
赤文字部分の「appsscript.json」マニフェスト ファイルをエディタで表示するをチェック。
その後エディタに戻ると、「appsscript.json」ファイルが出てきますので、その中に以下コードを書きます。
1 2 3 4 5 6 7 8 9 10 11 |
{ "timeZone": "Asia/Tokyo", "dependencies": {}, "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8", "oauthScopes": [ "https://www.googleapis.com/auth/gmail.readonly", "https://www.googleapis.com/auth/gmail.send", "https://www.googleapis.com/auth/drive" ] } |
これで準備完了です。
saveEmailsToDriveOptimized関数をトリガー実行すると、任意のメールが所定フォルダの中にPDFにトリガー保存されます。
ポイント解説
それでは、いくつかのポイントをピックアップして解説します。
メールの検索・取得
Gmailからメールを検索するためのクエリは、from:hello@stores.jp subject:'ご購入ありがとうございました。'という形で設定します。これにより、Stores.jpからの「ご購入ありがとうございました。」という件名のメールを検索します。
1 2 |
const searchQuery = 'from:hello@stores.jp subject:\'ご購入ありがとうございました。\''; const threads = GmailApp.search(searchQuery); |
Google Driveの特定のフォルダを指定
ここで'あなたのフォルダID'は、対象のGoogle DriveフォルダのIDに置き換えてください。フォルダIDはGoogle DriveのURLの一部として表示されます。
例えば、フォルダのURLがhttps://drive.google.com/drive/folders/1A2B3C4D5E6F7G8H9I0Jの場合、フォルダIDは1A2B3C4D5E6F7G8H9I0Jです。
1 2 3 |
// Google Driveの特定のフォルダを指定 const targetFolderId = 'あなたのフォルダID'; const targetFolder = DriveApp.getFolderById(targetFolderId); |
メールのPDF変換
メールの本文を取得し、それをHTMLに変換します。HTMLに変換することで、後続のPDF変換処理が可能となります。
1 2 3 |
const content = message.getBody(); const htmlContent = '' + content + ''; const blob = Utilities.newBlob(htmlContent, 'text/html', fileName).getAs('application/pdf'); |
既存のファイルの確認
処理の途中で、Google Driveの特定のフォルダに同名のファイルが存在するかどうかを確認します。同名のファイルが存在する場合、そのメールの処理をスキップします。これにより、既に保存されているメールを再度保存することを防ぐことができます。
1 2 3 4 |
const existingFiles = targetFolder.getFilesByName(fileName); if (existingFiles.hasNext()) { continue; } |
Google Driveへの保存
最後に、作成したPDFをGoogle Driveの特定のフォルダに保存します。
1 2 3 |
for (let i = 0; i < blobArray.length; i++) { targetFolder.createFile(blobArray[i]); } |
まとめ
以上が、このスクリプトの全体的な説明となります。
Gmailから特定のメールを検索し、その内容をPDF化してGoogle Driveに保存するという一連の処理を自動化するためのスクリプトです。Google Apps Scriptの強力な機能を使うことで、面倒な作業を自動化し、効率的に作業を進めることが可能です。
最後に、Google Apps ScriptのコードはGoogleの提供するサービス上で実行されるため、セキュリティ面でも安心です。ただし、Googleのサービスに対するアクセス権限やGoogle Apps Scriptの利用制限などに注意しながら利用することが必要です。
以上、GmailのメールをGoogle DriveにPDFとして自動保存するスクリプトの解説でした。皆様の業務効率化に少しでもお役に立てれば幸いです。次回のブログ記事でも、便利なスクリプトやツールの紹介を行いますので、お楽しみに!
コメント