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

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

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

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

JavaScript

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

650閲覧

GASにおける量指定子について

fuku-chann

総合スコア82

Google Apps Script

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

JavaScript

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/05/04 12:20

編集2020/05/04 14:44

量指定子について質問させてください。
下記の質問でかなり悩まされたことが、量指定子が原因ということがわかりました。

私の過去質:GASでGmailの本文を分割してスプレッドシートに転記する方法

量指定子を'.*?'から'[^"]+'に変更することでエラーが無くなり、正常にコードが動くことが確認できましたが、理由がいまだにわかりません。

GAS

1var reg = new RegExp(pre + '[^"]+' + suf);

量指定子を学んでいくと、これらの量指定子はどちらも何でも検索されるように思いますが、どのような違いがあるのでしょうか?

参考にした記事
サルにもわかる入門書
貪欲と怠惰な量指定子
量指定子 +, *, ? と {n}
正規表現パターンの記述

GAS

1function contact_Gmail() { 2 var rowNumber = 2; 3 var mysheetname = 'Gmail解析_' + Utilities.formatDate(new Date(), 'JST', 'yyyyMMddHHmmss'); 4 5 var GmailSS = SpreadsheetApp.create(mysheetname); 6 var mySheet = GmailSS.getSheets()[0]; 7 mySheet.setName(mysheetname); 8 mySheet.getRange(1,1).setValue("日時"); 9 mySheet.getRange(1,2).setValue("送信元"); 10 mySheet.getRange(1,3).setValue("件名"); 11 mySheet.getRange(1,4).setValue("本文"); 12 mySheet.getRange(1,5).setValue("ご予約"); 13 mySheet.getRange(1,6).setValue("お名前"); 14 mySheet.getRange(1,7).setValue("電話番号"); 15 mySheet.getRange(1,8).setValue("メールアドレス"); 16 17 var newfolder = DriveApp.createFolder(mysheetname); 18 19 var searchQuery = 'subject:("finalized") '; 20 var threads = GmailApp.search(searchQuery, 0, 200); 21 22 var mymsg=[]; 23 24 var msgs = GmailApp.getMessagesForThreads(threads); 25 26 for(var i = 0; i < msgs.length; i++) { 27 mymsg[i]=[]; 28 for(var j = 0; j < msgs[i].length; j++) { 29 mymsg[i][0] = msgs[i][j].getDate(); 30 mymsg[i][1] = msgs[i][j].getFrom(); 31 mymsg[i][2] = msgs[i][j].getSubject(); 32 var nbsp = String.fromCharCode(160); 33 mymsg[i][3] = msgs[i][j].getPlainBody().replace(/<("[^"]*"|'[^']*'|[^'">])*>|nbsp/g,'').replace(/&; | /g,'').substring(0,50000); 34 mymsg[i][4] = fetchData(mymsg[i][3],'Appointments:','Name:'); 35 } 36 } 37 if(mymsg.length>0){ 38 GmailSS.getSheets()[0].getRange(2, 1, i, 5).setValues(mymsg); //シートに貼り付け 39 } 40} 41 42function fetchData(str, pre, suf) { 43 var reg = new RegExp(pre + '[^"]+' + suf); 44 var data = str.match(reg)[0] 45 .replace(pre, '') 46 .replace(suf, ''); 47 return data; 48}

2020050423時追記:量指定子変更

GAS

1function contact_Gmail() { 2 var rowNumber = 2; 3 var mysheetname = 'Gmail解析_' + Utilities.formatDate(new Date(), 'JST', 'yyyyMMddHHmmss'); 4 5 var GmailSS = SpreadsheetApp.create(mysheetname); 6 var mySheet = GmailSS.getSheets()[0]; 7 mySheet.setName(mysheetname); 8 mySheet.getRange(1,1).setValue("日時"); 9 mySheet.getRange(1,2).setValue("送信元"); 10 mySheet.getRange(1,3).setValue("件名"); 11 mySheet.getRange(1,4).setValue("本文"); 12 mySheet.getRange(1,5).setValue("ご予約"); 13 mySheet.getRange(1,6).setValue("お名前"); 14 mySheet.getRange(1,7).setValue("電話番号"); 15 mySheet.getRange(1,8).setValue("メールアドレス"); 16 17 var newfolder = DriveApp.createFolder(mysheetname); 18 19 var searchQuery = 'subject:("finalized") '; 20 var threads = GmailApp.search(searchQuery, 0, 200); 21 22 var mymsg=[]; 23 24 var msgs = GmailApp.getMessagesForThreads(threads); 25 26 for(var i = 0; i < msgs.length; i++) { 27 mymsg[i]=[]; 28 for(var j = 0; j < msgs[i].length; j++) { 29 mymsg[i][0] = msgs[i][j].getDate(); 30 mymsg[i][1] = msgs[i][j].getFrom(); 31 mymsg[i][2] = msgs[i][j].getSubject(); 32 var nbsp = String.fromCharCode(160); 33 mymsg[i][3] = msgs[i][j].getPlainBody().replace(/<("[^"]*"|'[^']*'|[^'">])*>|nbsp/g,'').replace(/&; | /g,'').substring(0,50000); 34 mymsg[i][4] = fetchData(mymsg[i][3],'Appointments:','Name:'); 35 } 36 } 37 if(mymsg.length>0){ 38 GmailSS.getSheets()[0].getRange(2, 1, i, 5).setValues(mymsg); //シートに貼り付け 39 } 40} 41 42function fetchData(str, pre, suf) { 43 var reg = new RegExp(pre + '.*?' + suf,'m'); 44 var data = str.match(reg)[0] 45 .replace(pre, '') 46 .replace(suf, ''); 47 return data; 48}

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

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

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

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

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

otn

2020/05/04 12:25

'.*?' だとどういう問題があったのでしょうか??
fuku-chann

2020/05/04 12:36

otn様 ご質問ありがとうございます。 下記のエラーが発生し、44行目で止まってしまいました。 TypeError: Cannot read property '0' of null(行 44、ファイル「コード」) 44行目:var data = str.match(reg)[0]
otn

2020/05/04 12:51

どんなstrだったんでしょうか?
fuku-chann

2020/05/04 12:57

otn様 ご回答ありがとうございます。 strの中身は下記メール本文です。 When you send the email, the reservation will be finalized. Appointments: - 04/28/2020 08:30-11:00 (+ USB port expansion) Name: ふく Phone number: 090-8765-4321
guest

回答1

0

ベストアンサー

デフォルトだと、.は改行にマッチしないからです。

new RegExp(pre + '.*?' + suf,'m')でしょうか。
new RegExp(pre + '.*?' + suf,'s')でしょうか。

投稿2020/05/04 13:32

編集2020/05/04 22:31
otn

総合スコア84505

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

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

fuku-chann

2020/05/04 14:42

otn様 ご回答ありがとうございます。 下記のコードでもエラーになったので他にも原因がありそうです。 mymsg[i][4] = fetchData(mymsg[i][3],'Name':,'\r'); また、下記ではエラーがでました。 new RegExp(pre + '.*?' + suf,'m') TypeError: Cannot read property '0' of null(行 44、ファイル「コード」)
otn

2020/05/04 15:14

失礼しました。普段Rubyを使っているので間違えました。'm'じゃなくて's' ですね。
otn

2020/05/04 15:15

> mymsg[i][4] = fetchData(mymsg[i][3],'Name':,'\r'); は意味がわかりません。
fuku-chann

2020/05/04 15:40

otn様 ご回答ありがとうございました。 's'で問題なく動作しました。 この’s’はどういう意味があるのでしょうか? また、下記コードは改行がない部分で試そうと思い、Nameの行の「ふく」を取得しようとしました。Nameから文末(/r)までという意味にはならないでしょうか? mymsg[i][4] = fetchData(mymsg[i][3],'Name':,'\r');
fuku-chann

2020/05/04 15:47

otm様 改行について勘違いがあったかもしれません。 そもそもAppointmentsまでたどり着いていないということですね。 's'がないと最初の一行目しか取得できないということですね。 When you send the email, the reservation will be finalized.
otn

2020/05/04 16:02

> この’s’はどういう意味があるのでしょうか? 回答に、 「デフォルトだと、.は改行にマッチしないからです。 」 と書いたとおりです。 > Nameから文末(/r)までという意味 \n では?
fuku-chann

2020/05/04 16:10

otn様 ご回答ありがとうございます。 この場所に's'を付けたことがなく(そのような発想もなく)使い方など全く分からなかったため質問させていただきました。 すみませんが、最後にもう一点教えてください。 '[^"]+'と,'s'を追加したものではどのような違いがあるのでしょうか? 文章から特定の文字を抽出していく場合、どちらを使うのが良いかと思いまして。
otn

2020/05/04 22:30

うーん、「デフォルトだと、.は改行にマッチしないからです。 」の意味がわからないと言うことですかね。 . は「任意の1文字」と説明されることが多いですが、正確には、デフォルトでは「改行文字を除く任意の1文字」です。 今回の目的を果たすためには、. が改行も含む任意の1文字にマッチしてもらないと困ります。 ここまでは分かりますでしょうか? そういう . の意味変更はオプションの指定で行うことが出来ます。それが"s"です。 参考: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp (リファレンスの使い方も学びましょう)
otn

2020/05/04 22:46

> Windowsでは GASで実行しているのでは無かったのですか?
fuku-chann

2020/05/05 00:05 編集

otn様 ご回答ありがとうございます。 理解してきました。 そういえばGASはGoogleで処理されているのでOSは関係ありませんでした。 両方とも機能するので、GASでも両方対応しているということでしょうか。 今後Macでも使う可能性があるので、\nを使いたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問