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

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

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

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

Q&A

1回答

737閲覧

お助けください、、コードの条件がきちんと動きません、、

stn1216ky

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2022/07/08 00:44

Gメールの本文から必要な情報を抽出し、スプレッドシートへ転記するGASを作成しておりますが、抽出条件として「未読メール」、「1件抽出」といった条件をつけたいのですが、スプレッドシート上に思ったようなものが返ってきません。 
みていただきたいのが、8から15行目辺りかと存じます。
※現状、エラーはなし。また、既読メールも含め100件くらい返ってくる状態です。
原因が分からず昨晩から解明しておりますが、解決できない状態でとても困っております。申し訳ございませんがよろしくお願いいたします。

下記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.

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

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

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

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

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

guest

回答1

0

js

1var threads = GmailApp.search('label:-その他-キャンペーン is:unread',start,max);

「指定ラベルを持つ、1つでも未読のメッセージがあるスレッドすべて」を取得しています。未読のスレッドの中には既読のメッセージもあります。

2重ループの内側で Messages[i][j].isUnread() のチェックをする必要があります。その場合、以下のコードもスレッドではなくメッセージを既読にする必要があります。

js

1// 同じメールを読み込まないように、メッセージを既読にする 2threads[i].markRead();

投稿2022/07/08 00:59

編集2022/07/08 01:09
int32_t

総合スコア20856

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

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

stn1216ky

2022/07/08 01:23

int32_tさん ありがとうございます。既読メールが取得されてしまう原因はわかりました! 上記searchしてきたスレッドの中で情報を抽出するメールを1件だけに限定する場合はどのようにすればよろしいでしょうか? 11. // 取得するメールの最大件数 12. var max = 1;
int32_t

2022/07/08 01:27

メッセージ1つを処理したら処理をやめればよいでしょう。
stn1216ky

2022/07/08 01:38

int32_tさん 現状、1度GASを実行した際に複数件取得されてしまうので、困っております、、
int32_t

2022/07/08 02:00

> 現状、1度GASを実行した際に複数件取得されてしまうので、困っております、、 それは理解しています。 「メッセージ1つを処理したら処理をやめればよいでしょう。」でどのようにコードを変更するか助言したつもりなのですが、何か不明点があるでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問