みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Gmail使ってますよね!?
まさかまさか…受信トレイ、何十件も、何百件もメッセージ溜まっていませんよね?
ということで、Google Apps Scriptで溜まったGmailのメッセージを問答無用で自動アーカイブする方法をお伝えしています。
前回の記事はこちら。
指定した日時以前のスレッドをアーカイブするスクリプトを紹介しました。
ただ…日付が固定だったんですよね。
できれば「今日から3日前以前のスレッドは全部アーカイブ!」とかにしたいですよね。
ということで、今回はGASでGmailの受信トレイに溜まった今日から指定の日数以前のスレッドをアーカイブする方法をお伝えしますね。
では、行ってみましょう!
前回のおさらい
前回作成したスクリプトをベースに解説を進めていきますね。
コチラです。
function archiveThreads() { const searchQuery = 'in:inbox before:2020/3/7'; const threads = GmailApp.search(searchQuery); GmailApp.moveThreadsToArchive(threads); }
2行目で設定したsearchQueryを使って、3行目でGmailのスレッドを検索します。検索した結果は「スレッドの配列」として取得できます。
その「スレッドの配列」をそのまんま引数にできる便利メソッドがmoveThreadsToArchiveメソッドで、それらのスレッドをアーカイブしてくれるというものです。
ただ、冒頭でお伝えした通り、固定の日付しか指定できないので、その部分を修正していきます。
何日前のDateオブジェクトを取得する
前述のスクリプトでいうと、変数searchQueryに与える文字列の日付部分を、「今日の日付の3日前の日付」にしてあげる必要がありますね。
日付を表すオブジェクトはDateオブジェクトですから、まずは今日の3日前の日付を求める方法を考えましょう。
Dateオブジェクトの「日」を取得するgetDateメソッドと、「日」を設定するsetDateメソッドを組み合わせますよ。
getDateメソッドは「日」を数値で取得します。
setDateメソッドの引数は数値で与えます。
これらをどう使うかというと、元となるDateオブジェクトの「日」をgetDateメソッドで取得して、その数値から3を引き算して、その結果をsetDateしてあげればよいのです。
つまり、こういうことです。
const date = new Date(); date.setDate(date.getDate() - 3);
引き算して日数が0やマイナスになる場合
でも、4/1とか4/3とかだったら、日数の引き算したら0とかマイナスになっちゃうんですけど、どうなっちゃうんでしょう?
でも大丈夫。
let date; date = new Date('2020/4/1'); date.setDate(date.getDate() - 3); console.log(date); //Sun Mar 29 2020 00:00:00 GMT+0900 (日本標準時) date = new Date('2020/4/3'); date.setDate(date.getDate() - 3); console.log(date); //Tue Mar 31 2020 00:00:00 GMT+0900 (日本標準時)
このように、ちゃんと正しく、前月の日付になってくれています。
日付の書式を整えて文字列にする
これで、「3日前の日付」のDateオブジェクトを求めることができましたので、あとはこれを用いて、変数searchQueryを構成できれば良いですね。
ただ、Dateオブジェクトをそのまま指定すると、searchQueryは以下のような形式になってしまいます。
残念ながら、この形式ではうまく検索ができませんので「yyyy/M/d」のフォーマットの文字列に変更する必要がありますね。
そのようなときのために、GASではUtilitiesサービスの中に、formatDateというメソッドを用意してくれています。
Dateオブジェクトを指定のフォーマットで文字列に変換します。
- 日付: Dateオブジェクト
- タイムゾーン: 日本なら「’JST’」
- フォーマット: 「y」「M」「d」を使った書式
フォーマットはアルファベットとその数で書式を表します。例えば以下のようなものです。
- ‘yyyy-MM-dd’ とすれば 「2020-04-01」
- ‘yyyy年M月d日’ とすれば 「2020年4月1日」
ですから、今回は「’yyyy/M/d’」と指定すれば良いでしょう。
今日から3日以前のスレッドをアーカイブするスクリプト
以上を踏まえて、今日から3日前のスレッドをアーカイブするスクリプトを作りました。
こちらです。
function archiveThreads() { const date = new Date(); date.setDate(date.getDate() - 3); const searchQuery = `in:inbox before:${Utilities.formatDate(date, 'JST', 'yyyy/M/d')}`; const threads = GmailApp.search(searchQuery); GmailApp.moveThreadsToArchive(threads); }
簡単ですね。
Gmail演算子older_than、newer_thanを使う方法
実は、Gmailの検索演算子便利なものがありました。
「older_than:」「newer_than:」という演算子を使えば、日(d)、月(m)、年(y)で期間を指定して、それより古いメールか新しいメールを検索することができるのです。
つまり、こういうことですね。
function archiveThreads() { const searchQuery = 'is:starred older_than:3d'; const threads = GmailApp.search(searchQuery); GmailApp.moveThreadsToArchive(threads); }
…こっちのほうが断然簡単ですね。
Gmailのsearchメソッドを使う場合は、Gmailの検索演算子をちゃんと研究しなきゃですね!
まとめ
以上、GASでGmailの受信トレイに溜まった今日から指定の日数以前のスレッドをアーカイブする方法をお伝えしました。
時限式のトリガーを毎日で仕込んでおけば、放置されている過去のスレッドが勝手にアーカイブされていきます。
これで、溜まりに溜まった受信トレイともおさらばですね!
ちなみに、searchメソッドは1回500スレッドまでしか取得できませんので、それ以上溜まっている場合は何度か実行する必要があると思います。
もし、うっかり大事なメッセージがアーカイブされても、ちゃんと取り戻せますから安心してアーカイブしちゃってくださいませ!