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

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

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

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

JavaScript

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

Q&A

解決済

1回答

1221閲覧

メールから抽出した変数でmatchAllが希望の動作をしない

teratailuser123

総合スコア16

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2020/09/08 07:40

テキストで動作すると正しく結果が反映されるのに対し、RegExpを使って抽出したものに対してmatchAllの結果が反映されません。
テキストとして認識されていないのかとvar RegOrderに対して.toString();を使ったりもしましたが問題は解決されず...

RegOrderをconsole.logで書き出し、書き出された内容で個別にテキストで動作したところ希望の動作をしていたためRegOrderの中の文字列自体に間違いはないものと思われます。

原因が分かる方がいましたらお教え願います。

GoogleAppsScript

1 var start = 0; 2 3 // 取得するメールの最大件数 4 var max = 100; 5 6 // Gmailのラベル名 7 var threads = GmailApp.search('label:発注情報 is:unread',start,max); 8 9 var Messages = GmailApp.getMessagesForThreads(threads); 10 11 12 13 // メールから要項を取り出す// 14 for(var i = 0; i < Messages.length; i++) { 15 for(var j = 0; j < Messages[i].length; j++) { 16 17 var body = Messages[i][j].getPlainBody(); 18 19 var order = new RegExp('--'+'[\s\S]*?'+'=='); 20 var RegOrder = body.match(order)[0]; 21 22 23 var results = RegOrder.matchAll(/^.*? +[\d,]+円 +(?<count>[\d,]+)個 +[\d,]+円\n[(?<model>.*?)]\n(?<content>(?:.*?\n)+?)(?=^.*?\n[|=+)/mg); 24 25 var mailTitle = ""; 26 var mailBody = "\n"; 27 for (const result of results) { 28 mailTitle += (result.groups.model + "・").repeat(result.groups.count); 29 var modelAndContent = result.groups.model + '\n' + result.groups.content; 30 if (modelAndContent.slice(-2) !== '\n\n') { 31 modelAndContent += '\n'; 32 } 33 mailBody += modelAndContent.repeat(result.groups.count) 34} 35if (mailTitle.length > 1) { 36 mailTitle = mailTitle.slice(0, -1); 37} 38 39console.log("メールタイトル: " + mailTitle) 40console.log("内容: " + mailBody)

result

1メールタイトル: 2内容:

GoogleAppsScript

1//テキストで動作させる場合 2function myFunction() { 3 var RegOrder = (function() {/* ------------------------------------------------------------------------- 4商品名A 10,000円 1個 10,000円 5[商品型番A] 6色:黒 7サイズ:22.5 8素材:エナメル 9オプション:ーー 10 11商品名B 5,000円 2個 5,000円 12[商品型番B] 13色:黒 14サイズ:22 15素材:革 16========================================================================= 17*/}).toString().match(//*\n*([^]*)*//)[1]; 18 19 20 var results = RegOrder.matchAll(/^.*? +[\d,]+円 +(?<count>[\d,]+)個 +[\d,]+円\n[(?<model>.*?)]\n(?<content>(?:.*?\n)+?)(?=^.*?\n[|=+)/mg); 21 22 var mailTitle = ""; 23 var mailBody = "\n"; 24 for (const result of results) { 25 mailTitle += (result.groups.model + "・").repeat(result.groups.count); 26 var modelAndContent = result.groups.model + '\n' + result.groups.content; 27 if (modelAndContent.slice(-2) !== '\n\n') { 28 modelAndContent += '\n'; 29 } 30 mailBody += modelAndContent.repeat(result.groups.count) 31} 32if (mailTitle.length > 1) { 33 mailTitle = mailTitle.slice(0, -1); 34} 35 36console.log("メールタイトル: " + mailTitle) 37console.log("内容: " + mailBody)

result

1メールタイトル: 商品型番A・商品型番B・商品型番B 2商品型番A 3色:黒 4サイズ:22.5 5素材:エナメル 6オプション:ーー 7 8商品型番B 9色:黒 10サイズ:22 11素材:革 12 13商品型番B 14色:黒 15サイズ:22 16素材:革 17

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

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

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

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

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

guest

回答1

0

ベストアンサー

実際にGmailのメールの改行コードを調べてみたら、\r\nですね。
正規表現は提示されたコードそのままに戻して、取得したメッセージの改行コードを\nに置換してしまえば、テスト用のテキストもそのまま使えるし楽じゃないかな。

Diff

1-var RegOrder = body.match(order)[0]; 2+var RegOrder = body.match(order)[0].replace(/\r\n/mg, "\n");

投稿2020/09/08 10:10

編集2020/09/08 14:51
Daregada

総合スコア11990

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

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

teratailuser123

2020/09/08 11:58

Daregada様 改めて回答ありがとうございます。 教えていただいた通り/rに変えたのですが、やはり同じ結果がログに出力されてしまいました。
Daregada

2020/09/08 14:52

ということで、正規表現は元のパターンに戻し、RegOrderに「改行コードが\nになっているテキスト」を代入しましょう。
teratailuser123

2020/09/09 07:03

解説までしていただき誠にありがとうございました! 希望通りの動作ができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問