おじさんのブログ

おじさんになってからPython、GAS、SEOなどを学習した内容をアウトプットするブログです。

GASでGmailからスプレッドシートへ文面を抽出するのに参考にした記事

GASを使ってGmailから特定のメールを選出し、欲しい文面を出力できるようになるまでに参考にした記事のリスト。やはりほぼコピペになったが、カラムごとに欲しい箇所を抽出するのに正規表現を用いる必要がありそこが今回の学びだった。

今回参考にさせていただいたGASのコードの記事

Gmailで受信した情報をGoogleAppsScriptで抽出してGoogle Spreadsheetに転記する - Qiita

[Google Apps Script]メール情報をスプレッドシートに書き出す | Developers.IO

今回は過去のメール群から欲しい文面をある程度の数を単発で集められて、分析ができればよかったので、こちらのコードに助けられました。 ただ、自分がやりたかったことを実現するために、「文面を丸ごと取り出す→正規表現で条件を満たすテキストを抽出し変数に入れる」というやり方になってしまったが、何度もテキスト丸ごとを取り出すのは明らかに無駄なので、なんとかしたい…。

正規表現の書き方で参考にさせていただいた記事

正規表現の例文-複数行にまたがる処理 - Qiita

正規表現自体は普段の業務でスプレッドシートへちょろっと書くぐらいだったので、普通に書くと1行単位で検索されてしまうということを知らなかった…。今回はメール本文から【お問い合わせ内容】のような複数行にまたがるテキストを持ってくる必要があり、かなりつまづいてしまった。

[\s\S]*?

これは今後も使うはずなので覚えておこう。

ストレイライトエンジニア: 正規表現で特定の文字より前/特定の文字より後を抜き出す

(?<=あ)(.)  →「あ」よりあとを抜き出す (.)(?=あ)  →「あ」よりまえをぬきだす

【お問い合わせ日時】 2020/03/11

【お問い合わせ内容】 ホゲホゲ。 フガフガ。 . . . のようなメール文面なので、見出しに対応したテキストを取得したかったため、この書き方がやりたいことずばりだった。

最終的なコード(ほぼ完全コピペ)

function fetchContactMail() {
  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = '***';
  var myThreads = GmailApp.search(strTerms, 0, 500); //条件にマッチしたスレッドを取得
  var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納
  var valMsgs = [];
  /* 各メールから日時、送信元、件名、内容を取り出す*/
  for(var i = 0;i < myMsgs.length;i++){
  valMsgs[i] = [];
  valMsgs[i][0] = myMsgs[i][0].getDate();
  valMsgs[i][1] = myMsgs[i][0].getPlainBody().slice(0,3000).match(  /(?<=【hanamogera】)[\s\S]*?(.*)(?=【)/);  // メール本文の中から特定のワードの前後を正規表現で抜き出す(以下、同様)
  valMsgs[i][2] = myMsgs[i][0].getPlainBody().slice(0,3000).match(  /(?<=【hoge】)[\s\S]*?(.*)(?=【)/);
  valMsgs[i][3] = myMsgs[i][0].getPlainBody().slice(0,3000).match(  /(?<=【fuga】)[\s\S]*?(.*)(?=piyo)/);
  valMsgs[i][4] = myMsgs[i][0].getPlainBody().slice(0,3000).match(  /(?<=【foo】)[\s\S]*?(.*)(?=【)/);
  valMsgs[i][5] = myMsgs[i][0].getPlainBody().slice(0,3000).match(  /(?<=\[bar\])[\s\S]*?(.*)(?=\[1\])/);
  valMsgs[i][6] = myThreads[i].getPermalink();
 } 
  /* スプレッドシートに出力 */
 if(myMsgs.length>0){
    var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール'); //シートを取得
    var maxRow = mySheet.getDataRange().getLastRow(); //シートの使用範囲のうち最終行を取得
    mySheet.getRange(maxRow+1, 1, i, 7).setValues(valMsgs); //シートに取得したメッセージのデータを追加
  }
}