【Gmailの添付書類の自動保存】見よう見まねでできた便利なGAS


自己紹介

どんな人がこの記事を書いているのかを少しご紹介させていただいてから、スクリプトのご紹介をします。

私は、プログラマーでもなく、スクリプトの勉強もしたことがありません。しかもブログも初めて。
だけど、タイトルの通り、「見よう見まね」でGASを実行してみたら「やりたいことができた!」その感動と、私のようにコーディングスキルがなくてもコードの組み合わせでやりたいことができることを知って、さらに時短・正確・便利に作業を進めて、空いた時間を自分がやるべきことに費やせる方を増やしたいと思い、記事を書いてみることにしました。
なお、前述の通り、スクリプトに関する知識はゼロのためスクリプトについてご相談をいただいてもお答えができませんのでご理解ください。
知識がない方でも調べ方次第で、やりたいことができる。ということをお伝えしたいのです。また、調べ方などが参考になればと思って、行き着いた過程なども記載しています。

今回やりたいこと

達成条件

  1. Gmailに添付されたファイルを指定したGoogleドライブに自動保存すること

詳細な条件

  1. ファイル重複は避けたいが、難しいコードなく割とリアルタイムでファイルの自動保存をしたい。

  2. 自動保存のファイルにメール受診の日付を入れたい。

参考にした記事

達成条件1のベースとなるスクリプトはこちら↓の記事を参考にさせていただきました。

詳細な条件2のファイル名のスクリプトはこちら↓の記事を参考にさせていただきました。

達成条件1と詳細な条件2は上記のスクリプトの組み合わせで達成できましたが、詳細な条件1は自分で作ることもできず、なので、GASの機能を応用することにしました。

詳細な条件1「ファイル重複は避けたいが、難しいコードなく割とリアルタイムでファイルの自動保存をしたい。」

  • 1日1回のGASの実行(ファイル重複を避けたいので)

  • メールは1日分のメールで添付ファイルのあるものにする

■サンプルコード

function myFunction() {
 
 //添付ファイルを保存するフォルダを取得
 var folder = DriveApp.getFolderById("Googleドライブの指定フォルダのID");
 
 //検索クエリを生成
 var query = "has:attachment newer_than:1d ";
 
 //検索queryに一致するスレッドを取得
 var threads = GmailApp.search(query);
 
 //各スレッド情報を取得
 threads.forEach(function(thread){
   
   //スレッド内の全てのメッセージを取得
   var messages = thread.getMessages();
   
   //各メッセージ情報を取得
   messages.forEach(function(message){
     
     //メッセージ内の全ての添付ファイルを取得
     var attachments = message.getAttachments();
     
     //各添付ファイル情報を取得
     attachments.forEach(function(attachment){

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

       attachments.forEach(function(attachment){
  
        //日付を加えたファイル名用意
        let fileName = date +'_'+ attachment.getName();
        attachment.setName(fileName);
    
         //添付ファイルを指定フォルダに格納
         folder.createFile(attachment);

          });
          
       });
     
     });  
       
   });  

}

GoogleドライブのフォルダIDの確認

//添付ファイルを保存するフォルダを取得
 var folder = DriveApp.getFolderById("Googleドライブの指定フォルダのID");

保存したいフォルダ先まで開いて、最後の部分を抽出。

検索クエリの作成

詳細な条件1で「メールは1日分のメールで添付ファイルのあるものにする」にしたいので、
「添付ファイルのあるメールで、現在から1日(24時間)以内のもの」=「as:attachment newer_than:1d 」とします。

//検索クエリを生成
 var query = "has:attachment newer_than:1d ";

検索クエリとは、

「検索クエリ」≒ 検索条件
最初から演算子がわからなくても、
抽出したい演算子かどうか、Gmail で使用できる検索演算子一覧を使って、Gmailの検索バーに入れて試してみると、分かります。
もし、今回のサンプルコードとは異なる条件の場合は、一覧を見ながら試してみて下さい。

Gmail で使用できる検索演算子一覧

添付ファイルのあるメール

has:attachment 

期間指定

  • 現在から1日(24時間)以内のもの

newer_than:1d

 ※日(d)、月(m)、年(y)で期間を指定できます。

  • 2023年12月中

after:2023/12/1 before:2024/1/1

  • 添付ファイルのあるメールで、現在から1日(24時間)以内のもの→has:attachment newer_than:1d

Gmail で使用できる検索演算子一覧にもあるように、日(d)、月(m)、年(y)で期間を指定できます。

  • 添付ファイルのあるメールで、2023年12月中に受信したメール→has:attachment after:2023/12/1 before:2024/1/1

保存するときのファイル名に「メール受信時の日付を入れたい」

     //メッセージ内の全ての添付ファイルを取得
     var attachments = message.getAttachments();
     
     //各添付ファイル情報を取得
     attachments.forEach(function(attachment){

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

       attachments.forEach(function(attachment){
  
        //日付を加えたファイル名用意
        let fileName = date +'_'+ attachment.getName();
        attachment.setName(fileName);
    
         //添付ファイルを指定フォルダに格納
         folder.createFile(attachment);

下記のサンプルコードを使わせていただきました。

■タイマートリガー

詳細な条件1で「割とリアルタイムでファイルの自動保存をしたい」ので、
1日おきのタイマートリガーを設定します。

Gmailの期間に関する演算子は「日(d)」がミニマムのようなので、「割とリアルタイム」は、日単位を許容とすることにしました。

トリガーの設定

ここでは、毎日8−9時にGASを実行するように設定しました。

完了!

これでようやく完了しました!
毎日8−9時に1日前のメールをチェックし、添付ファイルがあれば、指定したフォルダ先に受信日を入れたタイトルで自動保存してくれます。


この記事が気に入ったらサポートをしてみませんか?