Quantcast
Channel: いつも隣にITのお仕事
Viewing all articles
Browse latest Browse all 2076

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

$
0
0
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の検索窓の右端になる▽マークから「検索オプション」ウィンドウを開きます。

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

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

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

Gmailの検索コマンド

そこで、もう一点注目して欲しいのですが、検索窓に

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

という表示が出ていますね。

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

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

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

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

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

【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
問い合わせメールのデータの蓄積と効果分析にまつわることを色々とやっていきたいということで、今回はGoogle Apps Scriptで過去の問い合わせメールを特定条件で検索して取り出す方法です。

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

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

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

GmailAttachmentオブジェクト.getName()

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

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

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

まとめ

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

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

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

ただ、今回のスクリプトですと、一度取得したメールと添付ファイルと同じものを実行するたびに何度でも取得してしまいます。

それを避ける方法として、未読かどうかという条件による方法があります。

【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
Gmailの未読メールを取得する方法、メールを既読にする方法などを活用して、Google Apps Scriptで問い合わせメールを都度スプレッドシートに追加していく方法についてお伝えします。

別の方法として、「スター」を使う方法がありますので、次回はその方法についてお伝えしますね。

お楽しみに!

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

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

Viewing all articles
Browse latest Browse all 2076

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>