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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2596閲覧

Google Apps ScriptでGmailから必要な情報を切り取ってスプレッドシートに転記したい(複数行の情報の扱いについて)

Kotapi

総合スコア5

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

1クリップ

投稿2022/11/05 11:07

編集2022/11/05 13:59

前提

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)

です。

Cocode👏を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

正解コード例

javascript

1// 本文からメッセージを抽出 2let message = plainBody.match(/■メッセージ:([\s\S]*)/);

正規表現の解説

  • [\s\S]*
    • 空白、改行、タブなども含むすべての文字の0または1文字以上の連続

投稿2022/11/07 21:53

編集2022/11/07 22:08
Cocode

総合スコア2314

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

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

Kotapi

2022/11/08 02:45 編集

ありがとうございます。 matchに対して単行でしか実行できないのかと思い込んでいましたが、正規表現で改行を含むよう指定することができるのですね。 初歩的な質問ではありましたが、大変勉強になりました。 上記方法にて指定し、調整を行い無事に実装できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問