質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

918閲覧

【GAS】Gmail本文に複数あるURLを抽出したい

nanao06

総合スコア4

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2024/02/14 12:11

編集2024/02/14 12:12

実現したいこと

いつもお世話になっております。
今回、Gmailの内容をスプレッドシートに転記することはできたのですが、
Gmailの本文に複数含まれているURLをシートに転記したいのですが、
分からないので皆様のお力を貸していただきたいと思います。
お忙しいところ恐縮ですが宜しくお願い致します。

発生している問題・分からないこと

Gmailの本文に複数含まれているURLをシートに転記したい。
スプレッドシートの7列目にURLをセットする。
sheet.getRange(1, 7).setValue('URL');

sheet.getRange(rowNumber, 7).setValue(message.getPlainBody().match(/(https?://[\w!?/+_~=;.,*&@#$%()'[]-]+)/g)); ← これでは複数あるURLの1つしか取得できない。

7列目に複数あるURLを改行して取得したい。

該当のソースコード

GoogleAppsScript

1function exportGmails() { 2 var book = SpreadsheetApp.openById('シートのID'); 3 4 var criteria = 'お知らせ'; 5 var threads = GmailApp.search(criteria); 6 7 var sheet = book.getActiveSheet(); 8 sheet.getRange(1, 1).setValue('日付'); 9 sheet.getRange(1, 2).setValue('宛先'); 10 sheet.getRange(1, 3).setValue('From'); 11 sheet.getRange(1, 4).setValue('ReplyTo'); 12 sheet.getRange(1, 5).setValue('件名'); 13 sheet.getRange(1, 6).setValue('本文'); 14 sheet.getRange(1, 7).setValue('URL'); 15 16 for (var i = 0; i < threads.length; i++) { 17 messages = threads[i].getMessages(); 18 message = messages[0]; 19 console.log(message.getFrom()); 20 rowNumber = i + 2; 21 sheet.getRange(rowNumber, 1).setValue(message.getDate()); 22 sheet.getRange(rowNumber, 2).setValue(message.getTo()); 23 sheet.getRange(rowNumber, 3).setValue(message.getFrom()); 24 sheet.getRange(rowNumber, 4).setValue(message.getReplyTo()); 25 sheet.getRange(rowNumber, 5).setValue(message.getSubject()); 26 sheet.getRange(rowNumber, 6).setValue(message.getPlainBody()); 27 sheet.getRange(rowNumber, 7).setValue(message.getPlainBody().match(/(https?:\/\/[\w!?\/+_~=;.,*&@#$%()'[\]-]+)/g)); 28 29 } 30} 31

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

sheet.getRange(rowNumber, 7).setValue(message.getPlainBody().match(/(https?://[\w!?/+_~=;.,*&@#$%()'[]-]+)/g)); ← これでは複数あるURLの1つしか取得できない。

7列目に複数あるURLを改行して取得したい。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2024/02/14 13:10

matchの戻り値はArrayですから変数で受けて複数の結果が返ってきているか確認してみてはどうですか?
nanao06

2024/02/14 15:18

YAmaGNZ様 夜分遅く失礼致します。 ご返信ありがとうございます。 どうやって確認するか教えてください。よろしくお願いいたします。
YAmaGNZ

2024/02/14 15:30

let urls = message.getPlainBody().match(/(https?:\/\/[\w!?\/+_~=;.,*&@#$%()'[\]-]+)/g); console.log(urls); みたいにログ出力するなりしてはどうですか? また複数出力するならsetValuesじゃないですか?
nanao06

2024/02/14 17:19

YAmaGNZ様 ありがとうございます!参考にします!
YellowGreen

2024/02/15 05:33 編集

sheet.getRange(rowNumber, 7).setValue(message.getPlainBody().match(/(https?:\/\/[\w!?\/+_~=;.,*&@#$%()'[\]-]+)/g).join('\n')); として 一つのセルにすべてのURLが文字列(リンクではない)として挿入されるのは、 希望の動作でなないのですね。 上記のままではURLがないメールがあるとエラーになりますので、 その場合は、 var values = message.getPlainBody().match(/(https?:\/\/[\w!?\/+_~=;.,*&@#$%()'[\]-]+)/g); if (values) { sheet.getRange(rowNumber, 7).setValue(values.join('\n')); } とします。 なお、 URLをリンクとしてセルに記入するバージョンを 回答欄に記入しますね。
nanao06

2024/02/15 03:47

YellowGreen様 こんにちは!初めまして! お忙しい中手を止めていただきましてありがとうございます。 ソースありがとうございます! 今勤務中ですので帰宅してすぐ確認します! ありがとうございます。 引き続きよろしくお願いいたします。
guest

回答1

0

ベストアンサー

URLを正規表現で取得して、セルにリンク付きで記入するバージョンです。
なお、リンク付きのリッチテキストの処理が加わる分コードが長くなるので、
セルへの記入をできるだけ一括処理にまとめ、
GASなので変数宣言をconst letにしました。

URLをG列のセルに記入することがご希望と思われるので
そのようにしましたが、
少し変更すると、本文のF列のURLをリンクにすることもできます。

JavaScript

1// URLをセルにリンク付きで記入するバージョン 2function exportGmails() { 3 // メールを検索する条件 4 const criteria = 'URLの送信テスト'; 5 6 // URLを抽出する正規表現 7 var regExp = new RegExp('(https?:\\/\\/[\\w!?\\/+_~=;.,*&@#$%()\'[\\]-]+)', 'gm'); 8 9 // シートを取得してタイトルを記入 10 const book = SpreadsheetApp.openById('シートのID'); 11 const titles = ['日付', '宛先', 'From', 'ReplyTo', '件名', '本文', 'URL']; 12 const sheet = book.getActiveSheet(); 13 sheet.getRange(1, 1, 1, 7).setValues([titles]); 14 15 // メールごとに繰り返し処理 16 const threads = GmailApp.search(criteria); 17 for (var i = 0; i < threads.length; i++) { 18 const messages = threads[i].getMessages(); 19 const message = messages[0]; 20 console.log(message.getFrom()); 21 const rowNumber = i + 2; // タイトル行を考慮 22 // 日付から本文までを記入 23 sheet.getRange(rowNumber, 1, 1, 6).setValues([[ 24 message.getDate(), 25 message.getTo(), 26 message.getFrom(), 27 message.getReplyTo(), 28 message.getSubject(), 29 message.getPlainBody(), 30 ]]); 31 // URLをリンク付きで記入 32 const values = message.getPlainBody() 33 .match(regExp); // 本文からURLをすべて抽出 34 if (values) { // URLがあったとき 35 const urls = values.join('\n'); 36 const richText = SpreadsheetApp.newRichTextValue() 37 .setText(urls); 38 const match = urls.matchAll(regExp); // 抽出した文字列内の各URLと出現位置を検出 39 for (const m of match) { // 一致したURLごとに繰り返し 40 const url = m[0]; // URLの文字列 41 const position = m.index; // URLの開始位置 42 richText.setLinkUrl( 43 position, 44 position + url.length, // URLの終了の次の位置 45 url 46 ); 47 } 48 // 生成したリンク付きのリッチテキストをセルに記入 49 sheet.getRange(rowNumber, 7).setRichTextValue(richText.build()); 50 } 51 } 52}

次のコードは、
本文のURLをリンクにするバージョンです。

JavaScript

1// 本文のURLをリンク付きで記入するバージョン 2function exportGmails() { 3 // メールを検索する条件 4 const criteria = 'URLの送信テスト'; 5 6 // URLを抽出する正規表現 7 var regExp = new RegExp('(https?:\\/\\/[\\w!?\\/+_~=;.,*&@#$%()\'[\\]-]+)', 'gm'); 8 9 // シートを取得してタイトルを記入 10 const book = SpreadsheetApp.openById('シートのID'); 11 const titles = ['日付', '宛先', 'From', 'ReplyTo', '件名', '本文']; 12 const sheet = book.getActiveSheet(); 13 sheet.getRange(1, 1, 1, 6).setValues([titles]); 14 15 // メールごとに繰り返し処理 16 const threads = GmailApp.search(criteria); 17 for (var i = 0; i < threads.length; i++) { 18 const messages = threads[i].getMessages(); 19 const message = messages[0]; 20 console.log(message.getFrom()); 21 const rowNumber = i + 2; // タイトル行を考慮 22 // 日付から題名までを記入 23 sheet.getRange(rowNumber, 1, 1, 5).setValues([[ 24 message.getDate(), 25 message.getTo(), 26 message.getFrom(), 27 message.getReplyTo(), 28 message.getSubject(), 29 ]]); 30 // URLをリンク付きで記入 31 const body = message.getPlainBody(); 32 const richText = SpreadsheetApp.newRichTextValue() 33 .setText(body); 34 const match = body.matchAll(regExp); // 抽出した文字列内の各URLと出現位置を検出 35 for (const m of match) { // 一致したURLごとに繰り返し 36 const url = m[0]; // URLの文字列 37 const position = m.index; // URLの開始位置 38 richText.setLinkUrl( 39 position, 40 position + url.length, // URLの終了の次の位置 41 url 42 ); 43 } 44 // 生成したリンク付きのリッチテキストをセルに記入 45 sheet.getRange(rowNumber, 6).setRichTextValue(richText.build()); 46 } 47}

投稿2024/02/15 05:52

YellowGreen

総合スコア861

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanao06

2024/02/15 12:15

YellowGreen様 お世話になっております。 お忙しい中回答ありがとうございました。 先ほど確認してみたところ、私のやりたいことが実現できて大変感動しております!! 言葉足らずにもかかわらず、思いを組んでいただきありがとうございます。 また、別バージョンも作成していただき、こちらも大変感謝しております!! ありがとうございます。 ユーザーへの配慮、丁寧でわかりやすいコメント記載、思いやりあふれるコードに感謝と感動と、 解決しましたのでベストアンサーに選ばせていただきました。 貴重なお時間を頂きまして申し訳ございませんでした。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問