【GoogleAppsScript】Gmailの不要メールを定期的に自動削除する！

# 前提

- **Googleアカウントを持っている**
- JavaScriptの基礎知識
- APIの基礎知識

# 作ったもの

毎朝4~5時に自分で設定した削除メアドリストにあるメールアドレスからのメールを`Gmail`の`受信トレイ`から`ゴミ箱`に移すシステム。（完全に削除する関数が用意されていないため、完全に削除したい場合は`ゴミ箱`から手動で行う。）

# 技術選定（この記事で学べること）

- 削除メアドリストの設定 → Googleの「バックアップと同期」
- ↑のリストの取得 → DriveApp
- 条件にあったメールオブジェクトの取得 → GmailApp
- ↑を毎朝4~5時に削除する → Google Apps Script

# いざ、実装

DriveApp、GmailAppはGoogle Apps Scriptの中の話なのでまとめちゃって

1. Googleの「バックアップと同期」による削除メアドリストの設定
2. システムのメインの部分（Google Apps Script）
3. 毎朝4~5時のトリガー（Google Apps Script）

の順に説明しちゃいます。

### 削除メアドリストの設定

ローカルで削除メアドリストをjson形式で作成し、`Google Drive`と同期しておく。この設定をしておくと、新たに削除したいメールアドレスが出てきたときや、やっぱりこのメールアドレスは削除したくない！となった時に、ローカルで変更するだけでOKとなり、便利です。

```json:DeleteAddressList.json
{
    "送信元の名前1": "メールアドレス1",
    "送信元の名前2": "メールアドレス2",
    "送信元の名前3": "メールアドレス3"
}
```
今回は設定したメールアドレスからのメールの中で、`直近7日に受信`した`既読`で`スターがついていない`メールを削除するようにシステムを構成します。（つまり、削除したくない！となったらスターをつけておけばOK。）

詳しくは次章。

参考：[Googleの「バックアップと同期」で大事なデータを自動保存！](https://blog.formzu.com/google_backup_and_sync)

### システムのメインの部分

https://script.google.com にアクセスし`+ 新しいプロジェクト`をクリックするとエディタが起動！簡単！

以下のようなソースコードを書いていきます。（拡張子.gsだけど、JavaScriptと同じだよ！）
最新のソースコードはGitHub上で公開しています。[**→ここ**](https://github.com/2754github/GAS_app)

```javascript:gmailEliminator.gs
function myFunction() {
  const addressList = DriveApp.getRootFolder()// 「.getFolderById('フォルダID')」でも良い。
    .getFilesByName('DeleteAddressList.json')
    .next().getBlob().getDataAsString('utf-8').replace(/\r?\n/g, '');
  const addressJson = JSON.parse(addressList);
  const addressArray = Object.values(addressJson);
  const deleteAddress = addressArray.join(' from:');
  deleteThreads = GmailApp.search('{ from:' + deleteAddress + ' }' + ' newer_than:7d' + ' is:read' + ' -is:starred');
  for (let i = 0; i < deleteThreads.length; i++) {
    deleteThreads[i].moveToTrash();
    // // デバッグ用
    // deleteThreads[i].markUnread();
    // Logger.log('test')
  }
}
```
補足：

```
https://drive.google.com/foo/bar/baz/AB01CD23EF45
                                     |----------|
                                       フォルダID
```
参考：

- [GASでテキストファイルの内容を読み取る](https://qiita.com/golyat/items/b0c567c28e0e1ee80526)
- [Gmail で使用できる検索演算子](https://support.google.com/mail/answer/7190?hl=ja)
- [Class DriveApp](https://developers.google.com/apps-script/reference/drive/drive-app)
- [Class GmailApp](https://developers.google.com/apps-script/reference/gmail/gmail-app)


### 毎朝4~5時のトリガー

**トリガー設定の前に**
上記ソースコードではDriveApp、GmailAppを使用しています。つまり、`Google Drive`、`Gmail`にアクセスするため、`承認`が必要となります。

`▶︎`ボタンで関数を実行*すると承認を求めるモーダルが出現するので、承認しましょう。（初回のみ）

*そのままの実行が怖ければ上記ソースコードの`deleteThreads[i].moveToTrash();`を`Logger.log('test')`に置換してから実行しましょう。（このログは「`表示`タブの`ログ`」に記録される。）

参考：[【GoogleAppsScript】ログ出力(デバッグ目的)](https://qiita.com/chihiro/items/09c996d41d80f0d30e17)

**いざ、トリガー設定**
とても簡単に設定できます。
`▶︎`ボタンの左にある`タイマー（？）を模したアイコン`をクリックして、あとはお好みの設定を行い`保存`すればOKです。（私はなんとなく毎朝4~5時に設定しました。）

参考：[Gmailの受信トレイ内のメールを自動削除するやり方](https://qiita.com/kobaboy/items/bbdc6ceb1904947866d2)

# 完成！

これにて実装完了となります、お疲れ様でした！
ボリュームを抑えるために、ところどころ説明を端折っており、少々分かりづらいかも知れません。
ご感想、ご質問等があればぜひコメントをお寄せください😊

# 感想

AWS等を使うよりも簡単にできたと思います。**しかも無料。**
Lambda + S3でも良かったのですが、

- 前回がLambdaを使った記事だった
- Google Apps Scriptを使ってみたかった
- システムの対象がGoogleのサービスである`Gmail`だった

というのもあり、Google Apps Script + Google Driveでの実装に挑戦することにしました。確かにDriveApp、GmailApp等がもともと用意されているので、Googleのサービスを触るシステムの場合はGoogle Apps Scriptが有用だなと感じました。