【GAS】Gmail添付ファイルの取得と自動保存

GASgmail,GmailApp,GmailApp.search

この記事では、Google Apps Script(GAS)を使って添付ファイルを取得し、自動でGoogleDriveに保存する方法を解説します。

Gmail添付ファイルを取得する方法

GASを使ってメールボックスから添付ファイルを取得・自動保存するには下記の手順で操作します。

GmailApp.searchメソッドを使ってメールボックスから抽出条件を指定
getMessagesメソッドgetAttachmentsメソッドで添付ファイルをオブジェクト化
・保存先のフォルダを指定し、DriveAppクラスののcreateFileメソッドを使って保存

サンプルコード

こちらは 「2021年12月中に受信したメールに添付されているファイルを保存する」サンプルコードです。

function saveAttachment() {

  //検索マッチ条件、添付ファイルあり、2021年12月の受信
  let query = 'has:attachment after:2021/12/1 before:2022/1/1';

 //指定条件でスレッド化
  let threads = GmailApp.search(query);

  //保存先のフォルダID
  let folderId = '[保存先のフォルダID]';
  
  //スレッド化したメールの件数分繰り返し 
  threads.forEach(function(thread) {
    // スレッド内のメール一覧を取得
    let messages = thread.getMessages();
    
    // メールを一つずつ取り出す
    messages.forEach(function(message) {
      // 添付ファイルを取得
      let attachments = message.getAttachments();

      //添付ファイルの受信日付
      let date = Utilities.formatDate(message.getDate(), 'Asia/Tokyo', 'yyyyMMdd');

      attachments.forEach(function(attachment){
  
        //日付を加えたファイル名用意
        let fileName = date +'_'+ attachment.getName();
        attachment.setName(fileName);
      
        // ドライブに保存  
        DriveApp.getFolderById(folderId).createFile(attachment);
        //ファイル名を上書き
     })
    });
  });
}

指定条件でGmailをスレッド化

まずはメールボックスの中から条件を指定してスレッド化条件を作ります。

今回ファイル添付されているメールが対象になるので、「query=’has:attachment’」のみ、特定条件(日付や送信者等)で指定したければ query=’has:attachment [指定条件]’ のようにサンプルコードを参考に記述を変えてください。

  //検索マッチ条件、添付ファイルあり、2021年12月の受信
  let query = 'has:attachment after:2021/12/1 before:2022/1/1';

 //指定条件でスレッド化
  let threads = GmailApp.search(query);

保存先のフォルダIDを指定

また、保存先のフォルダIDを指定する必要があるので、folderId = '[保存先のフォルダID]’にフォルダIDを記載してください。

  //保存先のフォルダID
  let folderId = '[保存先のフォルダID]';

そもそもフォルダIDの確認方法や取得方法がわからないという方は下記の記事も合わせてご確認ください。

添付ファイルをオブジェクト化

抽出したメール数分ループ→添付ファイル数分ループを繰り返して、全ての添付ファイルに処理を実行します。

  //スレッド化したメールの件数分繰り返し 
  threads.forEach(function(thread) {
    // スレッド内のメール一覧を取得
    let messages = thread.getMessages();
    
    // メールを一つずつ取り出す
    messages.forEach(function(message) {
      // 添付ファイルを取得
      let attachments = message.getAttachments();

保存ファイル名を指定

保存時のファイル名を指定します。setNameメソッドを使って、ファイル.setName('newName’)とすれば、Driveへの保存時に「newName」という名前で保存されます。

サンプルコードでは、受信日付を挿入し「受信日付_ファイル名」となるようにしています。

      //添付ファイルの受信日付
      let date = Utilities.formatDate(message.getDate(), 'Asia/Tokyo', 'yyyyMMdd');

      attachments.forEach(function(attachment){
  
        //日付を加えたファイル名用意
        let fileName = date +'_'+ attachment.getName();
        attachment.setName(fileName);

音声、動画、圧縮ファイル、実行ファイルなどをGASで扱うその他の方法は下記記事でも解説を行っています。応用すると、画像ファイルはすべてpngに変換してから保存、といった処理も可能です。

Google Driveのフォルダを指定して保存

DriveApp.getFolderByIdメソッドを使い、フォルダIDで保存先を指定して保存します。

        // ドライブに保存  
        DriveApp.getFolderById(folderId).createFile(attachment);

実行結果

無事、ドライブに該当のファイルを保存できました。

まとめ

GASでGmailの添付ファイルを自動でGoogleDriveに保存する方法を解説しました。

GmailApp.searchメソッドを使ってメールボックスから抽出条件を指定
getMessagesメソッドgetAttachmentsメソッドで添付ファイルをオブジェクト化
・保存先のフォルダを指定し、DriveAppクラスののcreateFileメソッドを使って保存

この記事を書いた人

てつお
広告代理店出身、事業会社でWebマーケティングや開発の仕事をしている26歳です。プロフィール詳細はこちら
■Google広告認定資格|Google アナリティクス個人認定資格(GAIQ)|TOEIC920点