見出し画像

【GAS入門③】Gmailで特定の範囲の文字列を抽出する方法(改行を含む)

今回のnoteでは、Gmailで特定の範囲の文字列を抽出する方法について
まとめます。

改行を含む文字列の抽出について、
どのように実装すれば良いか悩んでいる方もいると思うので、
ぜひ参考にしていただけたら幸いです。


前回のおさらい

前回のnoteでは、Gmailに届いたメールをSlackに自動で送信するための方法について見てきました。

Slackを使っている方にとって、
Gmailも確認しないといけないのは面倒ですよね。

そこで、Gmailに特定の件名のメールが届いたら、それをSlackに自動で送信するところまでを実装しました。


改善したいところ

しかし、1つだけ改善したいところがあります。

それは、
Slackに送信した本文の内容が長すぎて、見にくい
という点です。

本当に必要な部分は、
・テスターのメールアドレス
・UDID

の部分だけです。


そこで今回は、

文章の中から特定の範囲の文字列を抽出してSlackに送信する

ことをゴールにしましょう。


実際のコード

function getGmail() {
  const query = 'in:inbox subject:(新しいデバイスが登録されました)';
  const gmailThread = GmailApp.search(query, 0,10);
  const gmailMessage =  GmailApp.getMessagesForThreads(gmailThread);

  for(const message of gmailMessage) {
    for(const mail of message) {
      const body = mail.getPlainBody();
      const regexp = RegExp( /以下をご覧ください。[\s\S]*?デバイスを追加しましょう/);
      const result = body.match(regexp)[0].replace('以下をご覧ください。', '');
      console.log(result);
      sendMessageToSlack(`${result}🔥\nApple developerリンク: https://developer.apple.com/account/resources/devices/add`);
    }
  }
}

function sendMessageToSlack(text) {
  var slackUrl = 'Incoming Webhookで取得したURL';
  var username = '通知bot';
  var icon_emoji = ':ghost:';

  var payload = {
    'username': username,
    'text': text,
    'icon_emoji':icon_emoji
  };

  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };

  UrlFetchApp.fetch(slackUrl, options);
  console.log('Slackに通知を送信しました!');
}


ポイント解説

今回のポイントとなるコードは、以下の部分です。

      const regexp = RegExp( /以下をご覧ください。[\s\S]*?デバイスを追加しましょう/);
      const result = body.match(regexp)[0].replace('以下をご覧ください。', '');

特定の文字列を抽出するためにRegExp()をしています。
その後、replace()によって文字を置換していますね。

これらが何をしているのか、それぞれ詳しく見ていきましょう。

①RegExp()の内容について

      const regexp = RegExp( /以下をご覧ください。[\s\S]*?デバイスを追加しましょう/);

まず、このRegExp()では抽出したい文字列の範囲を指定しています。
画像で示すと以下の範囲です。

「以下をご覧ください。」〜「デバイスを追加しましょう」までですね。

そして、もう一つ重要になるのが、抽出したい文字列の範囲内に、
改行が含まれている場合はどうするか?ということです。

上記の画像を見ていただければ分かる通り、
テスターやUDIDの部分で改行されています。

この問題を解決してくれるのが [\s\S] という正規表現です。

これを使うことによって、改行を含んでいても「AからBまで」の
特定の文字列を抽出することができるようになります。

ちなみに、*?を付け忘れるとスクリプト実行時にエラーになります。

そのため、改行を含む特定の範囲の文字列を抽出したい場合は、

[\s\S]*?

をセットで使うようにしましょう👍

①replace()の内容について

 const result = body.match(regexp)[0].replace('以下をご覧ください。', '');

続いて、replace()について見ていきましょう。

replace()は文字を置換したいときに使用するメソッドです。

replace('元の文字',"置換したい文字")

今回の例では、
「以下をご覧ください。」の文字列はSlackに送る必要がないため、
置換したい文字に、空文字を表す「''」を入れています。

replace('以下をご覧ください。', '')

以上を踏まえて、スクリプトを実行してみましょう!
すると、Slackではこのように表示されます。

Slackへの送信内容がスッキリしましたね🎉

これで、改行を含む特定の範囲の文字列を抽出することができました。


まとめ

いかがでしたでしょうか?

正規表現や文字列置換などを組み合わせることによって、
Gmailから取得した内容を自由自在に操ることができるようになりました。

GASには他にも色々なカスタマイズ方法があるので、
ぜひ便利な仕組みを構築していきましょう👍

それでは!

いいなと思ったら応援しよう!