hetare
@hetare

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GASでGmail文面のURLをすべて抽出したいです。

解決したいこと

GASでGmail文面のURLをすべて抽出したいです。
いろんなものを参考にしながらコードを作ったのですが、それで実行すると文面にいくつかあるURLのうち最初のひとつしか抽出できないようです。すべて抽出するにはどのような書き方にしたらよいでしょうか。

発生している問題・エラー

メール一覧です。下記のように8通メールがあります。
image.png

例えばひとつメールを開くと、下記のようにいくつもURLが記載されています。
このなかでいうとはじめの https://dietnavi.com/ ではなく、
ふたつめの  https://dietnavi.com/click.php?cid=50398&id=3378685&sec=5730e09c 
のほうを抽出したいのですが…
image.png

下記のように各メールにつき最初の1つめのURLしか抽出できていないようです。
これを各メールすべてのURLを抽出できるようにしたいのですが…
image.png

該当するソースコード

function getMessage() {
  var condition = 'label:point';
  var start = 0;
  var max = 500;
  var threads = GmailApp.search(condition, start, max);
  var messages = GmailApp.getMessagesForThreads(threads);

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('URL');

  var firstRow = 2;

  messages.forEach(function(message){
    var body = message[0].getPlainBody(); 

    var URL = body.match(/(https?:\/\/[\w!?\/+_~=;.,*&@#$%()'[\]-]+)/m)[0];

    var data = [URL];

    sheet.getRange(firstRow, 1, 1, data.length).setValues([data]);

    firstRow++;
  }); 

どなたかご教授いただけますと幸いです。

0

1Answer

正規表現オブジェクトにgフラグを付けることで、すべての一致を探します。
gフラグが付いていないと最初の一致だけを探します。

matchの返り値は、gフラグを付けた場合と付けていない場合で異なります。
gフラグを付けた場合の返り値はすべての一致の配列になります。

var URLs = body.match(/(https?:\/\/[\w!?\/+_~=;.,*&@#$%()'[\]-]+)/g);
URLs.forEach(URL => console.log(URL));
1Like

Comments

  1. @hetare

    Questioner

    お教えくださりありがとうございます!
    正規表現を理解しないままいろいろ調べたものを継ぎはぎしてました。大事な情報ありがとうございます。

    お教えいただいた内容を実行しました。実行ログを見ると多くのURLを抽出できているのでできたようなのですが、初歩的でお恥ずかしい限りなのですがそれをスプレッドシートに書き出すのがまだうまくいかないです。できたらお教えいただけたら幸いです。


    messages.forEach(function(message){
    var body = message[0].getPlainBody();


    var URLs = body.match(/(https?:\/\/[\w!?\/+_~=;.,*&@#$%()'[\]-]+)/g);
    URLs.forEach(URL => console.log(URL));

    var data = [URLs];

    sheet.getRange(firstRow, 1, 1, data.length).setValues([data]);

    firstRow++;
    });
    }

  2. 実装されたい仕様の詳細がわからないのですが、勘で…

    messages.forEach(function(message){
    const body = message[0].getPlainBody();
    const URLs = body.match(/(https?:\/\/[\w!?\/+_~=;.,*&@#$%()'[\]-]+)/g);
    sheet.getRange(firstRow, 1, 1, URLs.length).setValues([URLs]);
    firstRow++;
    }
  3. @hetare

    Questioner

    ありがとうございます!

Your answer might help someone💌