どうも。つじけ(tsujikenzo)です。今日は単発で 「Gmail検索にラベル機能を使おう」 をお届けします。
この記事は、#Effective GoogleAppsScriptタグがついております。
今日のアジェンダ
- ラベル機能とは
- ラベルを取得しよう
- ラベルからスレッド配列を取得しよう
- スレッド配列からメッセージ配列を取得しよう
ラベル機能とは
Gmailのラベル機能、みなさん使ったことありますよね。受信メールにラベルをつけて、メールを整理する機能です。
受信メールをポチポチ手動でラベルをつけることも可能ですが、ほとんどの場合、フィルタ機能を使って、ラベル付与作業を自動化します。(フィルタの作成方法は割愛させていただきます。)
このラベル機能を使うことで、Gmail処理のGASが、とてもかんたんになりますので、活用していきましょう。
今回は、メールの件名に「ノンプロ研」というキーワードが入っている受信メールの処理(本文をPDFにする、添付ファイルを保存する、など)を想定します。
受信メールには、3つのスレッドと、それぞれにメッセージが格納されている、という状況でございます。
ラベルを取得しよう
Google Wordspace ServicesのGmailでは、GmailLabelオブジェクトが提供されています。
トップレベルオブジェクトであるGmailAppクラスの、getUserLabelByName()メソッドで、GmailLabelオブジェクトを取得できます。
引数にラベル名を渡して、GmailLabelオブジェクトを変数に格納しましょう。
const labelObject = GmailApp.getUserLabelByName('ノンプロ研');
ラベルからスレッド配列を取得しよう
GmailLabelオブジェクトから、スレッドの配列を取得できます。(スレッドが1つしかないときも配列なので気を付けましょう)
GmailLabelクラスには、getThreads(start, max)メソッドが提供されています。
第1引数のstartで、開始スレッドのインデックス、第2引数のmaxで、最終取得スレッドのインデックスを指定できます。受信メールが多い場合は、スレッドの範囲を指定しないと、毎回すべてのスレッドを取得しますので、処理が重たくなります。
開始スレッドのインデックスは0(1番目)でいいでしょう。最終取得スレッドのインデックスは、10程度でよいでしょう(受信メールの頻度によります)。
取得したスレッド配列を変数に格納しましょう。
const threads = labelObject.getThreads(0, 10);
console.log(threads.length); //3
スレッド配列からメッセージ配列を取得しよう
各スレッドには、メッセージが格納されていましたよね。
なので、GmailThreadオブジェクトから、メッセージの配列を取得できます。(メッセージが1つしかないときも配列です)
GmailThreadクラスには、getMessages()メソッドが提供されています。
取得したメッセージ配列を1次元化して、変数に格納しましょう。
const messages = threads.map(thread => thread.getMessages()).flat();
console.log(messages.length); //6
変数messagesには、ラベルに格納されているメッセージがすべて配列の要素として格納されているので、その後の処理が楽になります。
for (const message of messages) {
console.log(message.getPlainBody());
}
//ノンプロ研で、お忘れ物があるようです。(略)
//まだ持ち主が見つかっていないようです。(略)
//見つかったようです!(略)
//ノンプロ研では新しい講座が始まります。(略)
//下記URLからPDFをダウンロードしてください!(略)
//先ほどのメールに誤りがありました。(略)
まとめ
以上で、「Gmail検索にラベル機能を使おう」をお届けしました。
Gmailのメッセージを処理するときは、スレッドとメッセージが複雑に絡み合い、インデックスでつまづくことが多いです。
threads[0][1]だっけ、message[1]だっけ、という感じですね。
しかしながら、Gmailの処理は、メッセージ単位で行うことがほとんどだと思います。
ラベル機能、ぜひ活用してみてください。
Githubリポジトリ
この記事のコード全文は、GithubにUPしています。