0
2

More than 3 years have passed since last update.

【GAS】【Gmail】特定のメールを取得してSpreadsheetに抽出する

Posted at

はじめに

これまでは、GASでSpreadsheetを操作することについて触れてきました。
1.特定のスプレッドシートを取得する
2.特定のシートを取得する
3.特定のセルを取得する
4.特定のセルに値を入力・削除をする

基本的な操作は理解できたので、これからはGmail操作について触れていきたいと思います。

Method


GmailApp.serch(検索条件,検索スレッドのインデックス,最大取得数);
//検索結果によって抽出されたスレッドを取得
//最大取得数はmax500

threadObject.getMessages();
//スレッドからメッセージを取得する。

msgObject.getDate();
//メッセージObjectから日付を取得

msgObject.getSubject();
//メッセージオブジェクトから件名を取得

msgObject.getPlainBody();
//メッセージオブジェクトから本文を取得


メールの検索結果のスレッドとメッセージを取得してスプレッドシートに書き込み

Gmailの特定のスレッドを、スプレッドシートに書き込むコードを書いて見ます。


var ss1 = SpreadsheetApp.openById("Spreadsheet-key");
//spreadsheetをss1に格納。 
var sh1 = ss1.getSheetByName("sheet1");
//特定のシート(sheet1)をsh1に格納
var threads = GmailApp.search('subject:テスト');
//gmail.searchによって得られた検索結果のスレッドを全てthreadsに格納
var row = 2; 

for ( var n in threads){
  var thread =  threads[n];
  //threadsから一つのスレッドをthreadに格納
  var msgs = thread.getMessages();
  //threadからmessageを取得しmsgsに全て格納

    for(var m in msgs){
     var msg =  msgs[m];
     //msgにmsgsの[m]番目を格納

     var date = msg.getDate();
     //msgから日付を取得しdateに格納

     var subject = msg.getSubject();
     //msgから件名を取得しsubjectに格納

     var subject = msg.getBody();
     //msgから本文を取得しbodyに格納

     sh1.getRange(row,1).setValue(date);
     //dateをシート(row,1)にセット

     sh1.getRange(row,2).setValue(subject);
     //subjectをシート(row,2)にセット

     sh1.getRange(row,3).setValue(body);
     //bodyをシート(row,3)にセット
   
     sh1.getRange(row,4).msg.getId();

     row++;
     //行数カウント
    }
  }

メールはスレッドとメッセージの関係性

メールはスレッドというグループがあり、その中にメッセージが存在します。
例えば、以下のような形です。

1.ある人Aさんが新規メールでご相談メールをBさんに送りました。
2.BさんはAさんからのメールを確認し、[返信]でメールを返しました。
3.さらにBさんからの返信を見たAさんは、そのメールに対して[返信]でメールを返しました。

上記の場合、スレッド、メールの関係性で表すと以下のようになります。

スレッド1
 ・メッセージ1 AさんからBさんへのメール
 ・メッセージ2 Bさんから→Aさんへの返信メール
 ・メッセージ3 Aさんから→Bさんへの返信メール

これが仮に、メッセージ2で、Bさんが返信ではなく、新規でAさんにメールを送信した場合、
それはスレッド1のメッセージ2ではなく、新たなスレッドのメッセージ1になります。

上記の構造上、メールからはスレッドをまず取得し、その中のメッセージを取得する必要があります。
詳しい情報は、こちらを参考にするといいかと思います。

for ( var n in threads){
  var thread =  threads[n];
  //threadsから一つのスレッドをthreadに格納
  var msgs = thread.getMessages();
  //threadからmessageを取得しmsgsに全て格納

    for(var m in msgs){
     var msg =  msgs[m];
     //msgにmsgsの[m]番目を格納

一番初めのfor文で、スレッドを一つずつ取得する動きをしています。
二番目のfor文で、メッセージを一つずつ取得する動きをしています。

メッセージから日付、タイトル、本文を取得

メッセージを取得したら、メッセージ内にある日付、件名、本文を取得してそれぞれのオブジェクトに
入れる作業が以下となっています。

     var msg =  msgs[m];
     //msgにmsgsの[m]番目を格納
     var date = msg.getDate();
     //msgから日付を取得しdateに格納
     var subject = msg.getSubject();
     //msgから件名を取得しsubjectに格納
     var subject = msg.getPlainBody();
     //msgから本文を取得しbodyに格納

それぞれオブジェクトに格納できたら、各行のシートに反映させます。


 sh1.getRange(row,1).setValue(date);
     //dateをシート(row,1)にセット

     sh1.getRange(row,2).setValue(subject);
     //subjectをシート(row,2)にセット

     sh1.getRange(row,3).setValue(body);
     //bodyをシート(row,3)にセット
   
     sh1.getRange(row,4).msg.getId();

最後に

今回はGmailから特定のメールをSpreadsheetに抽出することを描いて見ました。
次回は、本格的に私が作った、ホームページからの問い合わせをSpreadsheetに集約する
物を題材に書いてみようと思います。

参考
GoogleAppsScriptでいろいろな条件を指定してメールを取得する

【GAS】Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出す

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2