前回のブログではファイルをzip形式にしてメールを送る方法を紹介いたしました。
【コピペで使える】GASでファイルをzipにしてメール添付してみる
今回はその逆となる
メールに添付されてるzipファイルを展開しそのファイルをGoogleドライブに保存する
といった作業を自動で取得するスクリプトをご紹介します。
まずは特定のgmailを取得する方法からご説明します。
今回はgmailの件名からメール情報を取得する方法をご紹介します。
対象となるメールは以下の画像のメールを使用しました。
件名:zip付きメール
添付ファイル名:createZipFile(zipファイル)
検索対象からgmail検索し添付ファイルを取得
まずは対象となるメールを検索し、取得するためのメソッド
searchメソッド
getMessagesForThreadsメソッド
getAttachmentsメソッド
注意:初めてコードを実行する際にアクセス権限の許可を求められますが許可をしてください。アクセス権限についての詳細は以下の記事に詳しく載っています。
無料のGmailアカウントでGASに初回の実行許可を与える方法
クラス:GmailMessage
search(query,start,max):メールを検索
検索対象部分をからgmailを検索することが可能になります。
query:検索対象
start:スレッドがある場合、スレッド検索の開始数(基本は0)
max:スレッドの最大数(大きくしすぎるとエラーとなります。以下で説明します。)
Gmailの読み込み数について(最大数の設定時の注意)
スクリプトで検索などをする場合各機能で制限が設けられています。
制限の詳しい内容については別記事の『【日本語リファレンス】GASの日次割当と日次制限について』をご確認ください。
有料版と無料版でも違いがありますので今回は無料版を見てみると
Gmailの読み込み・書き込み 1日:20,000件まで
となっています。
ですので先ほどのmaxの部分を多く設定してしまい1日に何度もスクリプトを実行し、2万件を越えるとエラーが出てしまいますので注意してください。
getMessagesForThreads():スレッド情報を取得
特定のスレッドのメッセージを取得します。
searchメソッドで取得したメールはスレッドという1まとまりで取得されます。
スレッドが無ければ1つのスレッドとなります。
getAttachments():メールにある添付ファイルを取得
このメソッドでは取得したメールに添付されているファイル情報を取得します。
説明だけではわかりづらいですので、スクリプトを見ていきましょう。
前半部分解説までをまずはご紹介します。
一連のスクリプト
function searchZipMail(){ ////前半部分解説 var title = "zip付きメール" //件名設定 //searchメソッド 開始0番目、最大検索数10にしています var searchGmail = GmailApp.search(title, 0, 10); //getMessagesForThreadsメソッド(2次元配列が取得されます) var threadsGmail = GmailApp.getMessagesForThreads(searchGmail); var threadsNumA = threadsGmail.length; //2次元配列で取得されているのでループを2回行います for (var i = 0 ; i < threadsNumA; i++) { var threadsNumB = threadsGmail[i].length; //2次元配列2回目のループ for (var w = 0; w <threadsNumB; w++) { //メールの件名をログ出力します console.log(threadsGmail[w][i].getSubject()); //getAttachmentsメソッドで添付ファイルが取得されます var zipAttachments = threadsGmail[w][i].getAttachments(); } //2次元配列2回目のループ終了 } //2次元配列1回目のループ終了 ////前半部分終了 ////後半部分解説 //添付ファイル数分ループして取得をします(今回は1つの添付ファイルのみ) var attachmentsNum = zipAttachments.length; for (var k = 0 ; k < attachmentsNum; k++) { //参考のため添付ファイル名をログ取得します console.log(zipAttachments[k].getName()); //unzipメソッドでzipファイルを展開します var unzipFile = Utilities.unzip(zipAttachments[k]); //展開したファイル数を取得します var unzipFileNum = unzipFile.length; } //フォルダー場所を取得します(太字部分は各自フォルダIDを入れてください) var folder = DriveApp.getFolderById("1YTWmbQxCnnuLtgD8VhCTcV6xDAbsEPiT"); //展開するファイルが複数の場合があるためここでもループを行います for (var q = 0 ; q < unzipFileNum; q++) { //ファイルを指定したフォルダに保存します folder.createFile(unzipFile[q]); } }
簡単な流れを説明すると
searchメソッド(件名、開始数1番目、最大検索数10)でメール(スレッド)を取得
getMessagesForThreadsメソッドでメールのスレッド数を取得
この際2次元配列として返されることに注意が必要です。
例
同じ件名のGmailが3通
そのうち
1通目はスレッドが1つ
2通目はスレッドが2つ
3通名がスレッドが3つ
の場合は以下のような配列になります。
[[1], [1, 2], [1, 2, 3]]
今回は他に件名が無く、スレッドも1つのみという設定ですので
[[1]]
という配列になります。
ですので2次元配列ようのループが必要となります。(2重ループ)
そしてgetAttachmentsメソッドでは
メール情報を取得しそのメールの中の添付ファイル情報を取得しています。
今回は添付ファイルは1つですが複数の可能性もありますのでループで添付ファイル数分
情報を取得し、添付ファイル名を取得します。
このような流れとなっております。
メール情報や添付ファイル情報を取得することができました。
では次に後半部分の解説zipファイルを展開するメソッドをご紹介します。
unzip() :zipファイルを展開
クラス:Utilities
このメソッドを使うことによってzipファイルを展開する事ができます。
先ほどのスクリプト24行目の部分
var unzipFile = Utilities.unzip(zipAttachments[w]);
こちらが対象のスクリプトです。
unzip内に展開したいblobファイルを入れます。今回は添付ファイルをそのまま入れています。
そして最後に展開したファイルを1ファイルづつ指定したフォルダに保存をします。
以上が説明となります。では実際にスクリプトを実行してみましょう。
スクリプト実行結果
このスクリプトを実行すると以下のログが出力されます。
最初のサンプルメールと同じ件名、添付ファイル名が出力されていますね。
そして指定したフォルダには以下の画像のように展開されたファイルが入っています。
※注意点
今回ご紹介したunzipメソッドですがzipファイルがパスワードで鍵がかけられている場合、
開くことができませんのでご注意ください。
まとめ
今回はメールで受信したzipファイルを指定したフォルダに保存するという方法をご紹介しました。
この方法を使って例えば
件名:2020/12/01日報
添付:zipファイル
のように日付をつけることによって毎朝前日の添付ファイル付き日報メールを指定フォルダに展開することができます。
このように毎日メールをチェックして指定のフォルダに保存をするといった作業が減りますね。
ぜひこの方法を取得して作業効率にお役立てください。
ここまでご覧いただきありがとうございました。
コメント
コメント一覧 (2件)
このままだと使えないようです。
通りすがりさん
ご指摘ありがとうございました。
コードの29行目のループの変数が間違えておりました。
Utilities.unzip(zipAttachments[w]) → Utilities.unzip(zipAttachments[k])
記事内のコードも修正しましたので、うまく動作するかどうかご確認いただければと思います。
貴重なご意見ありがとうございます。