FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

GASで始めるスッキリメール

0.はじめに

こんにちは、業務効率化大好きな原田です。
今回は、表題のとおり「GAS(GoogleAppScript)」でメール処理自動化を図りたいと思います。

僕がGASをチョイスした理由は、簡単には次のとおりです。

  • プライベートでも活用できるから
  • クラウドで動作するので、ローカル立ち上げっぱなしにしなくてよいから
スッキリメールという表題にしているのは、見通しのよいメールBOXにすることを目的としています。
皆さんは1年前のメール読み返しますか?
恐らくは、こう答えていただけると思います。
ものによっては・・・

ものによっては、というのはあるルールを元に自分の頭を使ってメール振り分けているということですよね。

頭使うの辞めましょう!
最初の1回だけ頭を使って、後はコンピューターにやってもらいましょう!

では、早速やっていきます!

1.GASの導入

まずは、GoogleAppScriptが書ける環境を用意しないといけません。
ですので、それについて記載します。

1-1.ドライブにインストール(接続?)

まずは自分のGoogleDrive(以下:Drive)に移動しましょう。
作成ボタンを押して「アプリを追加」を押します。
Macっぽい検索画面がでたらGoogleAppScriptで検索をかけて、「+接続」ボタンを押します。

これでおしまいです。

1-2.インストール(接続?)確認

Driveにて作成ボタンをおすと「スクリプト」が追加されていることを確認して下さい。

2.早速作ってみよう

インストールも終わったことですのでさっそく作りましょう!

2-1.設計?

メール削除(もしくは非表示)の自動化ということなので、実際にどうやってメール削除しているか考えました。
僕の場合は、メールの検索窓に次のように打ち込んで、全選択して削除(もしくはarchive化)しています。
「label:12_チャットワーク通知 older_than:1d」
「category:forums is:read older_than:2m」

上記の文字列を入れれば、勝手に削除してくれるスクリプトを書こうと思います。

2-2.関数の実装

ロジック部分の作成

上記のざっくり設計したとおりであれば、検索する ⇒ 検索結果を消す。
これだけです。

今回は、Gmailの操作ですので、GmailAppクラスを使用します。
GmailAppクラスにはすでに、検索文字列をいれると検索をかけてくれる便利メソッドが存在します。

GmailApp.search

  • https://developers.google.com/apps-script/reference/gmail/gmail-app#search(String)
  • また、一括削除してくれる便利メソッドが存在します。
    GmailApp.moveThreadsToTrash

  • https://developers.google.com/apps-script/reference/gmail/gmail-app#moveThreadsToTrash(GmailThread)
  • おお!素晴らしい。
    これだけでできるではないか!

    function SearchAndDeleteMail(searchString)
    {
      var threads = GmailApp.search(searchString);
      GmailApp.moveThreadsToTrash(threads);
    }
    


    しかし、落とし穴がありました。

    moveThreadsToTrashメソッドが100件以上のメール削除に対応していない!!

    リファレンスに書いといてくれよ…
    なので、100件ずつ消していく処理に次のようにロジック変更しました。

    //検索物を全て削除します。
    //引数:検索文字列
    function SearchAndDeleteMail(searchString)
    {
      //GmailAppの制約上100件ずつしか消せないので、100件で回す
      for(var i = 0; GmailApp.search(searchString).length > 100; i++){
        var threads = GmailApp.search(searchString, 0, 100);
        GmailApp.moveThreadsToTrash(threads);
      }
      
      //残り物処理
      var threads = GmailApp.search(searchString);
      if(GmailApp.search(searchString).length > 0){
        GmailApp.moveThreadsToTrash(threads);
      }
    }
    

    自分用の呼び出し口を作成

    あとは、上記で作った関数を呼び出していくだけですね!
    以下、サンプルです。

    function CleanUpMails() {
      SearchAndDeleteMail("label:hoge is:read older_than:1d");
      SearchAndDeleteMail("label:fuga is:read older_than:7d");
      SearchAndDeleteMail("label:ML_hoge is:read older_than:120d");
      SearchAndDeleteMail("category:forums is:read older_than:2m");
    }
    


    これにて実装完了です!
    詳細検索のオプションについては以下を参考にしてみてください。
    詳細検索

    3.自動化しよう

    関数をつくったものに、自分の手で叩いていたら意味がないですよね。
    というわけで、自動で実行してもらうようにしましょう。

    GoogleAppScriptにはトリガーといった機能があります。
    ある条件を満たすと自動的に実施してくれる機能です。
    いまのところ、時間指定しかないみたいですが、後々いろいろ実装される?

    さっそく設定しましょう!
    上記でつくった、プロジェクトの「リソース>現在プロジェクトのトリガー」を選択します。
    「新しいトリガーを追加」を押します。
    実行→「CleanUpMails」
    イベント→「時間主導型」「日タイマー」「最後に実行したい時間帯」
    を設定して完了です。

    参考図面
    f:id:s_hayase:20150722144848p:plain

    4.最後に

    いかがだったでしょうか?
    実際に動かしてみるとメールBOXがかなりすっきりすることかと思います。
    メールの見逃しもこれで少なくなると幸いです。

    次回は、スプレッドシートとの連動やWebアプリの公開について書いてみようかと思います。

    99.参考文献

    本家
  • https://developers.google.com/apps-script/