Gmailの中から必要なものを検索し、取り出して処理するために、前回、GmailApp.searchというメソッドの使い方について説明をしました。このsearchメソッドでは、もっとさまざまな検索が行えるようになっています。今回は、そうした特殊な検索について説明しましょう。

カテゴリの検索

まずは、「カテゴリの検索」からです。本連載の第5回で、特定のラベルのスレッドを取り出すことを行いました。このとき、Gmailに用意されている「新着」「ソーシャル」「プロモーション」「フォーラム」といったものについてもスレッドを取り出そうと試した人もいるのではないでしょうか。

実際にやってみるとわかりますが、getUserLabelByNameでこれらのカテゴリを指定してもメールは取得できません。なぜなら、これらのカテゴリは「ラベル」ではないからです。例えば「新着」のメールは、「新着」というラベルが付けられているわけではありません。

では、カテゴリのメールはどうやって取り出せばいいのか。それは、searchの検索を利用するのです。これらのカテゴリは、「category:〇〇」といった形でカテゴリ名を検索テキストに指定することでスレッドを見つけることができます。用意されているカテゴリは以下のようになります。

category:updates --「新着」カテゴリを表示
category:social --「ソーシャル」カテゴリを表示
category:promotions --「プロモーション」カテゴリを表示
category:forums --「フォーラム」カテゴリを表示

新着カテゴリのスレッドを表示

では、実際の検索例をあげておきましょう。ここでは、「新着」カテゴリのスレッドを表示する例をあげておきます。


function getCategorys(){
  var threads = GmailApp.search('category:updates',0,10);
  threads.forEach(function(value){
    Logger.log(value.getFirstMessageSubject());
  });
}

スクリプトエディタでこれを実行し、「表示」メニューの「ログ」を選んでログ・ダイアログを表示して下さい。「新着」カテゴリのスレッドから、もっとも新しいもののタイトルを最大10個まで表示します。

ここでは、GmailApp.search('category:updates',0,10);というようにして検索しています。'category:updates'と検索テキストを指定することで、「新着」カテゴリのスレッドを取り出していたのです。

  • スクリプトを実行すると、ログのダイアログに「新着」カテゴリのスレッドが最大10個まで表示される。

    スクリプトを実行すると、ログのダイアログに「新着」カテゴリのスレッドが最大10個まで表示される。

特殊なトレイの検索

カテゴリの他にも、Gmailでは特別な役割を持ったトレイがいくつか用意されています。「スター付き」や「下書き」のようなものですね。これらも、決まった形式で検索テキストを用意することでスレッドを取り出せます。以下に検索テキストをまとめておきましょう。

・特定の設定がONのもの
is:starred --スターが付けられているスレッド
is:important --「重要」がつけられているスレッド

・特定のトレイ
in:draft --「下書き」トレイ
in:spam --「迷惑メール」トレイ
in:sent --「送信済み」トレイ
in:snoozed --「スヌーズ中」トレイ

・特定のラベル
label:ラベル名

「Gmail」メニューでカテゴリを表示

では今回も利用例として、Googleスプレッドシートを使って、スレッドタイトルを一覧表示させるスクリプトを作成しましょう。今回は、特定のカテゴリのスレッドを検索し、最大100個までタイトルを出力します。

カテゴリは全部で4つありますから、どのカテゴリを検索するかを指定するインターフェイスが必要になります。今回は「Gmail」というカスタムメニューを追加し、それを使って検索させることにしましょう。スプレッドシートの「ツール」メニューから「スクリプトエディタ」を選んでスクリプトエディタを開き、スクリプトを記述して下さい。


function onOpen(e){
  SpreadsheetApp.getUi()
  .createMenu("Gmail")
  .addItem("新着", "updates")
  .addItem("ソーシャル", "social")
  .addItem("プロモーション", "promotions")
  .addItem("フォーラム", "forums")
  .addToUi();
}}

function updates(){
  showData(GmailApp.search('category:updates',0,100));
}
function social(){
  showData(GmailApp.search('category:social',0,100));
}
function promotions(){
  showData(GmailApp.search('category:promotions',0,100));
}
function forums(){
  showData(GmailApp.search('category:forums',0,100));
}

function showData(threads){
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(1, 1, 100, 1).setValue('');
  var row_count = 1;
  for(var n in threads) {
    sheet.getRange(row_count++, 1).setValue(threads[n].getFirstMessageSubject());
  }
}
}

記述したらスクリプトを保存し、一度スプレッドシートを閉じてから、再度開いて下さい。すると、メニューバーに「Gmail」という項目が追加されます。ここからカテゴリ名を選ぶと、そのカテゴリのスレッドが最大100個までスプレッドシートに書き出されます。なお、実行時には、Gmailとスプレッドシートへのアクセスの承認が必要です。

  • 「Gmail」メニューからカテゴリ名を選ぶと、そのカテゴリのスレッドタイトルが出力される。

カスタムメニューの作成

ここでは、スプレッドシートに「Gmail」というカスタムメニューを追加しています。カスタムメニューは、「createMenu」「addItem」「addToUi」というメニューを連続して呼び出すことで作成できます。


SpreadsheetApp.getUi()
  .createMenu( メニュー名 )
  .addItem( 項目名 , 関数名 )
  ……必要なだけaddItemを用意……
  .addToUi();

addItemは、メニューに表示する項目の数だけ記述します。これで、表示されたメニュー項目を選ぶと、addItemの第2引数で指定した関数が実行されるようになります。

onOpenイベントについて

ここでは、メニューの作成は「onOpen」という関数に記述しています。このonOpenは、スプレッドシートを開いたときに発生するイベントで呼び出される関数です。この関数に処理を記述しておけば、ファイルを開いた際に自動的に実行されます。覚えておくといろいろと役立つ関数でしょう。