POPのメールをGmail受信し、それをGASで取り込んでSpreadsheetに記載しています。
ある程度うまく動いていますが、やっているうちにいくつか問題が生じていることに気付きました。
内容は問い合わせフォームの受信です。
以下の点について、(複数点あり申し訳ないですが)教えていただけるとありがたいです、
・検索条件にあてはまるメールを含む、スレッドを受信し、そのスレッドの最初のもの、配列[0]のメールが、欲しい、問い合わせフォームであり、[1]以降は、それへの返信だと考えていました。それで配列[0]のものを取得してく形にしていました。
・しかし、どうやら、それだといくつか漏れてしまっているようなのです。すなわち、Webのフォームから送られた、初回のメールであるにもかかわらず、2回目以降のように(配列[1]以上のもの)として扱われているようなのです。そのようなことは、起こりうるのでしょうか?
直接にGmailに送られているメールではなく、POPのメールを受信できる設定にして、Gmailで受信しているので、また、フォームのデータ自体は相互に大変似ているので、そのようなことが起こってしまっているのでしょうか?
・また、Gmailの他のアカウントで、同じPOPメールを、同じ方法で受信した人(別の担当者)が、このプログラムを実行すると、メールのIDが異なったものとなってしまいます。てっきりグローバルに一意のものかと思っていたのですが、確かに受信の仕方なども違いますし、そうなってしまうのかなと思います。IDが一意という前提で、IDが重複するものは取得しない、という形で重複を避けてえいるのですが、これが使えなくなります。日付・秒などで、一意に管理するしかないかなと(受信した秒が同じだとアウトですが)思っています。 そのような方法くらいしかないでしょうか。
・あと疑問なのが、Gmail上で検索した条件と、GAS上で検索した条件とを、同じにした場合、結果は同じなのでしょうか。どうも違っているように見えるのですが。
・あと検索でスレッドを取得した時、同じスレッドではあるが検索条件には合わないメールは、選択されたスレッドの中には入ってこないのでしょうか(はじかれる)。しかしそうすると、付与される配列番号は、同スレッドの中で、はじかれたメールに付与されていたはずの番号が欠番となり、後ろのメールの配列番号が前に詰められるのでしょうか。
いろいろ記載してすみません、一つでも分かるとありがたいです。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
・漏れがないようメールを受信し、重複がないよう管理したい
・スレッドとメッセージの関係(配列番号付与など)を理解し、プログラムを修正したい
GAS
1以下、今回の質問の要点ではないのですが、参考までに記載しておきます。 2function ContactMailTko()は、もともとのもの 3function ContactMailTko2()は、どうも検索から漏れてしまうメールがあるので、個別に取得するようなものを作ってみました。これだと、欲しい、該当するものだけでなく、2回目以降のスレッドのものもなぜか、取得されていて出てきてしまいます。検索条件では、-FW, -Fwd, -(返信メール等で送信元となるメールアドレス), などとしているので、本来、検索されてこないものが、同スレッドで取り込まれてきているようです。(ということは、検索条件に合致しないものも、同スレッドというだけで、取り込まれているのかな、と考えます) 4 5ソースコード 6 7 8function ContactMailTko() { 9 10 //メールを検索 11 const query = 'subject:"■東京:お問い合わせ" -RE -Fwd -FW to:XXX.co.jp newer_than:15d';// 12 const start = 0; 13 const max = 5; 14 15 //メール取得 16 const threads = GmailApp.search(query, start, max); 17 const messagesForThreads = GmailApp.getMessagesForThreads(threads); 18 19 //Excel を参照 20 const activeSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); // 現在のSpreadSheetを取得 21 const sheet = activeSpreadSheet.getSheetByName('ALL'); // シート(SpreadSheetの下のタブ名を指定) 22 23 //Excel を参照し、以前に同じIDがあるか調べる 24 const hasId = id => { 25 const data = sheet.getRange(1,4,sheet.getLastRow() ).getValues(); 26 return data.flat().includes(id); 27 } 28 29 //各メールの要素と、本文の中の必要要素を、取得して、IDが重複しないもののみ、記載していく 30 31 32 for(const messages of messagesForThreads){ 33 // for(const message of messages){ 34 35 // メールの要素である本文全体をPlainTextで取得 36 // let plainBody = message.getPlainBody(); 37 //console.log(plainBody); 38 39 let plainBody = messages[0].getPlainBody(); 40 41 //各メールの本文の中の必要要素を取得していく 42 43 // 会社名 44 let company = plainBody.match(/■ 貴社名・団体名:(.*)/); 45 if (company == null) company = '' 46 else company = company[1]; 47 // 担当者 48 let person = plainBody.match(/■ ご担当者名:(.*)/); 49 if (person == null) person = '' 50 else person = person[1]; 51 52 // tel 53 let tel = plainBody.match(/■ 電話番号\(半角\):(.*)/); 54 if (tel == null) tel = '' 55 else tel = "'" + tel[1]; 56 57 // fax 58 let fax = plainBody.match(/■ FAX:(.*)/); 59 if (fax == null) fax = '' 60 else fax = "'" + fax[1]; 61 62 // mailaddress 63 let mailaddress = plainBody.match(/■ メールアドレス:(.*)/); 64 if (mailaddress == null) mailaddress = '' 65 else mailaddress = mailaddress[1]; 66 67 // officeaddress 68 let officeaddress = plainBody.match(/■ 住所:(.*)/); 69 70 if (officeaddress == null) officeaddress = '' 71 else officeaddress = officeaddress[1]; 72 73 // sodannaiyo 74 let sodannaiyo = plainBody.match(/■ ご要望・ご質問:[\s\S]*■ 貴社名・団体名:/m); 75 if (sodannaiyo == null) sodannaiyo = '' 76 else sodannaiyo = sodannaiyo[0].replace('■ ご要望・ご質問:','').replace('\r\n■ 貴社名・団体名:',''); 77 78 // contactmethod 79 let contactmethod = plainBody.match(/【 ご希望の連絡方法 】 (.*)/); 80 if (contactmethod == null) contactmethod = '' 81 else contactmethod = contactmethod[1]; 82 // inquirypurpose 83 let inquirypurpose = plainBody.match(/■お問い合わせ内容(.*)/); 84 if (inquirypurpose == null) inquirypurpose = '' 85 else inquirypurpose = inquirypurpose[1]; 86 // zip 87 let zip = plainBody.match(/■ 郵便番号:(.*)/); 88 if (zip == null) zip = '' 89 else zip = "'" + zip[1]; 90 91 // inquirypurpose 92 let kojinjyoho = plainBody.match(/■ 個人情報の取り扱い:(.*)/); 93 if (kojinjyoho == null) kojinjyoho = '' 94 else kojinjyoho = inquirypurpose[0]; 95 96 // const id = message.getId(); 97 const id = messages[0].getId(); 98 if(hasId(id)) continue; //IDが重複しないもののみ記載していく 99 100 //Excel への入力 101 // sheet.appendRow([message.getSubject(),message.getDate(),message.getBody(),message.getId(),company,person,tel,fax,mailaddress,officeaddress,sodannaiyo,contactmethod,inquirypurpose,,,,zip,kojinjyoho]) 102 103 sheet.appendRow([messages[0].getSubject(),messages[0].getDate(),messages[0].getBody(),messages[0].getId(),company,person,tel,fax,mailaddress,officeaddress,sodannaiyo,contactmethod,inquirypurpose,,,,zip,kojinjyoho]) 104 105 //} 106 } 107} 108 109 110 111function ContactMailTko2() { 112 113 //メールを検索 114 const query = 'subject:"■東京:お問い合わせ" -RE -Fwd -FW to:XX.co.jp newer_than:5d';// 115 const start = 0; 116 const max = 5; 117 118 //メール取得 119 const threads = GmailApp.search(query, start, max); 120 const messagesForThreads = GmailApp.getMessagesForThreads(threads); 121 122 //Excel を参照 123 const activeSpreadSheet = SpreadsheetApp.getActiveSpreadsheet(); // 現在のSpreadSheetを取得 124 const sheet = activeSpreadSheet.getSheetByName('Tko'); // シート(SpreadSheetの下のタブ名を指定) 125 126 //Excel を参照し、以前に同じIDがあるか調べる 127 const hasId = id => { 128 const data = sheet.getRange(1,4,sheet.getLastRow() ).getValues(); 129 return data.flat().includes(id); 130 } 131 132 //各メールの要素と、本文の中の必要要素を、取得して、IDが重複しないもののみ、記載していく 133 134 135 for(const messages of messagesForThreads){ 136 for(const message of messages){ 137 138 // メールの要素である本文全体をPlainTextで取得 139 let plainBody = message.getPlainBody(); 140 //console.log(plainBody); 141 142 // let plainBody = messages[0].getPlainBody(); 143 144 //各メールの本文の中の必要要素を取得していく 145 146 // 会社名 147 let company = plainBody.match(/■ 貴社名・団体名:(.*)/); 148 if (company == null) company = '' 149 else company = company[1]; 150 // 担当者 151 let person = plainBody.match(/■ ご担当者名:(.*)/); 152 if (person == null) person = '' 153 else person = person[1]; 154 155 // tel 156 let tel = plainBody.match(/■ 電話番号\(半角\):(.*)/); 157 if (tel == null) tel = '' 158 else tel = "'" + tel[1]; 159 160 // fax 161 let fax = plainBody.match(/■ FAX:(.*)/); 162 if (fax == null) fax = '' 163 else fax = "'" + fax[1]; 164 165 // mailaddress 166 let mailaddress = plainBody.match(/■ メールアドレス:(.*)/); 167 if (mailaddress == null) mailaddress = '' 168 else mailaddress = mailaddress[1]; 169 170 // officeaddress 171 let officeaddress = plainBody.match(/■ 住所:(.*)/); 172 173 if (officeaddress == null) officeaddress = '' 174 else officeaddress = officeaddress[1]; 175 176 // sodannaiyo 177 let sodannaiyo = plainBody.match(/■ ご要望・ご質問:[\s\S]*■ 貴社名・団体名:/m); 178 if (sodannaiyo == null) sodannaiyo = '' 179 else sodannaiyo = sodannaiyo[0].replace('■ ご要望・ご質問:','').replace('\r\n■ 貴社名・団体名:',''); 180 181 // contactmethod 182 let contactmethod = plainBody.match(/【 ご希望の連絡方法 】 (.*)/); 183 if (contactmethod == null) contactmethod = '' 184 else contactmethod = contactmethod[1]; 185 // inquirypurpose 186 let inquirypurpose = plainBody.match(/■お問い合わせ内容(.*)/); 187 if (inquirypurpose == null) inquirypurpose = '' 188 else inquirypurpose = inquirypurpose[1]; 189 // zip 190 let zip = plainBody.match(/■ 郵便番号:(.*)/); 191 if (zip == null) zip = '' 192 else zip = "'" + zip[1]; 193 194 // inquirypurpose 195 let kojinjyoho = plainBody.match(/■ 個人情報の取り扱い:(.*)/); 196 if (kojinjyoho == null) kojinjyoho = '' 197 else kojinjyoho = inquirypurpose[0]; 198 199 const id = message.getId(); 200 //const id = messages[0].getId(); 201 if(hasId(id)) continue; //IDが重複しないもののみ記載していく 202 203 //Excel への入力 204 sheet.appendRow([message.getSubject(),message.getDate(),message.getBody(),message.getId(),company,person,tel,fax,mailaddress,officeaddress,sodannaiyo,contactmethod,inquirypurpose,,,,zip,kojinjyoho]) 205 206 // sheet.appendRow([messages[0].getSubject(),messages[0].getDate(),messages[0].getBody(),messages[0].getId(),company,person,tel,fax,mailaddress,officeaddress,sodannaiyo,contactmethod,inquirypurpose,,,,zip,kojinjyoho]) 207 208 } 209 } 210} 211### 試したこと 212 213console.log() 214や内容を変えて、いろいろ試し中。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/15 16:17
2022/10/17 02:49
2022/11/11 15:15