検索は「search」を使う

Gmailにある膨大な数のメールの中から特定の物を探し出すには「検索」が必要です。GmailAppオブジェクトには、スレッドを検索するための機能として「search」メソッドが用意されています。

変数 = GmailApp.search( 検索テキスト );
変数 = GmailApp.search( 検索テキスト , 開始位置 , 最大数 );

単純に検索したスレッドをすべて取り出すだけなら、引数に検索するテキストを用意するだけです。ただし、あまりに膨大な数のスレッドが検索されてしまうとスクリプトの処理時間も大変長くなり、取り出したスレッドの扱いも困ってしまうでしょう。

そこで、検索する際に開始位置と取得するスレッドの最大数を合わせて指定するやり方も用意されています。多量の検索がされてしまうことを考えたら、通常は最大数を指定して検索するのが基本といってよいでしょう。

このsearchメソッドで得られるのは、Threadオブジェクトの配列です。ここから、メールのタイトルなどを取り出してスレッドを処理していけばいいでしょう。では、簡単な検索例を挙げておきましょう。


function searchThread(){
  var fstr = "Yahoo!"; // ★検索テキスト
  var threads = GmailApp.search(fstr, 0, 10);
  threads.forEach(function(value){
    Logger.log(value.getFirstMessageSubject());
  });
}
}

ここでは、「Yahoo!」というテキストを含むスレッドを10個検索し、タイトルをログに出力します。★部分の値をいろいろと書き換えて検索してみましょう。

  • スクリプトを実行すると、ログダイアログに「Yahoo!」というテキストを含むスレッドのタイトルを最大10個まで出力する

検索スレッドをスプレッドシートに書き出す

検索となると、「決まった処理を実行するだけ」というのでなく、もっとインタラクティブな操作が必要になってくるでしょう。例えば、実行すると検索テキストを尋ね、それを入力するとメールを検索する、といった具合です。

前回、前々回と、取得した情報をGoogleスプレッドシートに書き出す処理を作りました。Googleスプレッドシートでは、Gppgle Apps Scriptでアラートやダイアログを表示し、ユーザーに入力してもらうことができます。これを利用して、簡単なメール検索のスクリプトを作成してみましょう。

これは、Googleスプレッドシートのスクリプトとして記述をします。スプレッドシートを開き、「ツール」メニューの「スクリプトエディタ」を選んで記述をして下さい。


function getSearch(){
  var ui = SpreadsheetApp.getUi();
  var response = ui.prompt('検索テキストを入力:');
  if (response.getSelectedButton() == ui.Button.OK) {
    var sheet = SpreadsheetApp.getActiveSheet();
    sheet.getRange(1, 1, 100, 1).setValue('');
    var threads = GmailApp.search(response.getResponseText(),0,100);
    var row_count = 1;
    for(var n in threads) {
      sheet.getRange(row_count++, 1).setValue(threads[n].getFirstMessageSubject());
    }
  }
}

このgetSearchをスクリプトエディタから実行したら、すぐにスプレッドシートに表示を切り替えて下さい。するとシート上に、検索テキストを入力するダイアログが現れます。ここでテキストを記入しOKすると、Gmailからテキストを検索し、最新のスレッドのタイトルを最大100個までスプレッドシートに書き出します。

  • スクリプトを実行すると、スプレッドシートにダイアログが現れる

  • 検索テキストを入力しOKすると、テキストを含むスレッドのタイトルを出力する

ダイアログの使い方について

ここでは、スプレッドシートにダイアログを呼び出し、検索テキストを入力しています。こうした簡単なアラートやダイアログは、Uiオブジェクトと呼ばれるものとして用意されています。これは以下のような手順で利用します。

Uiオブジェクトの取得
var ui = SpreadsheetApp.getUi();

まず最初に、SpreadsheetAppの「getUi」メソッドで、スプレッドシートの「Ui」オブジェクトを取り出します。Uiオブジェクトは、Googleのサービスごとに用意されており、最初にそのサービスのgetUiメソッドを呼び出してオブジェクトを取り出します。つまり、Uiに対応しているサービス(getUiメソッドが用意されているもの)でなければ、Uiは使えないのです。

入力ダイアログを表示
var response = ui.prompt('検索テキストを入力:');

取得したUiオブジェクトの「prompt」メソッドを呼び出します。これはテキストを入力するフィールドを持ったダイアログを表示するものです。引数にはダイアログに表示するメッセージをテキスト値として用意します。テキストを記入しOKすると、その情報がオブジェクトとして返されます。

選択したボタンをチェック
if (response.getSelectedButton() == ui.Button.OK) {……

オブジェクトが返された(すなわち、ダイアログが閉じられた)後、最初に行うのは、「OK」ボタンが押されたかどうかをチェックすることです。ダイアログは、必ずしもOKボタンを押して閉じる場合ばかりではありません。ダイアログのクローズボックスをクリックして閉じたりすることもあります。

選択したボタンは、promptで返されたオブジェクト(response)の「getSelectedButton」メソッドで得ることができます。これが、ui.Button.OKならば、OKボタンが押されたと確認できます。

入力されたテキストを取得
var threads = GmailApp.search(response.getResponseText(),0,100);

ダイアログに入力したテキストを取り出すには、responseオブジェクトの「getResponseText」メソッドを呼び出します。ここでは、この値をGmailApp.searchの引数に指定して検索を行っていたのです。

このpromptによるテキスト入力ダイアログはいろいろと応用のできる機能です。これはスプレッドシート(SpreadsheetApp)だけでなく、Googleドキュメント(DocumentApp)やGoogleフォーム(FormApp)、Googleスライド(SlidesApp)でも利用することができます。ここでぜひ基本的な使い方を覚えておきましょう。