GASでメール添付のzipファイルを展開してドライブに保存する方法

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
Gmailアイコン

前回のブログではファイルをzip形式にしてメールを送る方法を紹介いたしました。

GASでファイルをzip形式にしてメール添付して送信する方法

今回はその逆となる

メールに添付されてるzipファイルを展開しそのファイルをGoogleドライブに保存する

といった作業を自動で取得するスクリプトをご紹介します。


まずは特定のgmailを取得する方法からご説明します。

今回はgmailの件名からメール情報を取得する方法をご紹介します。

対象となるメールは以下の画像のメールを使用しました。

件名:zip付きメール

添付ファイル名:createZipFile(zipファイル)

検索対象からgmail検索し添付ファイルを取得

まずは対象となるメールを検索し、取得するためのメソッド

searchメソッド

getMessagesForThreadsメソッド

getAttachmentsメソッド

注意:初めてコードを実行する際にアクセス権限の許可を求められますが許可をしてください。アクセス権限についての詳細は以下の記事に詳しく載っています。

無料アカウントでGoogleサービスへのスコープを設定する方法

クラス:GmailMessage

search(query,start,max):メールを検索

検索対象部分をからgmailを検索することが可能になります。

query:検索対象

start:スレッドがある場合、スレッド検索の開始数(基本は0)

max:スレッドの最大数(大きくしすぎるとエラーとなります。以下で説明します。)

Gmailの読み込み数について(最大数の設定時の注意)

スクリプトで検索などをする場合各機能で制限が設けられています。

各機能の制限数(Google リファレンスより) ※英語です

有料版と無料版でも違いがありますので今回は無料版を見てみると

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++) {
        //メールの件名をログ出力します
        Logger.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++) { 
    //参考のため添付ファイル名をログ取得します 
    Logger.log(zipAttachments[k].getName());
    //unzipメソッドでzipファイルを展開します
    var unzipFile = Utilities.unzip(zipAttachments[w]);
    //展開したファイル数を取得します
    var unzipFileNum = unzipFile.length;
  }
  //フォルダー場所を取得します(太字部分は各自フォルダIDを入れてください)
  var folder = DriveApp.getFolderById("1YTWmbQxCnnuLtgD8VhCTcV6xDAbsEPiT"); 
  //展開するファイルが複数の場合があるためここでもループを行います
  for (var q = 0 ; q < unzipFileNum; q++) {
    //ファイルを指定したフォルダに保存します
    folder.createFile(unzipFile[q]); 
  } 
}

簡単な流れを説明すると

searchメソッド(件名、開始数0番目、最大検索数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ファイル

のように日付をつけることによって毎朝前日の添付ファイル付き日報メールを指定フォルダに展開することができます。

このように毎日メールをチェックして指定のフォルダに保存をするといった作業が減りますね。

ぜひこの方法を取得して作業効率にお役立てください。

ここまでご覧いただきありがとうございました。

SNSでもご購読できます。

コメントを残す

*