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