前提・実現したいこと
テイクアウト注文メールが自動転記される、スプレッドシート予約表を作りたいです。
困っていること
G列の、商品名を正確に取得することができません。
###試したこと
①matchを使用したら、
1つ目の商品名しか取得できませんでした。
②ご教示いただいたmatchALLをそのまま貼り付けたら、
やり方が悪いのか、エラーが出ました。
③本屋さんで見つけた、splitを使用したら、
なぜか2文字目の一文字しか取得できませんでした。
###実際のコード
②splitを使用したコードを記載します。
1function myFunction() { 2 // 検索条件に該当するスレッド一覧を取得 3 var threads = GmailApp.search('subject: 新規注文番号 -label:転記済'); 4 5 // スレッドを一つずつ取り出す 6 threads.forEach(function(thread) { 7 // スレッド内のメール一覧を取得 8 var messages = thread.getMessages(); 9 10 // メールを一つずつ取り出す 11 messages.forEach(function(message) { 12 // メール本文を取得 13 var plainBody = message.getPlainBody(); 14 15 // 来店場所を取り出す 16 var basyo = plainBody.match(/来店地を選ぶ↓:(.*)/); 17 18 // 来店日付を取り出す 19 var hiduke = plainBody.match(/来店日を選ぶ↓(.*)/); 20 21 // 来店時間を取り出す 22 var jikan = plainBody.match(/来店時間を選ぶ↓(.*)/); 23 24 // 番号を取り出す 25 var bangou = plainBody.match(/新しい注文:#(.*)/); 26 27 // 氏名を取り出す 28 var shimei = plainBody.match(/(.*)様/); 29 30 // 合計を取り出す 31 var goukei = plainBody.match(/合計金額:(.*)/); 32 33 // 商品名を取り出す 34 var syohin = plainBody.split('】')[1] 35 .split('==========')[0]; 36 37 38 // 書き込むシートを取得 39 var sheet = SpreadsheetApp.getActive().getSheetByName('自動予約表2'); 40 41 // 最終行を取得 42 var lastRow = sheet.getLastRow() + 1; 43 44 // セルを取得して値を転記 45 sheet.getRange(lastRow, 1).setValue(basyo[1]); 46 sheet.getRange(lastRow, 2).setValue(hiduke[1]); 47 sheet.getRange(lastRow, 3).setValue(jikan[1]); 48 sheet.getRange(lastRow, 4).setValue(bangou[1]); 49 sheet.getRange(lastRow, 5).setValue(shimei[1]); 50 sheet.getRange(lastRow, 6).setValue(goukei[1]); 51 sheet.getRange(lastRow, 7).setValue(syohin[1]); 52 }); 53 54 // スレッドに転記済ラベルを付ける 55 var label = GmailApp.getUserLabelByName('転記済'); 56 thread.addLabel(label); 57 }); 58}
###以下は、過去の質問ログです。
(papinianusさんが、以下の質問に対応したコードを回答くださっており、どなたかの参考になるかもしれないので、念のためログとして残しております)
注文メールの中身が、1種類だけの時は処理できるのですが、2種類以上の商品だと、2種類目以降が取得されません。
該当のソースコード
function myFunction() { // 検索条件に該当するスレッド一覧を取得 var threads = GmailApp.search('subject: 新規注文番号 -label:転記済'); // スレッドを一つずつ取り出す threads.forEach(function(thread) { // スレッド内のメール一覧を取得 var messages = thread.getMessages(); // メールを一つずつ取り出す messages.forEach(function(message) { // メール本文を取得 var plainBody = message.getPlainBody(); // 来店場所を取り出す var basyo = plainBody.match(/来店地を選ぶ↓:(.*)/); // 来店日付を取り出す var hiduke = plainBody.match(/来店日を選ぶ↓(.*)/); // 来店時間を取り出す var jikan = plainBody.match(/来店時間を選ぶ↓(.*)/); // 氏名を取り出す var shimei = plainBody.match(/(.*)様/); // 商品名を取り出す var syohin = plainBody.match(/】(.*)/); // 個数を取り出す var kosuu = plainBody.match(/X (.*)/); // オプションを取り出す var hukusai = plainBody.match(/オプション↓: (.*)/); // 書き込むシートを取得 var sheet = SpreadsheetApp.getActive().getSheetByName('自動予約表'); // 最終行を取得 var lastRow = sheet.getLastRow() + 1; // セルを取得して値を転記 sheet.getRange(lastRow, 1).setValue(basyo[1]); sheet.getRange(lastRow, 2).setValue(hiduke[1]); sheet.getRange(lastRow, 3).setValue(jikan[1]); sheet.getRange(lastRow, 4).setValue(shimei[1]); sheet.getRange(lastRow, 5).setValue(syohin[1]); sheet.getRange(lastRow, 6).setValue(kosuu[1]); sheet.getRange(lastRow, 7).setValue(hukusai[1]); }); // スレッドに転記済ラベルを付ける var label = GmailApp.getUserLabelByName('転記済'); thread.addLabel(label); }); }
このコードで実行すると、A 列の連番が維持できないですよね。
メールのテキストもコピペできないです。
希望する回答が提供される質問になっているか今一度ご確認ください。
今のところ、やりかたさえ分かれば自分で 0 から書けるってことで理解してます。
ご返信ありがとうございます。
A列の連番は、手作業で振ってしまっていました。紛らわしく申し訳ありません。このあと質問をわかりやすく修正します。
また、当方プログラムも書いたことがなく、以下コードを見よう見まねで書き換えました。
https://valmore.work/how-to-copy-gmail-message-to-spreadsheet/
このteratailという場所も、お店のお客さんに教えてもらって初投稿したリテラシーレベルです。(ということを初期の投稿では書いていたのですが、回答がゼロ件だった時、質問の再編集をするようteratailさんに提案され、この辺りの補足情報は蛇足かと考え、丸々削除してしまいました。情報不足で申し訳ありません。)
回答2件
あなたの回答
tips
プレビュー