前提
Google Apps Script(GAS)で、Gmailの内容を抽出して
スプレッドシートに転記する仕組みを作っています。
チャットボットから送信されたお問い合わせ内容をGmailに送信し
それをスプレッドシート上に転記する流れです。
GASでは、メールを検索し、本文を取得。
その中から
- 「名前:」に続く文字列
- 「電話番号:」に続く文字列
- 「メッセージ:」に続く文字列
を取得し、スプレッドシートに記入させたいと思っています。
一部の入力欄は複数行にわたって入力ができる仕様であり
入力時に改行したところはメールでも改行される仕組みです。
=====メール本文例=====
■名前:〇〇です
■電話番号:0123456789
■メッセージ:これは1行目です
これは2行目です
これは3行目です
1行飛ばして5行目です
================
↑このような状態でメールが届きます。
実現したいこと
実現したいことは以下の通りです
上記それぞれの項目をスプレッドシートに転記
スプレッドシートの1行目に見出しを作り
そこに「名前」「電話番号」「メッセージ」など各列の見出しを入れて準備完了。
そこに、メールから取得した情報を1行ずつ書き足していく仕組みです。
複数行の回答は改行を別の文字に置き換えて吐き出したい
回答内容に改行を含む場合は全ての行を取得し
半角スペースもしくは半角スラッシュに置き換えて吐き出したいです。
例えば上のメールの例でいうと、メッセージは
「これは1行目です/これは2行目です/これは3行目です//1行飛ばして5行目です」
上記のように1行にまとめたいという意図です。
※改行を置き換えるのは、下記のように1つかませるとできると思うので問題なさそうです
let message = strMessage.replace(/\r\n/, " / ");
発生している問題・エラーメッセージ
じゃあ何が問題かというと
メッセージ欄の1行目だけしか取得できず、改行後の内容を取得できないことです。
上のメールの例だと、メッセージ欄は「1行目です」のみ取得できて、それ以降が取得できない状況です。
該当のソースコード
省略部分は「特定の配信元アドレスから60秒以内に受信したメール」を検索条件に指定し、変数queryに代入する処理などを書いています。
JavaScript
1function myFunction2(){ 2 〜〜省略〜〜 3 4 let gmail = getGmail2(query); 5 let sheet = SpreadsheetApp.openById('ここにシートIDを入力'); 6 gmail.forEach(info => sheet.appendRow(info)); 7} 8 9function getGmail2(query) { 10 11 //検索条件にヒットしたメールを一覧化 12 let threads = GmailApp.search(query); 13 let gmailInfo = new Array(); 14 15 //件数分繰り返す 16 threads.forEach(function(thread) { 17 18 // スレッド内のメール一覧 19 let messages = thread.getMessages(); 20 21 // メールを一つずつ取り出す 22 messages.forEach(function(message) { 23 24 // 受信時刻(タイムスタンプ)を取得 25 let timestamp = message.getDate(); 26 27 // 本文丸ごと取得 28 let plainBody = message.getPlainBody(); 29 30 // 本文から名前を抽出 31 let name = plainBody.match(/名前:(.*)/); 32 33 // 本文から電話番号を抽出 34 let phoneNumber = plainBody.match(/電話番号:(.*)/); 35 36 // 本文からメッセージを抽出 37 let message = plainBody.match(/メッセージ:(.*)/); 38 39 //情報を二次元配列として格納 40 gmailInfo.push([timestamp,name[1],phoneNumber[1],message[1]]); 41 }); 42 }); 43 44 return(gmailInfo); 45}
試したこと
JavaScript
1console.log();
を使って、どこで躓いているかをチェックしました。
その結果、先にも述べた通り、メッセージの1行目のみしか取得していないことはわかりました。
matchを使うと1行しか取得できないのですね。
考えてみれば
plainBody.match(条件);
ではその行に限って文字列を取得するのは当然でしたね。
仮にそれ以降の行も取得してしまうと、nameの中身は
text
1[〇〇です 2■電話番号:0120114514 3■メッセージ:これは1行目です 4これは2行目です 5これは3行目です 6 71行飛ばして5行目です]
上記のように不要な情報も拾ってしまいます。
では、今の状況でどうにかして複数行にわたるメッセージを取得できたらいいのですが、どうすれば良いのでしょうか。
補足情報
チャットボットからGmailへの通知メッセージを変えることは可能です。
(例えばメッセージ欄の末尾に何か文字や記号を入れるなど)
これを目印にして「メッセージ:」からその記号までを取得する、というようなやり方でも構いません。
上手いやり方でも、ちょっと泥臭いやり方でも
解決方法があれば教えていただきたいです。
作業環境は
- MacBook Air (M1, 2020)
- MacOS Monterey (Version12.3.1)
- Google Chrome (Version 107.0.5304.87)
です。

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