【GAS】Gmailで条件一致した値をスプレッドシートに書き出す


### Gmailで件名やLabelを指定したメールの本文から値を取得しスプレットシートに書き出すGASのコード

#### 目的：特定の受信メールの本文から一部切り取りスプレットシートにまとめたかったため作成


```js
function xdemygetbody() {

  // 検索条件に該当するスレッド一覧を取得
  //件名を検件にする　subject:件名　と　label　がxdemyのメールのスレッドを取得
  //未読を条件に加えたい場合は　「is:unread」を追加　よく使う
  var threads = GmailApp.search('subject:xxx.xdemy.comでの学びに招待されています。 label:xdemy',0,10);

  // スレッドを一つずつ取り出す
  threads.forEach(function(thread) {

    // スレッド内のメール一覧を取得
    var messages = thread.getMessages();
    
    //messageを一つずつ取り出す
    messages.forEach(function(message) {
      // メール本文を取得
      var plainBody = message.getPlainBody();
      console.log(plainBody);
      
      //メール本文から取得したい値をsplitで抽出し変数　udlik　に代入
      //「ライセンスを申請:」　の後ろから改行前「'\r\n'」までが取得したいURLになる
      const udlik = plainBody.split('ライセンスを申請: ')[1].split('\r\n')[0];


      // メッセージの送信元を取得する場合
      //var name = message.getFrom();
      
      // メッセージの宛先を取り出す
      var email = message.getTo();

      //メッセージを既読にする場合
      //GmailApp.markThreadsRead(message);
      // message.markRead();

      
      // 書き込むスプレッドシートのシート名を指定し情報を取得　
      var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
      
      // 最終行を取得
      var lastRow = sheet.getLastRow() + 1;
      
      // セル情報を取得して値をスプレッドシートに追記
      //今回は　email　と　udlik
      // sheet.getRange(lastRow, 3).setValue(plainBody);
      //sheet.getRange(lastRow, 2).setValue(name);
      sheet.getRange(lastRow, 1).setValue(email);
      sheet.getRange(lastRow, 2).setValue(udlik);
    });
    
  });
}
```
## GASの説明

- Gmailで検索条件に一致したスレッドを変数　threads　に代入する
   
  ```
  var threads = GmailApp.search('subject:xxx.udemy.comでの学びに招待されています。 label:Udemy',0,10);
  ```
   - GmailApp.search(検索条件,開始位置,最大取得数)で検索する

   - 検索内容を　'　'　シングルコーテーションで囲む
      - subject:件名　　※件名を指定する
      - label:ラベル名  ※ラベル名を指定する
      - is:unread　　　 ※未読を指定する
   - 複数の検索条件は半角スペースでつなげる
   - 開始位置　　開始するスレッドのインデックス　基本0
   - 最大取得数　最大いくつのスレッドを取得するか指定する　例では10
   <br>

- forEachでthreadsからスレッドを一つずつ取り出す

  ```
  threads.forEach(function(thread) {
  ```
  <br>

- スレッド内のメッセージを取得し変数messages　に代入する
  ```
  var messages = thread.getMessages();
  ``` 
  <br>

- forEachでmessagesからメッセージを一つずつ取り出す
  ```
  messages.forEach(function(message) {
  ```
　<br>

- messageから本文を取得し変数plainBodyに代入する
  ```
  var plainBody = message.getPlainBody();
  ```
  <br>

- メール本文から取得したい値を取得し変数udlikに代入する
  ``` 
  const udlik = plainBody.split('ライセンスを申請: ')[1] .split('\r\n')[0];  
  ```

  - plainBody.split('ライセンスを申請: ')[1].

  - ほしい値は本文の「ライセンスを申請:」　の後ろから改行前「'\r\n'」までを取得したい
    - ```plainBody.split('ライセンスを申請: ')[1]```
    - splitで[ライセンスを申請:]の後の文字列を取得し
    - ```.split('\r\n')[0];```
    - splitで改行前をの値を取得
  - 値を変数udlik　に代入する
  <br>

- メッセージの宛先を取り出し変数emailに代入する
  ```
  var email = message.getTo();  
  ```
<br>

- 書き込むスプレッドシート情報を取得し変数sheetに代入する
  ```
  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
  ```
  - シート名を指定する　今回作成したのは「シート1」というシート名
  - ```SpreadsheetApp.getActive()```
  - アクティブになっているスプレッドシートを選択し
  - ```.getSheetByName('udemy')```
  - シート名がudemyのシート情報を取得する

<br>

- 最終行を取得し次の行に値を追加したいため1足し変数lastRowに代入する
  ```
  var lastRow = sheet.getLastRow() + 1;
  ```
<br>

- シートのA列最終行の下に変数　email　を追記する
  ```
  sheet.getRange(lastRow, 1).setValue(email);
  ```
<br>

- シートのB列最終行の下に変数　udlik　を追記する
  ``` 
  sheet.getRange(lastRow, 2).setValue(udlik);
  ```
　　

## スプレットシートにGmailから抽出した内容が書き出される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640876/6c7ee906-d3e7-2627-1a1e-647db11cc89c.png)