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

#はじめに
これまでは、GASでSpreadsheetを操作することについて触れてきました。
[1.特定のスプレッドシートを取得する](https://qiita.com/ryoichi_ben/items/5a1d8c35112dfb015799)
[2.特定のシートを取得する](https://qiita.com/ryoichi_ben/items/f31781a400a10b6a5459)
[3.特定のセルを取得する](https://qiita.com/ryoichi_ben/items/8792484419b740b91ab7)
[4.特定のセルに値を入力・削除をする](https://qiita.com/ryoichi_ben/items/0bc9898a4c4a295aaebb)

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

#Method

```javascript

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

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

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

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

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


```

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

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


```javascript

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 AさんからBさんへのメール
　・メッセージ2 Bさんから→Aさんへの返信メール
　・メッセージ3 Aさんから→Bさんへの返信メール

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

上記の構造上、メールからはスレッドをまず取得し、その中のメッセージを取得する必要があります。
詳しい情報は、[こちら](https://tonari-it.com/gas-gmail-get-thread/)を参考にするといいかと思います。

```javascript
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文で、メッセージを一つずつ取得する動きをしています。

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

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

```javascript
     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に格納
```

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

```javascript

 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でいろいろな条件を指定してメールを取得する](https://qiita.com/akatsuki174/items/d7471760754829ced7df)

[【GAS】Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出す]
(https://tonari-it.com/gas-gmail-get-thread/)