テレビ局員の独学プログラム

ともきちの日曜プログラムとガジェット

最近プログラムにはまっているので、はてなブログもやってみる。プログラムは完全独学なのでいろいろご愛嬌。

Gmailの添付ファイルをgoogle driveに保存する

IFTTTのGmail連携が終了してしまった。
Gmailの添付ファイルを自動でgoogle driveに保存するプログラムをGASで作成して
定期実行すれば代わりになりそう。

GASは参考になるものがたくさんあるので、割と簡単。エラー処理はなし。
以下の点を工夫した。

  • 本日分の未読メールだけ検索。
  • 処理が終わったら既読にすることで、次の実行時は対象外。

検索条件を指定する

検索条件は後から変えやすいように記述。検索条件設定の先頭にスペースつけるの注意。
条件の書き方はGmail で使用できる検索演算子 を参照)

//昨日の日付計算
  var now = new Date();
  var yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);  
  yesterday = Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd");

  var condition;
  condition  = " is:unread"  //未読
  condition += " has:attachment";  //添付あり
  condition += " after:" + yesterday;  //今日(昨日より後)
//  condition += " subject:添付やで";  //件名
//  condition += " from:hogehoge@めーる" //差出人

メールを検索する

上記の条件でメールを検索する。
GmailApp.getMessagesForThreads()は二次配列で返ってくるので注意。
1つのスレッドが返信を含めた複数のメールの一次配列となる。

  var search_mail = GmailApp.search(condition);
  var messeges = GmailApp.getMessagesForThreads(search_mail); //これが二次配列

ループ処理しつつ、添付ファイルを保存する

今回はgoogle driveに保存するので、保存するフォルダのIDを調べる。
フォルダIDはフォルダURLの~folders/以降となる。
処理が終わったスレッドは既読にする。

 var hozon_folder = DriveApp.getFolderById('フォルダID');

//スレッド数ループ
 for(var i = 0; i < messeges.length; i++) {
    for(var j = 0; j < messeges[i].length; j++) {
      var attach = messeges[i][j].getAttachments();
      for(var k = 0; k < attach.length; k++){
        hozon_folder.createFile(attach[k]);
      }
    }
    messeges[i][0].markRead();
  }

定期実行

これを、定期実行すれば自動保存されていく。
GASの定期実行はプロジェクトのトリガーを設定するだけ。
f:id:mtomo661:20190414015732p:plain

5分に1回なのか、1時間に1回なのかはお好みで。
無料ユーザーは定期実行の制限に注意。(これくらいは大丈夫)

まとめ

function Attachment_to_GDrive() {
  
  /*
  条件に合うgmailの添付ファイルをgoogledriveに保存する
 検索条件は先頭にスペースつけるの注意
  */
  
  //昨日の日付計算(検索条件用)
  var now = new Date();
  var yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);  
  yesterday = Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd");
  
  //保存先フォルダ設定(フォルダURLの~folders/以降) 
  var hozon_folder = DriveApp.getFolderById('google drive フォルダID');
  
  //検索条件設定 (Gmail で使用できる検索演算子 参照)
  var condition;
  condition  = " is:unread"  //未読
  condition += " has:attachment";  //添付あり
  condition += " after:" + yesterday;  //今日(昨日より後)
//  condition += " subject:添付やで";  //件名
//  condition += " from:hogehoge@じーめーる"
    
  //条件でメール検索
  var search_mail = GmailApp.search(condition);
  //検索したメールをスレッドで取得(二次配列)
  var messeges = GmailApp.getMessagesForThreads(search_mail);

  //スレッド数ループ
  for(var i = 0; i < messeges.length; i++) {
    //スレッドの中身数ループ
    for(var j = 0; j < messeges[i].length; j++) {
      //添付ファイル取得(一次配列)
      var attach = messeges[i][j].getAttachments();
      //添付ファイル数ループ
      for(var k = 0; k < attach.length; k++){
        //添付ファイル保存
        hozon_folder.createFile(attach[k]);
      }
    }
    //スレッドが終わったら、既読に
    messeges[i][0].markRead();
  }
}

今回は保存用に転送したメールの添付ファイルを保存する想定なので未読メールだけを処理。
既読のメールも処理する際は、定期実行の前回実行時間以降を処理(5分に1回なら、5分前以降)するなどの工夫が必要。
ただし、GASの定期実行は負荷分散を考慮して正確ではないので、タイミングによっては逃したり、重複保存されるかも。