Google Apps ScriptでGmailの添付ファイルをGoogleドライブに保存する

attachment

photo credit: DiariVeu – laveupv.com gettyimages – camió via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptで特定のメールの添付ファイルをGoogleドライブに保存するツールを作っています。

前回はこちらの記事でした。

Google Apps ScriptでGoogleドライブのフォルダ内にファイルを作成する方法
Google Apps ScriptでGoogleドライブの特定フォルダにファイルを作成する方法についてお伝えします。内容やMIMEタイプを指定する方法、Blobオブジェクトを指定する方法の二つあります。

Googleドライブのフォルダ内にファイルを作成する方法をお伝えしました。

本ツールの作成を進めていく上で、データを交換するためのBlobオブジェクトは重要なオブジェクトですので、イマイチな方は再度見直しをして頂ければと思います。

さて、今回ですがいよいよGoogle Apps ScriptでGmailのメールから添付ファイルを取得していきたいと思います。

では、行ってみましょう!

スポンサーリンク

対象となるメールの条件と検索クエリ

まず、対象となるメールの条件を確認する必要があります。

一般的には

  • 送信元アドレス(from:)
  • 件名(subject:)

などを条件とする場合は多いのですが、今回は以下のようにします。

件名に「添付ファイルテスト」を含む

その場合、例えばGmailではこの条件のメールをどのように検索しますか?

まず、Gmailの検索窓の右端になる▽マークから「検索オプション」ウィンドウを開きます。

そして、その「件名」に「添付ファイルテスト」と入力し、検索マークをクリックすれば検索できます。

Gmailの検索オプションウィンドウ

すると、検索結果が出まして、対象となるメールが二件ありました。

Gmailの検索クエリ

そこで、もう一点注目して欲しいのですが、検索窓に以下のような表示がされていますね。

subject:(添付ファイルテスト)

これが”件名に「添付ファイルテスト」を含む”ことを表す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文で件名を出力するというものです。

この実行結果はこちらです。

Google Apps Scriptで添付ファイル名をログ出力

条件にマッチしたメールの件名がログ出力されていますね。

Gmailでのメール検索については以下の記事にも詳しく紹介していますので、よろしければご覧くださいね。

429 Too Many Requests

getAttachmentsメソッドで添付ファイルを取得する

次に、それらのメールに添付されているファイルを取得してみましょう。

メールの添付ファイルを取得する場合には、Messageオブジェクトに対して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つまり添付ファイル名を取得しているということですね。

GmailAttachmentオブジェクト.getName()

抽出したメールの添付ファイルをGoogleドライブに保存する

さて、前回の記事でお伝えした

  1. GmailAttachmentオブジェクトはBlobSourceとして使用できる
  2. 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で添付ファイルをGoogleドライブに保存

まとめ

以上、Google Apps ScriptでGmailで抽出したメールの添付ファイルをGoogleドライブに保存する方法についてお伝えしました。

  • getAttachmentsメソッドでMessageオブジェクトの添付ファイルを取得する
  • createFileメソッドの引数にGmailAttachmentオブジェクトを指定する

この二点がポイントですね。

どうぞご活用くださいね~

連載目次:GASでGoogleドライブを操作してメール添付を自動保存

メールの添付ファイルをGoogleドライブに自動保存するツールを題材として、Google Apps ScriptでGoogleドライブを操作する方法についてお伝えするシリーズです。
  1. Google Apps ScriptでGoogleドライブを操作する最も簡単なスクリプト
  2. Google Apps ScriptでGoolgeドライブのフォルダ内にファイルを作成する方法
  3. Google Apps ScriptでGmailの添付ファイルをGoogleドライブに保存する
タイトルとURLをコピーしました