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

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

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

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

解決済

【GAS】メール本文内で、複数回出現する特定の文字列以降を、繰り返しスプレッドシートに転記

cardamon
cardamon

総合スコア4

Google Apps Script

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

2回答

0評価

2クリップ

611閲覧

投稿2021/12/27 02:45

編集2022/01/10 11:11

前提・実現したいこと

テイクアウト注文メールが自動転記される、スプレッドシート予約表を作りたいです。

▼注文メール
イメージ説明

▼理想のスプレッドシート
![イメージ説明

困っていること

G列の、商品名を正確に取得することができません。

###試したこと

①matchを使用したら、
1つ目の商品名しか取得できませんでした。
イメージ説明

②ご教示いただいたmatchALLをそのまま貼り付けたら、
やり方が悪いのか、エラーが出ました。

③本屋さんで見つけた、splitを使用したら、
なぜか2文字目の一文字しか取得できませんでした。
イメージ説明

###実際のコード
②splitを使用したコードを記載します。

Google

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 bangou = plainBody.match(/新しい注文:#(.*)/); // 氏名を取り出す var shimei = plainBody.match(/(.*)様/); // 合計を取り出す var goukei = plainBody.match(/合計金額:(.*)/); // 商品名を取り出す var syohin = plainBody.split('】')[1] .split('==========')[0]; // 書き込むシートを取得 var sheet = SpreadsheetApp.getActive().getSheetByName('自動予約表2'); // 最終行を取得 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(bangou[1]); sheet.getRange(lastRow, 5).setValue(shimei[1]); sheet.getRange(lastRow, 6).setValue(goukei[1]); sheet.getRange(lastRow, 7).setValue(syohin[1]); }); // スレッドに転記済ラベルを付ける var label = GmailApp.getUserLabelByName('転記済'); thread.addLabel(label); }); }

###以下は、過去の質問ログです。
(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); }); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

papinianus

2021/12/29 09:05

このコードで実行すると、A 列の連番が維持できないですよね。 メールのテキストもコピペできないです。 希望する回答が提供される質問になっているか今一度ご確認ください。 今のところ、やりかたさえ分かれば自分で 0 から書けるってことで理解してます。
cardamon

2022/01/10 10:45

ご返信ありがとうございます。 A列の連番は、手作業で振ってしまっていました。紛らわしく申し訳ありません。このあと質問をわかりやすく修正します。 また、当方プログラムも書いたことがなく、以下コードを見よう見まねで書き換えました。 https://valmore.work/how-to-copy-gmail-message-to-spreadsheet/ このteratailという場所も、お店のお客さんに教えてもらって初投稿したリテラシーレベルです。(ということを初期の投稿では書いていたのですが、回答がゼロ件だった時、質問の再編集をするようteratailさんに提案され、この辺りの補足情報は蛇足かと考え、丸々削除してしまいました。情報不足で申し訳ありません。)

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google Apps Script

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