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

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

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

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

Q&A

解決済

1回答

494閲覧

TypeError: Cannot read property '0' of null 申し訳ございませんがお助けください、、

stn1216ky

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2022/07/07 21:25

編集2022/07/07 21:57

Gメールの本文から必要な情報を抽出し、スプレッドシートへ転記するGASを作成しておりますが、TypeError: Cannot read property '0' of null getMail04 @ (その他)個人メール収集.gs:57とのエラーコードが出る状態です。
原因が分からず昨晩から解明しておりますが、解決できない状態でとても困っております。申し訳ございませんがよろしくお願いいたします。

下記URL参考にしております。
https://note.com/pc8hara/n/n850e081311c5

1. var sheet = SpreadsheetApp.getActiveSheet(); 2. var data = sheet.getRange(7, 21, sheet.getLastRow() + 1).getValues(); 3. 4. function getMail04(){ 5. var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 6. 7. var objSheet = objSpreadsheet.getSheetByName("(その他)個人◆記念キャンペーン");  8. var sheet = SpreadsheetApp.setActiveSheet(objSheet); 9. var start = 0; 10. 11. // 取得するメールの最大件数 12. var max = 1; 13. 14. // Gmailのラベル名をここに記載 15. var threads = GmailApp.search('label:-その他-キャンペーン is:unread',start,max); 16.   17. // 最後の行探してそれ以降に追加 挿入開始位置 18. var Messages = GmailApp.getMessagesForThreads(threads); 19. var row = sheet.getLastRow() + 1; 20. 21. // 見出しがあるためシートの1行目を固定 22. sheet.setFrozenRows(1); 23. 24. // メールから各種情報を取り出す// 25. for(var i = 0; i < Messages.length; i++) { 26. for(var j = 0; j < Messages[i].length; j++) { 27. var id = Messages[i][j].getId(); 28. if(!hasId(id)){ 29. var body = Messages[i][j].getPlainBody(); 30. var date = threads[i].getMessages()[j].getDate(); 31. 32. var regSyohinn = new RegExp('応募賞品:' + '[\\s\\S]*?' + '応募のきっかけ:'); 33. var Syohinn = body.match(regSyohinn)[0].replace('応募賞品:', '').replace('応募のきっかけ:', '').replace('\r', ''); 34. var regKikkake = new RegExp('応募のきっかけ:' + '[\\s\\S]*?' + 'キャンペーンコード:'); 35. var Kikkake = body.match(regKikkake)[0].replace('応募のきっかけ:', '').replace('キャンペーンコード:', '').replace('\r', ''); 36. var regCODE = new RegExp('キャンペーンコード:' + '[\\s\\S]*?' + 'お取引された物件のエリア:'); 37. var CODE = body.match(regCODE)[0].replace('キャンペーンコード:', '').replace('お取引された物件のエリア:', '').replace('\r', ''); 38. var regBukkenAREA = new RegExp('お取引された物件のエリア:' + '[\\s\\S]*?' + 'お取引した店舗名:'); 39. var BukkenAREA = body.match(regBukkenAREA)[0].replace('お取引された物件のエリア:', '').replace('お取引した店舗名:', '').replace('\r', ''); 40. var regTenpoName = new RegExp('お取引した店舗名:' + '[\\s\\S]*?' +'担当者名:'); 41. var TenpoName = body.match(regTenpoName)[0].replace('お取引した店舗名:', '').replace('担当者名:', '').replace('\r', ''); 42. var regTantousyaName = new RegExp('担当者名:' + '[\\s\\S]*?' +'お名前:'); 43. var TantousyaName = body.match(regTantousyaName)[0].replace('担当者名:', '').replace('お名前:', '').replace('\r', ''); 44. var regNameKanji = new RegExp('お名前:' + '[\\s\\S]*?' + 'ふりがな:'); 45. var NameKanji = body.match(regNameKanji)[0].replace('お名前:', '').replace('ふりがな:', '').replace('\r', ''); 46. var regNameFurigana = new RegExp('ふりがな:' + '[\\s\\S]*?' + '生年月日:'); 47. var NameFurigana = body.match(regNameFurigana)[0].replace('ふりがな:', '').replace('生年月日:', '').replace('\r', ''); 48. var regSeinengappi = new RegExp('生年月日:' + '[\\s\\S]*?' + '携帯電話番号:'); 49. var Seinengappi = body.match(regSeinengappi)[0].replace('生年月日:', '').replace('携帯電話番号:', '').replace('\r', ''); 50. var regTelNumber = new RegExp('携帯電話番号:' + '[\\s\\S]*?' + 'メールアドレス:'); 51. var TelNumber = body.match(regTelNumber)[0].replace('携帯電話番号:', '').replace('メールアドレス:', '').replace('\r', ''); 52. var regJusyo = new RegExp('住所:' + '[\\s\\S]*?' + '住所コード:'); 53. var Jusyo = body.match(regJusyo)[0].replace('住所:', '').replace('住所コード:', '').replace('\r', ''); 54. var regJusyoCode = new RegExp('住所コード:' + '[\\s\\S]*?' + '上記の住所がはがき記載の住所と違う場合はチェックを入れてください:'); 55. var JusyoCode = body.match(regJusyoCode)[0].replace('住所コード:', '').replace('上記の住所がはがき記載の住所と違う場合はチェックを入れてください:', '').replace('\r', ''); 56. var regOnayami2 = new RegExp('『ある』とご回答の場合、ご相談内容をご記入ください:' + '[\\s\\S]*?' + 'ご相談内容について弊社からのご連絡方法を選択ください:'); **57. **var Onayami2 = body.match(regOnayami2)[0].replace('『ある』とご回答の場合、ご相談内容をご記入ください:', '').replace('ご相談内容について弊社からのご連絡方法を選択ください:', '').replace('\r', ''); 58. var regRenrakuhouhou = new RegExp('ご相談内容について弊社からのご連絡方法を選択ください:' + '[\\s\\S]*?' +'公式SNSをフォローされていますか:'); 59. var Renrakuhouhou = body.match(regRenrakuhouhou)[0].replace('ご相談内容について弊社からのご連絡方法を選択ください:', '').replace('公式SNSをフォローされていますか:', '').replace('\r', ''); 60. var regSNS = new RegExp('公式SNSをフォローされていますか:' + '[\\s\\S]*?' + 'その他ご要望等ございましたらご記入ください:'); 61. var SNS = body.match(regSNS)[0].replace('公式SNSをフォローされていますか:', '').replace('その他ご要望等ございましたらご記入ください:', '').replace('\r', ''); 62. var regYoubou = new RegExp('その他ご要望等ございましたらご記入ください:' + '[\\s\\S]*?' + '個人情報の取り扱いについて(必ずお読みください):'); 63. var Youbou = body.match(regYoubou)[0].replace('その他ご要望等ございましたらご記入ください:', '').replace('個人情報の取り扱いについて(必ずお読みください):', '').replace('\r', ''); 64. var regAnother = new RegExp('個人情報の取り扱いについて(必ずお読みください):' + '[\\s\\S]*?' + 'このメールはホームページ<記念キャンペーン>'); 65. var Another = body.match(regAnother)[0].replace('個人情報の取り扱いについて(必ずお読みください):', '').replace(/\r?\n/g, '').replace('このメールはホームページ<記念キャンペーン>', ''); 66. var regMail = new RegExp('メールアドレス:' + '[\\s\\S]*?' + '現在のお住まい:'); 67. var Mail = body.match(regMail)[0].replace('メールアドレス:', '').replace('現在のお住まい:', '').replace('\r', ''); 68. var regJusyoSoui = new RegExp('場合はチェックを入れてください:' + '[\\s\\S]*?' + '現在、不動産に関するお悩み'); 69. var JusyoSoui = body.match(regJusyoSoui)[0].replace('場合はチェックを入れてください:', '').replace('現在、不動産に関するお悩み', '').replace('\r', ''); 70. var regOnayami = new RegExp('お悩みやご相談等はございますか:' + '[\\s\\S]*?' + '『ある』とご回答の場合、ご相談内容をご記入ください:'); 71. var Onayami = body.match(regOnayami)[0].replace('お悩みやご相談等はございますか:', '').replace('『ある』とご回答の場合、ご相談内容をご記入ください:', '').replace('\r', ''); 72. 73. id 74. 75. // 同じメールを読み込まないように、メッセージを既読にする 76. threads[i].markRead(); 77. 78. // それぞれの項目をセルを指定してスプレッドシートへ転記 79. sheet.getRange(row,1).setValue(date); 80. sheet.getRange(row,2).setValue([Syohinn]); 81. sheet.getRange(row,3).setValue([Kikkake]); 82. sheet.getRange(row,4).setValue([CODE]); 83. sheet.getRange(row,5).setValue([BukkenAREA]); 84. sheet.getRange(row,6).setValue([TenpoName]); 85. sheet.getRange(row,7).setValue([TantousyaName]); 86. sheet.getRange(row,8).setValue([NameKanji]); 87. sheet.getRange(row,9).setValue([NameFurigana]); 88. sheet.getRange(row,10).setValue([Seinengappi]); 89. sheet.getRange(row,11).setValue([TelNumber]); 90. sheet.getRange(row,12).setValue([Mail]); 91. sheet.getRange(row,13).setValue([Jusyo]); 92. sheet.getRange(row,14).setValue([JusyoCode]); 93. sheet.getRange(row,15).setValue([Onayami]); 94. sheet.getRange(row,16).setValue([Onayami2]); 95. sheet.getRange(row,17).setValue([Renrakuhouhou]); 96. sheet.getRange(row,18).setValue([SNS]); 97. sheet.getRange(row,19).setValue([Youbou]); 98. sheet.getRange(row,20).setValue([Another]); 99. sheet.getRange(row,21).setValue([id]); 100. row++ 101. 102. // 受信日時順の昇順に並び替え 103. var range = sheet.getRange("A:U"); 104. range.sort({column: 1, ascending: true}); 105. } 106. } 107. } 108. } 109. 110. // 同じメッセージIDがある場合は読み込まないように 111. function hasId(id) { 112. var hasId = data.some(function(array, i, data) { 113. return (array[0] === id); 114. }); 115. return hasId; 116. } 117. 118. // この記述で正規表記? 119. function fetchData(str, pre, suf) { 120. var reg = new RegExp(pre + '.*?' + suf); 121. var data = ''; 122. data = str.match(reg)[0] 123. .replace(pre, '') 124. .replace(suf, ''); 125. return data; 126. } 127. ``` 下記のようなメールを受信し、label:-その他-キャンペーンに分けている状態です。 【メール本文】 【注意】このメールに直接返信すると、キャンペーン事務局へメールが送られ、 お客様には届きません。 ◆記念キャンペーン [お問い合わせ内容] 応募賞品: 応募のきっかけ:はがき キャンペーンコード:210021691 お取引された物件のエリア:その他 お取引した店舗名: 担当者名: お名前: ふりがな: 生年月日: 携帯電話番号: メールアドレス: 住所: 住所コード: 上記の住所がはがき記載の住所と違う場合はチェックを入れてください:同じ住所 公式SNSをフォローされていますか:フォローしていない 個人情報の取り扱いについて(必ずお読みください):上記3点に同意する このメールはホームページ<記念キャンペーン>から送信されています。 不明点などは、キャンペーン事務局までご連絡ください。

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

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

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

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

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

int32_t

2022/07/07 21:31

57行目はどこですか? 処理対象の電子メールのサンプルを質問文に入れてください。 コードをきちんとインデントしてください。読みにくいです。
usekay

2022/07/07 21:31

エラーメッセージの省略された箇所にどこでエラーが起きているか書いてあると思われるので省略された箇所をもう少しみせてください。
stn1216ky

2022/07/07 21:47 編集

大変失礼いたしました、、 対象の57行目は下記になります。 var Onayami2 = body.match(regOnayami2)[0].replace('『ある』とご回答の場合、ご相談内容をご記入ください:', '').replace('ご相談内容について弊社からのご連絡方法を選択ください:', '').replace('\r', '');
usekay

2022/07/07 22:01 編集

match 関数は確か一致するものがない場合nullを返します。それでnullはreplaceという関数を持たないというエラーになると… その行で複数の置換処理と検索をしている箇所を一行ずつ検索と置換に分けて実行すればどこで失敗しているかわかるかと思います。 ここに限らず検索した正規表現に一致するものがないと止まってしまうコードになっていますね。
stn1216ky

2022/07/07 22:16

usekeyさん ありがとうございます。こちら一度、きちんと正規表現になっているか確認するしかないんですね、、 因みに不一致でも実行が続くようにするためにはどこにどのようなコードをいれればよろしいでしょうか?
guest

回答1

0

ベストアンサー

js

1var regOnayami2 = new RegExp('『ある』とご回答の場合、ご相談内容をご記入ください:' + 2 '[\\s\\S]*?' + 'ご相談内容について弊社からのご連絡方法を選択ください:'); 3var Onayami2 = body.match(regOnayami2)[0].replace( 4 '『ある』とご回答の場合、ご相談内容をご記入ください:', ''). 5 replace('ご相談内容について弊社からのご連絡方法を選択ください:', ''). 6 replace('\r', '');

body.match(regOnayami2) の結果がnullになると、質問文のようなエラーになります。つまり、メール本文中に「『ある』とご回答の場合、...」に該当するテキストが存在しないということです。

たとえば、該当するテキストが存在しない場合に Onayami2 が空文字列になって欲しいなら、body.match(regOnayami2) の結果で条件分岐しましょう。

js

1let Onayami2 = ''; 2const regOnayami2match = body.match(regOnayami2); 3if (regOnayami2match) { 4 Onayami2 = regOnayami2match[0].replace(... 5}

投稿2022/07/07 21:58

編集2022/07/07 22:15
int32_t

総合スコア20941

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

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

stn1216ky

2022/07/07 22:32

int32_tさん ご回答ありがとうございます。 テキストが存在する場合でもエラーを起こしてしまいます。 matchに該当する文章が長いのでエラーを起こす可能性もあるのでしょうか?
int32_t

2022/07/07 22:35

長さは関係ありません。 少なくとも質問文にあるサンプルメールには該当するテキストはないですよね。もし該当するテキストがあるはずなら、正規表現が間違っているのでしょう。
stn1216ky

2022/07/07 23:06 編集

int32_tさん ありがとうございます。こちら分岐入れましたら問題なく抽出できるようになりました。 ただ大変申し訳ございません。こちら未読メール1件ずつ抽出したいのですが、複数件また既読メールも抽出してしまいます。 下記コードで1件ずつに設定しているのですが、こちらの原因もお分かりになりますでしょうか? 何度も大変申し訳ございません。 11. // 取得するメールの最大件数 12. var max = 1; 13. 14. // Gmailのラベル名をここに記載 15. var threads = GmailApp.search('label:-その他-キャンペーン is:unread',start,max);
int32_t

2022/07/07 23:26

それは質問のタイトルのエラーには関係ないので、新しい質問を立ててください。
stn1216ky

2022/07/08 00:52

int32_tさん 承知いたしました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問