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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

2258閲覧

GASでGmailの問合せメールをスプレッドシートに反映。最後の項目のみ反映されない。

Cha_mi

総合スコア2

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/05/10 11:45

編集2020/05/11 01:23

問い合わせフォームからくる資料請求や打合せ希望のメールをスプレッドシートに転載し、営業メンバの方が共有できるようにリスト化するという作業が毎日発生しています。
Gmailに送られてくるこれらのお問合せのメールを、GASを用い、スプレッドシートに自動で転載できるようにできれば少しでも後輩の仕事が減ると思い、GASの勉強をし始めました。
以前こちらで質問をさせていただき教えていただいた内容等をもとに、無事ほぼ完成したのですが、一点だけうまくいかず。。。再度質問させていただきます。
反映したい問合せメールはパターンが複数ありますが、おおむね以下の通りです。
ーーーーーーーーーーーーーーーーーーーーーーー
件名:【資料請求申し込み】
本文:
下記のお問い合わせがありました。
【会社名】
XXXXXXX株式会社
【部署名】
XXX部
【氏名】
XXX XXX
【メールアドレス】
XXXXXXXXXXXX@XXXXXXXXX
【電話番号】
XXXXXXXXXXXX
【お問合せ内容】
XXXXXXXXX
yyyyyyyyy

【デモンストレーション希望】
XXX

【知ったきっかけ】
XXX
【関心のあるテーマ】
XXX,yyy,ccc
【社員数】
1000名以上~
【検討状況】
直近で導入を検討している←今回ここが反映されません。空欄または"直近で導入を検討している"の2パターンです。

ーーーーーーーーーーーーーーーーーーーーーーー
上記のメールをA~M列に以下のようにデータを反映したいです。
日付 件名 会社名 部署 。。。。。検討状況

最後の【検討状況】のみエラーがでてしまいます。
エラー内容としては以下の文言がでます。

●エラーパターン1:
var regBackground = new RegExp('【検討状況】' + '[\s\S]*?');
上記において
TypeError: Cannot read property '0' of null(行 104、ファイル「コード」)
がでます。※if文を除いた場合。問合せフォームよとっては実際に【検討状況】の項目がないフォームもあります。

●エラーパターン2:
上記のregBackgroundの対象を以下に変えた場合、スプレッドシートにはすべての行に
"直近で導入を検討している"が表示されてしまいます。
var regBackground = new RegExp('直近で導入を検討している');
おそらくスレッド内でどれかのメールに"直近で導入を検討している"という文言があればそれを拾ってしまっています。

●改善したいこと
【検討状況】
直近で導入を検討している←これをうまく反映させたいです。
直近で導入を検討していると答えている内容のメールは確かに存在しているので、エラーパターン1のようにnullになることはあり得ません。

該当のソースコード

GAS

1function RegExpForm() { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var sheet = ss.getSheetByName('問合せ転記'); 4 var thds = GmailApp.search('from:"xxxx@gmail.com" newer_than:1d'); 5 var messe = GmailApp.getMessagesForThreads(thds); 6 const lastRow = sheet.getLastRow(); 7 const ids = sheet.getRange(2, 21, lastRow).getValues().flat(); 8 9 for(var i = 0; i < messe.length; i++) { 10 for(var j = 0; j < messe[i].length; j++) { 11 var subject = thds[i].getMessages()[j].getSubject().replace('Fw: 【', '').replace('】', ''); 12 var body = messe[i][j].getPlainBody(); 13 var id = messe[i][j].getId() 14 15 if(!ids.includes(id)){ 16 if(body.match('Date:')){ 17 var regDate = new RegExp('Date:' + '.*?' + '\r' ); 18 var Date = body.match(regDate)[0].replace('Date: ', ''); 19 } 20 21 if(body.match('【会社名】')){ 22 var regCompany = new RegExp('【会社名】' + '[\s\S]*?' + '【部署名】'); 23 var Company = body.match(regCompany)[0].replace('【会社名】', '').replace('【部署名】', '').replace('\n', '').replace('\r', ''); 24 } 25 26 if(body.match('【部署名】')){ 27 var regDepartment = new RegExp('【部署名】' + '[\s\S]*?' + '【氏名】'); 28 var Department = body.match(regDepartment)[0].replace('【部署名】', '').replace('【氏名】', '').replace('\n', '').replace('\r', ''); 29 } 30 31 if(body.match('【氏名】')){ 32 var regName = new RegExp('【氏名】' + '[\s\S]*?' + '【メールアドレス】'); 33 var Name = body.match(regName)[0].replace('【氏名】', '').replace('【メールアドレス】', '').replace('\n', '').replace('\r', ''); 34 } 35 36 if(body.match('【メールアドレス】')){ 37 var regEmail = new RegExp('【メールアドレス】' + '[\s\S]*?' + '【電話番号】'); 38 var Email = body.match(regEmail)[0].replace('【メールアドレス】', '').replace('【電話番号】', '').replace('\n', '').replace('\r', ''); 39 } 40 41 if(body.match('【電話番号】' + '[\s\S]*?' + '【お問合せ内容】')){ 42 var regTel = new RegExp('【電話番号】' + '[\s\S]*?' + '【お問合せ内容】'); 43 var Tel = body.match(regTel)[0].replace('【電話番号】', '').replace('【お問合せ内容】', '').replace('\n', '').replace('\r', ''); 44 } 45 else if(body.match('【電話番号】' + '[\s\S]*?' + '【お問い合せ内容】')){ 46 var regTel = new RegExp('【電話番号】' + '[\s\S]*?' + '【お問い合せ内容】'); 47 var Tel = body.match(regTel)[0].replace('【電話番号】', '').replace('【お問い合せ内容】', '').replace('\n', '').replace('\r', ''); 48 } 49 50 if(body.match('【お問合せ内容】' + '[\s\S]*?' + '【デモンストレーション希望】')){ 51 var regContents = new RegExp('【お問合せ内容】' + '[\s\S]*?' + '【デモンストレーション希望】'); 52 var Contents = body.match(regContents)[0].replace('【お問合せ内容】', '').replace('【デモンストレーション希望】', '').replace('\n', '').replace('\r', ''); 53 } 54 else if(body.match('【お問合せ内容】' + '[\s\S]*?' + '【知ったきっかけ】')){ 55 var regContents = new RegExp('【お問合せ内容】' + '[\s\S]*?' + '【知ったきっかけ】'); 56 var Contents = body.match(regContents)[0].replace('【お問合せ内容】', '').replace('【知ったきっかけ】', '').replace('\n', '').replace('\r', ''); 57 } 58 59 if(body.match('【ご紹介方法】')){ 60 var regDemo = new RegExp('【ご紹介方法】' + '[\s\S]*?'); 61 var Demo = body.match(regDemo)[0].replace('【ご紹介方法】', '').replace('\n', '').replace('\r', ''); 62 } 63 else if(body.match('【デモンストレーション希望】')){ 64 var regDemo = new RegExp('【デモンストレーション希望】' + '[\s\S]*?' + '【知ったきっかけ】'); 65 var Demo = body.match(regDemo)[0].replace('【デモンストレーション希望】', '').replace('【知ったきっかけ】', '').replace('\n', '').replace('\r', ''); 66 } 67 68 if(body.match('【知ったきっかけ】')){ 69 var regChannel = new RegExp('【知ったきっかけ】' + '[\s\S]*?' + '【関心のあるテーマ】'); 70 var Channel = body.match(regChannel)[0].replace('【知ったきっかけ】', '').replace('【関心のあるテーマ】', '').replace('\n', '').replace('\r', ''); 71 } 72 73 if(body.match('【関心のあるテーマ】')){ 74 var regNeeds = new RegExp('【関心のあるテーマ】' + '[\s\S]*?' + '【社員数】'); 75 var Needs = body.match(regNeeds)[0].replace('【関心のあるテーマ】', '').replace('【社員数】', '').replace('\n', '').replace('\r', ''); 76 } 77 78 if(body.match('【社員数】' + '[\s\S]*?' + '【お問い合わせ内容について】')){ 79 var regEmployees = new RegExp('【社員数】' + '[\s\S]*?' + '【お問い合わせ内容について】'); 80 var Employees = body.match(regEmployees)[0].replace('【社員数】', '').replace('【お問い合わせ内容について】', '').replace('\n', '').replace('\r', ''); 81 } 82 else if(body.match('【社員数】' + '[\s\S]*?' + '【検討状況】')){ 83 var regEmployees = new RegExp('【社員数】' + '[\s\S]*?' + '【検討状況】'); 84 var Employees = body.match(regEmployees)[0].replace('【社員数】', '').replace('【検討状況】', '').replace('\n', ''); 85 } 86 else if(body.match('【社員数】' + '[\s\S]*?')){ 87 var regEmployees = new RegExp('【社員数】' + '[\s\S]*?'); 88 var Employees = body.match(regEmployees)[0].replace('【社員数】', '').replace('\n', '').replace('\r', ''); 89 } 90 91 if(body.match('【検討状況】')){ 92 var regBackground = new RegExp('【検討状況】' + '[\s\S]*?'); 93 var Background = body.match(regBackground)[0].replace('【検討状況】', '').replace('\n', ''); 94 } 95 96 sheet.appendRow([, , , , , , , Date, Company, Department, Name, Email, Tel, Demo, Contents, Channel, Needs, Background, subject, Employees, id 97]); 98 //Logger.log([date, subject, Company, Department]); 99 } 100 var lastCol = sheet.getLastColumn(); 101 sheet.getRange(2, 1, lastRow, lastCol).sort({column: 8, ascending: false}); 102 } 103 } 104}

補足情報(FW/ツールのバージョンなど)

HTML、CSS、簡単なマクロの知識程度しかないです。HTMLを見てfomrをいじったりができる程度で、jsやGASはこれから自分のスキルアップのために学ぼうとしているところです。
初歩的なところがわからず大変お手数をおかけしますが、ご指導いただけると嬉しいです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

構文解析としては非常にずさんなので、例外処理を行うのであれば、ちゃんとフォームの項目から設計し直したほうがが良いです。

おっしゃる通りです。。。問合せフォームの整理は別途行う必要があると感じています。

本題のスクリプトですが、やはり同じエラーがでてしまいました。

1.以下の場合、matchで検索対象が0でした。
if(body.match('【検討状況】')){
var regBackground = new RegExp('【検討状況】\n.*');
var Background = body.match(regBackground)[0];
}

2.以下の場合、全件"【検討状況】"となりました。
if(body.match('【検討状況】')){
var regBackground = new RegExp('【検討状況】');
var Background = body.match(regBackground)[0];
}

3.以下の場合、2件以外、全件"直近で導入を検討している"となりました。
if(body.match('直近で導入を検討している')){
var regBackground = new RegExp('直近で導入を検討している');
var Background = body.match(regBackground)[0];
}

3-2."直近で導入を検討している"にならなかった2件を確認したところ、以下の通りでした。

パターンA:フォームに【検討状況】の項目自体がないパターン1件。(実際それ以外のメールはすべて【検討状況】の項目はありました。)

パターンB:【検討状況】の項目の下に別の項目が続いていた。

ーーーーーーーーーーーーーーーーーー
例)
【検討状況】

【ご紹介方法】
ウェブ会議
ーーーーーーーーーーーーーーーーーー

2では例外なく全件【検討状況】となったのに、3では2件空欄があったのが引っ掛かります。
何かスクリプトで改善の余地は思い当たりませんでしょうか。
よろしくお願いします。

投稿2020/05/11 01:54

Cha_mi

総合スコア2

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

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

0

ベストアンサー

【検討状況】が最後の項目なのであれば

diff

1- var regBackground = new RegExp('【検討状況】' + '[\s\S]*?'); 2+ var regBackground = new RegExp('【検討状況】\n.*');

で「動く」とは思います。

ただ、構文解析としては非常にずさんなので、例外処理を行うのであれば、ちゃんとフォームの項目から設計し直したほうが良いです。

投稿2020/05/10 23:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Cha_mi

2020/05/11 01:57

>構文解析としては非常にずさんなので、例外処理を行うのであれば、ちゃんとフォームの項目から設計し直したほうがが良いです。 おっしゃる通りです。。。問合せフォームの整理は別途行う必要があると感じています。 本題のスクリプトですが、やはり同じエラーがでてしまいました。 1.以下の場合、matchで検索対象が0でした。 if(body.match('【検討状況】')){ var regBackground = new RegExp('【検討状況】\n.*'); var Background = body.match(regBackground)[0]; } 2.以下の場合、全件"【検討状況】"となりました。 if(body.match('【検討状況】')){ var regBackground = new RegExp('【検討状況】'); var Background = body.match(regBackground)[0]; } 3.以下の場合、2件以外、全件"直近で導入を検討している"となりました。 if(body.match('直近で導入を検討している')){ var regBackground = new RegExp('直近で導入を検討している'); var Background = body.match(regBackground)[0]; } 3-2."直近で導入を検討している"にならなかった2件を確認したところ、以下の通りでした。 パターンA:フォームに【検討状況】の項目自体がないパターン1件。(実際それ以外のメールはすべて【検討状況】の項目はありました。) パターンB:【検討状況】の項目の下に別の項目が続いていた。 ーーーーーーーーーーーーーーーーーー 例) 【検討状況】 【ご紹介方法】 ウェブ会議 ーーーーーーーーーーーーーーーーーー 2では例外なく全件【検討状況】となったのに、3では2件空欄があったのが引っ掛かります。 何かスクリプトで改善の余地は思い当たりませんでしょうか。 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2020/05/11 02:10

改行を含みたいということなのですね。 new RegExp(/【検討状況】[\s\S]*/) でどうでしょう。
Cha_mi

2020/05/11 18:56

できました!!! 感動です! たびたびお答えいただいた上で大変恐縮なのですが、今回なぜ '【検討状況】' + '[\s\S]*?'では動かず、 /【検討状況】[\s\S]*/で動いたのか、ご教示お願いできないでしょうか。 最後の行になったとたんに反応しなくなるというのも腑に落ちません。 どうかよろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2020/05/11 22:59

差異は分かると思います。 調べてみると良いです。 正規表現のデバッグには以下のサイトを使用するとはかどります。 https://regex101.com/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問