こんにちは。キャスレーコンサルティング LS(リーディング・サービス)部 鈴木です。

今回は、Gmailで受信したメールを、スプレッドシートに取り込む方法をご紹介します。
メールを一覧化したい時、メールの統計をとりたい時などにとても便利ですよ。

私は、プログラミングに関しては基礎を習った程度の初級者なので、
「Gmailから、スプレッドシートへのアプリケーションを跨ったスクリプト」
などと聞くと、とても敷居高く感じてしまいます。

そんな方でも取っ付きやすいよう、シンプルな内容にまとめました。

1.はじめに

今回作るスクリプトは、スクリプト単体で作成するのではなく、
スプレッドシートに紐づいたスクリプトとして作成します。

過去のブログで紹介しているので、参考にどうぞ。
Google Apps Script入門
(3.②組み込みスクリプトファイルの作成)

2.スクリプト

概要

はじめに、スクリプトの全体像を載せておきます。
たったのこれだけです! 10行です!

var sheet = SpreadsheetApp.getActiveSheet();
var threads = GmailApp.search('from:sample@test.co.jp subject:"【サンプル】"');
for(var i=0; i<threads.length; i++){
  var thread = threads[i];
  var mails = thread.getMessages();
  for(var j=0; j<mails.length; j++){
    var mail = mails[j];
    sheet.appendRow([mail.getDate(), mail.getSubject(), mail.getBody()]);
  }
}

スクリプトは、大まかに以下の流れになっています。

 ①スプレッドシートのシートを指定する
 ②Gmailからメールを検索する
 ③検索にヒットしたメールの中から、1つのメールを取り出す
 ④指定したシートに転記する

以降で、詳細を順に説明していきます。

①スプレッドシートのシートを指定する

メールを取り込むにあたり、どのシートに取込かを指定する必要があります。
指定する方法はいくつか種類がありますが、ここでは、
「現在開いているシート」というシンプルな方法で指定しています。

//現在開いているシートを指定します。
var sheet = SpreadsheetApp.getActiveSheet();

指定したシートは後で使うので、とりあえずここでは定義するだけになります。

②Gmailからメールを検索する

転記したいメールを検索します。
検索条件は、Gmail画面でメールを検索する時と同じように記述します。
検索対象は、現在ログインしているGoogleアカウントのメールボックスになります。

//Gmailのメールを検索して配列で取得します。(threads[0], threads[1], …)
var threads = GmailApp.search('from:sample@test.co.jp subject:"【サンプル】"');

この例では、差出人が「sample@test.co.jp」で、件名に「【サンプル】」
というワードが含まれるメールがヒットします。

検索結果は、スレッド単位で配列の形で取得されています。
「メール単位」ではなく、「スレッド単位」なのでご注意ください。

③検索にヒットしたメールの中から、1つのメールを取り出す

シートに取り込むために、検索結果をスレッド単位からメール単位に分割します。

//検索にヒットしたスレッドの数だけ繰り返します。
for(var i=0; i<threads.length; i++){
  
  //スレッド1つを取得します。
  var thread = threads[i];
  
  //スレッドの中の複数のメールを配列で取得します。(mails[0], mails[1], …)
  var mails = thread.getMessages();
  
  //メールの数だけ繰り返します。
  for(var j=0; j<mails.length; j++){
    
    //メール1つを取得します。
    var mail = mails[j];

処理がいくつも出てきて少しわかりにくいですが、下図のような処理をしています。

④指定したシートに転記する。

1つのメールが取得できたら、あとはメールの情報をスプレッドシートに転記するだけです。
この例では、「受信日時」「件名」「本文」を転記しています。

    //最下行に出力します。
    sheet.appendRow([mail.getDate(), mail.getSubject(), mail.getBody()]);

出力結果は以下のようになります。

4通のメールが取り込まれました。
A列が受信日時、B列が件名、C列が本文です。
また、2行目と3行目のメールは、1つのスレッドになっています。

終わりに

以上になりますが、いかがでしたか?
少しでも取っ付きやすさを感じてもらえていたら幸いです。

今回は、基本的な部分のみに絞った内容にしているので、
実戦でに使用するためには、色々と処理を追加していく必要があります。

・一度取り込んだメールは、次回から取り込まない
・本文の中の特定の部分のみを取り込む
 などなど。

機会があれば、また執筆したいと思います。
最後までお読み下さり、ありがとうございました!

鈴木 翼
CSVIT事業部 LS(リーディング・サービス)部 鈴木 翼
入社4年目で、主に運用保守業務に携わってきました。業務効率化のためにメールの取り込みスクリプトを作成する機会があり、その経験を元にブログを書いています。