見出し画像

非エンジニアがGmailとGoogleDriveを連携して添付ファイルを自動保存する!

月末月初のメールボックスは業務委託パートナーさんやサービスプロバイダーからの請求書で溢れかえります。面倒だなと思いながらも、見落としや処理忘れがないよう、1つずつダウンロードしてはGoogleDriveに保存しているかたも多いのではないでしょうか?
そこでGmailとGoogleDriveを自動連携して、届いた添付資料を自動で保存できるようにして生産性改善を図りました。
今回もGASで実装するパターンと、ノンコーディングで実装するパターン(2分で設定可能でした!!)の両方を紹介します。

この記事はこんな人におすすめ!
・毎月送付されてくる請求書の管理が大変
・人手で請求書管理を行っているのでミスが起こってしまっている
業務を自動化したいけど、コーディングなんてできない

1. どんな業務が楽になるのか

毎月様々なパートナーさんやサービスプロバイダーから送られてくる請求書。支払処理や経費の証跡のために、1つずつキチンと管理したいけど面倒ですよね。しかもちょっと気を抜くと他のメールに埋もれてしまい、探し出すのにも一苦労。最悪の場合、支払漏れなんてことが起こるかもしれません。

ということで、Gmailに届いたメールの添付資料を、GoogleDriveに自動保存できるようにしてみました。

スクリーンショット 2020-04-03 20.10.25

こちらのフォルダに自動保存されることをゴールとします。

2. Google Apps Scriptで実装してみる

まずはいつも通り、"GAS"で頑張って実装してみます。
(コーディングできないので参考にならない!という方は、3. もっと簡単に、ノーコーディングで実装してみる!まで読み飛ばしてください!)

下記の記事を参考に作成しました。

 2-1. 保存先のフォルダIDを取得

GASを書くまえに添付ファイルの保存先とするフォルダのフォルダIDを取得します。フォルダIDはフォルダのURLの"/folder/"以降の部分を指します 。

スクリーンショット 2020-04-03 18.37.35

上記URLの赤の部分がフォルダIDです。

 2-2. GASを書く!

◆検索条件を設定する

メールを検索する条件(取得する対象となるメール)を設定します。

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

 var condition;
 condition  = " is:unread"  //未読
 condition += " has:attachment";  //添付あり
 condition += " after:" + yesterday;  //今日(昨日より後)

 var search_mail = GmailApp.search(condition);
 var messeges = GmailApp.getMessagesForThreads(search_mail);

検索条件に設定できる演算子は下記リンクを参照しました。

他にも件名や差出人を検索条件に含めたい場合は、下記のように記述ができます。

var condition;
condition = " subject:ここに条件とする件名を記載";  //件名
condition += " from:ここに条件とするアドレスを記載" //差出人

◆Gmailを条件検索して、ファイルを保存する

メールの検索結果は二次配列(何番目のスレッドの何件目のメールか)で返ってくるため、二重ループで検索結果を1つずつ取り出していく必要があります。

var hozon_folder = DriveApp.getFolderById('GoogleDriveのFolderID');
 for(var i = 0; i < messeges.length; i++) { //検索結果を一つずつ取り出す
   for(var j = 0; j < messeges[i].length; j++) { //スレッドの場合ここを複数回実行
     var attach = messeges[i][j].getAttachments();
     var day = messeges[i][j].getDate(); //取り出したメールの日付を取得
     var strDay = Utilities.formatDate(day , "JST", "yyyy_MM_dd");
     if (day > today){ //★★メールが今日以降か再度チェック
       for(var k = 0; k < attach.length; k++){
         var filename = strDay + '_' + attach[k].getName();
         hozon_folder.createFile(attach[k]);
         var file = hozon_folder.getFilesByName(attach[k].getName())
         file.next().setName(filename);
       }
     }
   }
   messeges[i][0].markRead();
 }

これでOKです。まとめると下記。

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

 var condition;
 condition  = " is:unread"  //未読
 condition += " has:attachment";  //添付あり
 condition += " after:" + yesterday;  //今日(昨日より後)

 var search_mail = GmailApp.search(condition);
 var messeges = GmailApp.getMessagesForThreads(search_mail);

 var hozon_folder = DriveApp.getFolderById('GoogleDriveのFolderID');
 for(var i = 0; i < messeges.length; i++) { //検索結果を一つずつ取り出す
   for(var j = 0; j < messeges[i].length; j++) { //スレッドの場合ここを複数回実行
     var attach = messeges[i][j].getAttachments();
     var day = messeges[i][j].getDate(); //取り出したメールの日付を取得
     var strDay = Utilities.formatDate(day , "JST", "yyyy_MM_dd");
     if (day > today){ //★★メールが今日以降か再度チェック
       for(var k = 0; k < attach.length; k++){
         var filename = strDay + '_' + attach[k].getName();
         hozon_folder.createFile(attach[k]);
         var file = hozon_folder.getFilesByName(attach[k].getName())
         file.next().setName(filename);
       }
     }
   }
   messeges[i][0].markRead();
 }

◆トリガーを設定する

最後にGASを動かすトリガーを設定すれば完了。「Gmailにメールが届いたら」というトリガーは(おそらく)ないようで、今回は毎日朝に動かすように設定しました。

スクリーンショット 2020-04-03 19.15.48

以上で完了です。

3. もっと簡単に、ノンコーディングで実装してみる!

今回のGASは重複保存が起こらないように、「未読のメールを取得して、既読にする」という仕様にしています。しかしこれでは誤ってメールを開いてしまうと添付ファイルの取得漏れが発生してしまいます。また、メールが届くたびにGASを実行できる訳ではないというのもちょっと微妙。

と、いうことで、ここからが本番。弊社で開発したツールを使って、ノンコーディングでアプリケーションの連携+業務自動化を実現してみます。

◆ 連携したいアプリケーションを選択する

GmailとGoogleDriveを選択する

スクリーンショット 2020-04-03 19.26.11

◆ トリガーとアクションの選択を行う

今回はメールで受信した添付ファイルを取得するため
・トリガー:新規メールの受信
・アクション:添付ファイルを取得する
を選択する。

スクリーンショット 2020-04-03 19.35.39

◆ アカウント認証後、メールの条件設定を行う

添付ファイルを特定のメールからのみ取得したい場合は条件の設定を行います。弊社のツールではGmailの"ラベル"を任意の設定項目として使えます。
※ラベル:特定の件名や差出人などが設定できるタグのようなもの。詳しくは下記参照。

スクリーンショット 2020-04-03 19.43.23

これでGmailの設定は完了!

◆ GoogleDriveのアクションを設定する

次にGoogleDriveの設定を行います。まずはアクションの設定をします。

スクリーンショット 2020-04-03 19.58.26

◆ アカウント認証後、ドライブとフォルダを選択する

ファイルの保存先を設定します。ドライブの設定(マイドライブか、共有アイテムか)を設定すると、その配下のフォルダが選択できます。
今回は事前に作成した「請求書保存」のフォルダを設定しました。

スクリーンショット 2020-04-03 20.01.51

以上で完了です!
テストをしてみるとキチンと格納されていました!

スクリーンショット 2020-04-03 20.12.26

ちなみに今回はおよそ2分で簡単に設定完了!請求書を送付する差出人が変わったり増えたりしても、Gmailのラベル設定を変更すれば対応可能です!

今回のケース以外にも、
・salesforceとマネーフォワードの連携
・スプレッドシートとクラウドサインの連携
・TrelloとGoogleフォームの連携

などが簡単に実現できます!

「興味がある!」「使ってみたい!」という方、「こんなアプリケーション同士の連携はできないのか?」「こういうアプリケーションを使っているんだけど、どう連携したら業務が楽になるか?」といったご相談がある方、是非下記のページからお問い合わせください!

お問い合わせはこちらから!


自動化のお困りごとを解決するためのツール進化に活用させていただきます!