みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptで特定のメールの添付ファイルをGoogleドライブに保存するツールを作っています。
前回はこちらの記事でした。
Googleドライブのフォルダ内にファイルを作成する方法をお伝えしました。
本ツールの作成を進めていく上で、データを交換するためのBlobオブジェクトは重要なオブジェクトですので、イマイチな方は再度見直しをして頂ければと思います。
さて、今回ですがいよいよGoogle Apps ScriptでGmailのメールから添付ファイルを取得していきたいと思います。
では、行ってみましょう!
対象となるメールの条件と検索クエリ
まず、対象となるメールの条件を確認する必要があります。
一般的には
- 送信元アドレス(from:)
- 件名(subject:)
などを条件とする場合は多いのですが、今回は以下のようにします。
その場合、例えばGmailではこの条件のメールをどのように検索しますか?
まず、Gmailの検索窓の右端になる▽マークから「検索オプション」ウィンドウを開きます。
そして、その「件名」に「添付ファイルテスト」と入力し、検索マークをクリックすれば検索できます。
すると、検索結果が出まして、対象となるメールが二件ありました。
そこで、もう一点注目して欲しいのですが、検索窓に以下のような表示がされていますね。
これが”件名に「添付ファイルテスト」を含む”ことを表すGmailの検索クエリです。
この検索クエリは後で使うのでメモしておいてくださいね。
件名を条件にメールを抽出するスクリプト
では、まず手始めに「添付ファイルテスト」を件名に含むメールを抽出するスクリプトを作成してみましょう。
こちらです。
const SEARCH_TERM = 'subject:(添付ファイルテスト) '; function fetchFile(){ const threads = GmailApp.search(SEARCH_TERM, 0, 10); const messages = GmailApp.getMessagesForThreads(threads); for(const thread of messages){ for(const message of thread){ console.log(message.getSubject()); } } }
まず1行目ですが、Gmailの検索クエリを文字列でSEARCH_TERMに代入し、そのコマンドでGmailを検索しているのが5行目です。
検索結果はスレッドの集まりとしthreadsに格納され、さらにそこからメッセージの集まりを二次元配列messagesとして取得しているのが6行目となります。
あとはその二次元配列に対して、for…of文で件名を出力するというものです。
この実行結果はこちらです。
条件にマッチしたメールの件名がログ出力されていますね。
Gmailでのメール検索については以下の記事にも詳しく紹介していますので、よろしければご覧くださいね。
getAttachmentsメソッドで添付ファイルを取得する
次に、それらのメールに添付されているファイルを取得してみましょう。
メールの添付ファイルを取得する場合には、Messageオブジェクトに対してgetAttachmentsメソッドを使います。
書き方はこちらです。
返り値として、添付ファイルがGmailAttachmentオブジェクトの集まりとして配列で与えられます。
例えば、先ほどのスクリプトを以下のように書き換えると、対象のメールの添付ファイルのファイル名をログ出力するようになります。
const SEARCH_TERM = 'subject:(添付ファイルテスト) '; function fetchFile(){ const threads = GmailApp.search(SEARCH_TERM, 0, 10); const messages = GmailApp.getMessagesForThreads(threads); for(const thread of messages){ for(const message of thread){ const attachments = message.getAttachments(); for(const attachment of attachments){ console.log(attachment.getName()); } } } }
10行目のgetAttachmentsメソッドで各メッセージの添付ファイルをattachmentsという配列に格納しています。
そして、11行目からのfor…of文でそのattachmentsの要素であるGmailAttachmentオブジェクト全てに対して、getNameつまり添付ファイル名を取得しているということですね。
抽出したメールの添付ファイルをGoogleドライブに保存する
さて、前回の記事でお伝えした
- GmailAttachmentオブジェクトはBlobSourceとして使用できる
- FolderオブジェクトのcreateFileメソッドでファイルを作成できる
を応用すれば、これらの添付ファイルを指定のGoogleドライブフォルダに保存をすることができるようになります。
const FOLDER_ID = 'XXXXXXXXXXXXXXXXX'; //フォルダID const SEARCH_TERM = 'subject:(添付ファイルテスト) '; function fetchFile(){ const folder = DriveApp.getFolderById(FOLDER_ID); const threads = GmailApp.search(SEARCH_TERM, 0, 10); const messages = GmailApp.getMessagesForThreads(threads); for(const thread of messages){ for(const message of thread){ const attachments = message.getAttachments(); for(const attachment of attachments){ folder.createFile(attachment); } } } }
まず1行目に添付ファイルを格納するフォルダのIDを指定し、6行目でそのIDにより、Folderオブジェクトを取得しています。
15行目で抽出したメールの添付ファイルをBlobSourceとしてcreateFileしているということになります。
上記スクリプトを実行すると、以下のように二つの添付ファイルが指定のフォルダに保存されました。
まとめ
以上、Google Apps ScriptでGmailで抽出したメールの添付ファイルをGoogleドライブに保存する方法についてお伝えしました。
- getAttachmentsメソッドでMessageオブジェクトの添付ファイルを取得する
- createFileメソッドの引数にGmailAttachmentオブジェクトを指定する
この二点がポイントですね。
どうぞご活用くださいね~