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の定期実行はプロジェクトのトリガーを設定するだけ。
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の定期実行は負荷分散を考慮して正確ではないので、タイミングによっては逃したり、重複保存されるかも。