[GAS] Gmailの特定の文字以降を取得しスプレッドシートへ貼付け

今回は、Gmailで受信したメールの特定の件名と文字を検索して、スプレッドシートに書き出し、AVERAGE関数/フィルタを設定するまでやってみました。
（ピボットとグラフは手作業で設定。）

完成イメージ：
![0301.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1659133/00cdd1d1-8c1b-b8c7-fb50-502f34df43b5.gif)

画像のような感じで、自分宛に4通メールを送って、それを下のコードで実行してみてください。

![0301.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1659133/31f6b4c9-ceef-0338-71e9-bb90216a7430.jpeg)


サンプルメールのコピペは以下からどうぞ。。

```:Gmail件名
0301件名抽出だよ004
```

```:Gmail本文
顧客名：D社

製品満足度：9

価格満足度：5

お客様の声：品質はいいですが、
高いです。

担当者：
鈴木
```

GASのコードは以下です。

```JS:AppsScriptコード
function getGmail2() {
  SpreadsheetApp.getActiveSheet().getRange("A4:F504").clear({ contentsOnly: true, formatOnly: false })
  SpreadsheetApp.getActiveSheet().getRange('D4').activate();
  SpreadsheetApp.getActiveSheet().getRange(1, 4).setValue("Average");
  SpreadsheetApp.getActiveSheet().getRange(1, 5).setValue("Average");
  SpreadsheetApp.getActiveSheet().getRange(2, 4).setFormula('=AVERAGE(D4:D)');
  SpreadsheetApp.getActiveSheet().getRange(2, 5).setFormula('=AVERAGE(E4:E)');


  SpreadsheetApp.getActiveSheet().getRange('D1:E2').setHorizontalAlignment('center');

  SpreadsheetApp.getActiveSheet().getRange("A3:F3").getFilter().remove();
  SpreadsheetApp.getActiveSheet().getRange("A3:F3").createFilter();

  //件名に、「件名抽出だよ」を含むメールを500件検索。501件以上はエラーになる。
  var kenmeiSu = GmailApp.search("件名抽出だよ", 0, 500);
  var honbunSu = GmailApp.getMessagesForThreads(kenmeiSu);
  var gyo = 4;

  for (var i = 0; i < honbunSu.length; i++) {
    for (var j = 0; j < honbunSu[i].length; j++) {
      //getDate()だけだと年月日に加えて時間も入るので、
      //後ろに.to.toLocaleDateString()を付けると年月日だけ表示される。
      var retsuA = kenmeiSu[i].getMessages()[j].getDate().toLocaleDateString();

      var hipparu = honbunSu[i][j].getPlainBody();

      //「顧客名：」と同じ列の「顧客名：」以降の文字を取得
      var kokyaku = new RegExp('顧客名：' + '.*?' + '\r');
      var retsuC = hipparu.match(kokyaku)[0].replace('顧客名：', '').replace('\r', '');

      //「製品満足度：」と同じ列の「製品満足度：」以降の文字を取得
      var seihin = new RegExp('製品満足度：' + '.*?' + '\r');
      var retsuD = hipparu.match(seihin)[0].replace('製品満足度：', '').replace('\r', '');

      //「価格満足度：」と同じ列の「価格満足度：」以降の文字を取得
      var kakaku = new RegExp('価格満足度：' + '.*?' + '\r');
      var retsuE = hipparu.match(kakaku)[0].replace('価格満足度：', '').replace('\r', '');

      //「お客様の声：」から「担当者：」までの複数行間の文字を取得
      var koe = new RegExp('お客様の声：' + '[\\s\\S]*?' + '担当者：');
      var retsuF = hipparu.match(koe)[0].replace('お客様の声：', '').replace('担当者：', '').replace('\r', '');

      //「担当者：」一段下の行の文字を取得
      var tanto = new RegExp('担当者：' + '[\\s\\S]*' + '\r');
      var retsuB = hipparu.match(tanto)[0].replace('担当者：', '');

      SpreadsheetApp.getActiveSheet().getRange(gyo, 1).setValue([retsuA]);
      SpreadsheetApp.getActiveSheet().getRange(gyo, 2).setValue([retsuB]);
      SpreadsheetApp.getActiveSheet().getRange(gyo, 3).setValue([retsuC]);
      SpreadsheetApp.getActiveSheet().getRange(gyo, 4).setValue([retsuD]);
      SpreadsheetApp.getActiveSheet().getRange(gyo, 5).setValue([retsuE]);
      SpreadsheetApp.getActiveSheet().getRange(gyo, 6).setValue([retsuF]);
      gyo++;
      SpreadsheetApp.getActiveSheet().getRange(3, 1).setValue("受信日");
      SpreadsheetApp.getActiveSheet().getRange(3, 2).setValue("担当者");
      SpreadsheetApp.getActiveSheet().getRange(3, 3).setValue("顧客名");
      SpreadsheetApp.getActiveSheet().getRange(3, 4).setValue("製品CS");
      SpreadsheetApp.getActiveSheet().getRange(3, 5).setValue("価格CS");
      SpreadsheetApp.getActiveSheet().getRange(3, 6).setValue("お客様の声");
    }
  }
}
```
なかなかおもしろくなってきました、GAS＆JS🎵

:::note info
正規表現で取り出します。
    ・同じ行にある文字の取得：'特定文字' + '.*?' + '\r'
　・一段下の行の文字を取得：'特定文字' + '[\\s\\S]*' + '\r'
    ・複数行間の文字の取得：'開始文字' + '[\\s\\S]*?' + '終了文字'

:::

参考にしたサイト：

http://www.initialsite.com/w01/13064