【Gmail】GAS を用いて既読メールを自動でアーカイブする未読トレイを実装してみた

## はじめに
Outlook や Thunderbird, iOS 純正のメールアプリでは、未読メールのみを表示し既読になったら非表示にする未読トレイを作成することができます。 しかし、iOS 純正のメールアプリでは全てのメールアドレスに対する未読トレイしか作成できませんし、Gmail アプリでは上記アプリのような未読トレイは作成することができません（私の認識が正しければですが…）。 そこで Gmail のフィルタ機能を使って未読メールに対してラベル付けを行い、Google Apps Script を用いて既読になったら自動で未読ラベルを外す機能を実装してみました（需要があるかは知りませんがこんなことができるんだと思い、実装してみました）。
Outlook や Thunderbird, iOS 純正のメールアプリで、未読メールのみを表示し既読になったら非表示にする未読トレイを作成する方法は以下の通りです。
<details><summary>未読トレイの作成方法（Outlook, Thunderbird, iOS 純正のメールアプリ）</summary><div>

### Outlook
メニューバーの [フォルダー]から[新しい検索フォルダー]を選択します。以下のようなポップアップが出てくるので、未読のメールを選択し[OK]押下して下さい。すると、左のタブメニューに[検索フォルダー]→[未読のメール]と表示されるので、右クリックから[お気に入りに追加]を選択するといいでしょう。

![スクリーンショット2023-05-07 20.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/b54a1e89-2adb-6e57-b777-cad03100b811.png)

### Thunderbird
左上の[ファイル]から[新規作成]→[検索フォルダー]を選択して下さい。
![スクリーンショット2023-05-07 20.59.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/8b544d27-9f11-ab71-d29f-ad7dfb590964.png)
次に、検索条件を設定します。[状態]→[が次と異なる]→[既読]とし、この条件を適応するフォルダを選択します。Gmail であれば、Gmail の[すべてのメール]を選択すればよいでしょう。個別に選択したい場合は個別に選択して下さい。この時、別アカウントのフォルダを選択することも可能です。これで[OK]をクリックし[作成]を押下すれば未読トレイが作成されます。
![スクリーンショット2023-05-07 21.09.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/d087e239-9bfe-8327-b50b-b66c2a5d7696.png)
ただし、この未読トレイが作成される場所がアカウントの一番下に作成されるので、位置を入れ替えた方が使いやすいです。入れ替えるには純正の設定ではできないので、[Manually sort folders](https://addons.thunderbird.net/ja/thunderbird/addon/manually-sort-folders/) アドオンを追加して下さい。アドオンの追加ができたらメニューバーの[ツール]から[フォルダの並び替え]を選択して下さい（ない場合は Thunderbird を再起動して下さい）。Manually sort folders 設定が立ち上がるので[フォルダの並び替え]からお好きなように並び替えて下さい（右下の「フォルダペインの更新」を押下するだけでもいい感じに並び替えてくれると思います）。

### iOS 純正のメールアプリ
iOS 純正のメールアプリを開き、右上の[編集]から[未開封]にチェックを入れて[完了]を押して下さい。すると、全てのメールアドレスに対する未開封のメールが表示されるようになります。
<img width=330 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/4810c541-c9b0-9fb0-bfdb-7cb39ef785db.png"><img width=330 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/ec57bdc4-6c25-3ad9-43e5-126caef36e93.png"><img width=330 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/b3d7108b-3489-5db4-b208-6fa29ae4ef8c.png">

</div></details>


## 環境
* Windows 10
    * Thunderbird 102.10.1 (64 ビット)
    * Outlook 
    * Google Apps Script
* iPhone
    * iOS 16.2
    * Gmail アプリ

## 導入

#### 未読トレイの作成
まず始めに、Gmail 上で未読トレイを作成するところから始めましょう。[Gmail](https://mail.google.com/mail/)にアクセスし、未読トレイを作成したいアカウントでログインして下さい。左側のメニューにて[ラベル]の右にある **+** を選択します。新しいラベル名として「未読トレイ」と入力して下さい。この時、Gmailのラベルの並び順はアルファベット順で表示されるので、名前が「未読トレイ」だとかなり下位の方に表示されることになります。そこで、一工夫としてアンダースコア（_）を付け「_未読トレイ」などとすると、並び順として上位の方に来るので見やすくなります（実際には受信トレイの下位にネストしたいのですが、これはできません）。

#### フィルタの設定
続いて、未読メールを先程作成した未読トレイに振り分けるフィルタを作成していきます。[Gmail](https://mail.google.com/mail/)の最上位にある「メールを検索」の横の「検索オプションを表示」から[含む]に対して、"label:unread"と入力してフィルタを作成して下さい。この時、「フィルタの作成を確認」というポップアップが出てきますが「OK」ボタンを押下して次に進んで下さい。そして以下のように、ラベルを付けるで先程作成した「未読トレイ」を選択して下さい。この時注意点として、「受信トレイをスキップ（アーカイブする）」にチェックを入れないようにして下さい。これで、右下の「フィルタを作成」を押下して完了です。ひとまずこれで、未読メールが未読トレイへと格納されるようになりました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/7db1d922-7330-dd3f-6d5e-b87a309e8cd6.png)

#### Google Apps Script の設定
未読メールが未読トレイへと格納されるようになりましたが、このままでは、既読にしても未読トレイからは消えてくれません。そこで [Google Apps Script](https://script.google.com/home) を利用して、未読トレイのメールに既読が付いたら自動的にアーカイブするスクリプトを組んでいきます。
まずは、[Google Apps Script](https://script.google.com/home) にアクセスし、未読トレイを作成した Gmail のアカウントでログインして下さい。そして、左上にある「新しいプロジェクト」を選択し、以下のスクリプトを貼り付けて下さい。この時、注意点としてデフォルトのスクリプト`function myFunction()`は全て削除して下さい。また、`  var label = GmailApp.getUserLabelByName('_未読トレイ');`の"_未読トレイ"の部分は、**各々作成した未読トレイのラベル名に変更して下さい**。ここの名前が間違えてると、既読にしても自動的にラベルを外してくれません。

```console:Google Apps Script
function removeLabelFromReadEmails() {
  var label = GmailApp.getUserLabelByName('_未読トレイ');
  var threads = label.getThreads();
  for (var i = 0; i < threads.length; i++) {
    if (threads[i].isUnread() === false) {
      threads[i].removeLabel(label);
    }
  }
}
```

#### トリガーの設定
続いて、Google Apps Script で作成したスクリプトを定期的に実行するトリガーを設定していきます。[Google Apps Script](https://script.google.com/home) の左側メニューにある時計ボタンをクリックして下さい。すると、トリガーと表示されるはずです。その後、右下にある「トリガーを追加」を選択し、実行する関数として先程作成した `removeLabelFromReadEmails` を時間ベースのトリガーのタイプとして、`分ベースのタイマー`を、最後に時間の間隔として`1分おき`を選択して下さい。以下のようになっていれば OK です。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/40d01f37-87b0-6fb0-e8b4-c69c3af27c79.png)
最後に保存を押下して完了です。この時、サインインが求められるかも知れませんが、選択した Gmail アカウントを選択しアクセス許可を選んで下さい。Google Apps Script として以下のようになっていれば、完璧です（名前欄が「無題のプロジェクト」等になっているかも知れませんが変更することが可能です）。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/83fcc9be-2971-0660-60c6-6714ce620a0f.png)
但し、注意点としてお分かりの通りこのトリガーは1分おきにしか実行されません。つまり、未読メールを既読にしたら、即未読トレイから消えるという訳ではありません（こればかりは仕方ありませんね…勘弁して下さい）。

#### クォータ制限について
[Google Apps Script](https://script.google.com/home) の無料版では特定の期間内に実行できる操作の数に制限があります。これはクォータと呼ばれ、ユーザのエディションとアカウントの種類によって異なります。以下は、2021年時点でのいくつかの主なクォータ制限です。
* GmailAppでの読み書き操作：1日あたり20,000回（Google Workspace Business、Enterprise、Educationのユーザー）、1日あたり5,000回（無償版G Suiteユーザー、個人のGoogleアカウント）
* スクリプトの実行時間：1日あたり6時間（Google Workspace Business、Enterprise、Educationのユーザー）、1日あたり90分（無償版G Suiteユーザー、個人のGoogleアカウント）
* スクリプトのトリガーの最大数：20（全てのユーザー）

1日あたり Gmail のメールの処理は5千件と制限がされています（ここまで大量にメールが来る方はなかなかいないんじゃないかと思いますが…）。また、スクリプト `removeLabelFromReadEmails` の実行時間としてはかなり短く、大量のメールが来るという状況でなければ、1日あたり90分を超えることはないでしょう。ですので、クォータ制限に引っかかる心配はおそらく気にしなくても問題ないと思います。もしエラーが多発するようであれば、トリガーの実行間隔を短くするなどの対処を行って下さい。

## 最後に
私は、ニートなので Outlook は使用しませんし、メールアプリとしては Thunderbird を使っており、Gmail のアプリは基本使わないので、この機能を実装しても使うことはないと思います。Android スマホの純正メールアプリで未読トレイみたいな機能があるのかは知りませんが、Gmail アプリを使っている方は、未読トレイを実装して使用してみてください。

## 参考
[Thunderbirdに未読トレイを作成して追加する方法 | DIY](https://diy-hs.com/thunderbird-unread-tray-diy/)