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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

11478閲覧

GASの正規表現で特定の文字以降を取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/06/21 06:52

編集2021/06/21 12:48

https://tonari-it.com/gas-regexp-replace-new/ を参考にしています。

// やりたいこと var id = plainBody.match(/ID : (.*)/); console.log(id); // ID :92829184129492 の `ID :`を削除 or `ID :`以降を取得したいです

正規表現 + replaceで書いてみたら TypeError: plainBody.match(...).replace is not a function とエラーが出てします。

var companyName = plainBody.match(/会社名 : (.*)/).replace("会社名 : ", "");

正規表現単体で文字列は取得出来ています。
会社名 : 株式会社テラテイル

function myFunction() { // 検索条件に該当するスレッド一覧を取得 var threads = GmailApp.search('subject:【会社名】問い合わせありがとうございます'); // スレッドを一つずつ取り出す threads.forEach(function(thread) { // スレッド内のメール一覧を取得 var messages = thread.getMessages(); // メールを一つずつ取り出す messages.forEach(function(message) { // メール本文を取得 var plainBody = message.getPlainBody(); var id = plainBody.match(/ID : (.*)/); var companyName = plainBody.match(/会社名 : (.*)/); var personName = plainBody.match(/担当者名 : (.*)/); var serviceName = plainBody.match(/サービス名 : (.*)/); var date = message.getDate() var sheet = SpreadsheetApp.getActive().getSheetByName('シート1'); date = Utilities.formatDate(date,"JST", "yyyy/MM/dd"); console.log("dateは" + date); var lastRow = sheet.getLastRow() + 1; // セルを取得して値を転記 sheet.getRange(lastRow, 1).setValue(id[0]); sheet.getRange(lastRow, 2).setValue(companyName[0]); sheet.getRange(lastRow, 3).setValue(personName[0]); sheet.getRange(lastRow, 4).setValue(serviceName[0]); sheet.getRange(lastRow, 5).setValue(date); console.log("date②は" + date); }); }); }
// gamail 件名:【会社名】..問い合わせありがとうございます 日時:timestamp 本文 ID : 92829184129492 会社名 : 株式会社teratail 担当者名 :テラ・テイル サービス名 : 有料サービスA テキストテキストテキスト... テキストテキストテキスト... テキストテキストテキスト...

特定の文字列削除はreplace以外で行うのでしょうか。

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

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

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

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

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

guest

回答3

0

ベストアンサー

質問を書き直していただいたので、本当にやりたいことがわかりました。

GAS

1 var idMatched = plainBody.match(/(ID\s*:\s*)(.*)/); 2 var id = idMatched ? idMatched[2] : ''; 3 4 var companyMatched = plainBody.match(/(会社名\s*:\s*)(.*)/); 5 var companyName = companyMatched ? companyMatched[2] : ''; 6 7 var personMatched = plainBody.match(/(担当者名\s*:\s*)(.*)/); 8 var personName = personMatched ? personMatched[2] : ''; 9 10 var serviceMatched = plainBody.match(/(サービス名\s*:\s*)(.*)/); 11 var serviceName = serviceMatched ? serviceMatched[2] : '';

これで希望の文字列が得られます。
matchの返却値は配列で、最初の要素はマッチした文字列全体、2番目以降には正規表現内で()で括った部分が順番に入ります。マッチする部分が無かった場合、matchnullを返します。その場合、たとえばidMatched[2]を実行してしまうとエラーになってしまいますので、判定を入れてエラーを防いでいます。

投稿2021/06/22 02:30

編集2021/06/22 05:11
itagagaki

総合スコア8402

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

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

退会済みユーザー

退会済みユーザー

2021/06/22 05:08

ありがとうございます。
guest

0

Markdown記法を使用するため新しく回答します。
もし、メール本文からID、会社名、担当者名、サービス名の項目をすべて削除したいということなら、matchでマッチしたパターンを取り出してもしょうがないですね。

それならこういうやり方ができると思います。

JavaScript

1let plainBody = "ID : 012345\n会社名 : 株式会社テラテイル\n担当者名 : itagagaki\nサービス名 : 回答\nその他の本文"; 2console.log(plainBody); 3let replaced = plainBody.replace(/(ID|会社名|担当者名|サービス名) : (.*)/g, ''); 4console.log(replaced);

投稿2021/06/21 08:12

itagagaki

総合スコア8402

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

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

退会済みユーザー

退会済みユーザー

2021/06/21 08:45

この場合 ID : 92829184129492 は正規表現 /[a-zA-Z0-9]+/g で抜き取る形なのでしょうか??
itagagaki

2021/06/21 09:20

IDを抜き取りたいということは質問には書かれていませんでしたよね。 ですから、本当に何をしたいのかを明確にしてください。
退会済みユーザー

退会済みユーザー

2021/06/21 09:25

>本当に何をしたいのかを明確にしてください。 var id = plainBody.match(/ID : (.*)/); console.log(id); // ID :92829184129492 の `ID :`を削除 or `ID :`以降を取得したいです
itagagaki

2021/06/21 09:49

えーと、これまでの経緯からして、きっと、それだけではないでしょう。 私はエスパーではありませんが、推測すると、 sheet.getRange(lastRow, 1) に /ID : (.*)/ でマッチした部分の()でキャプチャされた部分を sheet.getRange(lastRow, 2) に /会社名 : (.*)/ でマッチした部分の()でキャプチャされた部分を ~(以下同様)~ 入れたいということなのではありませんか? それなら質問で述べられている「特定の文字を削除したい」とは違う話になりますね。 もし違ったら訂正してください。
退会済みユーザー

退会済みユーザー

2021/06/21 09:52

> 入れたいということなのではありませんか? そうです > それなら質問で述べられている「特定の文字を削除したい」とは違う話になりますね。 `ID :`以降を取得するのが正しいのでしょうか
guest

0

replaceで削除をするという考えはいいのですが、matchは配列を返します。配列に対してreplaceメソッドは無いよということでしょう。

投稿2021/06/21 07:02

itagagaki

総合スコア8402

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

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

退会済みユーザー

退会済みユーザー

2021/06/21 07:12

なるほです。 正しいやり方としては 1:配列の中から削除する 2:配列を文字列に置換して削除する のどちらかなのでしょうか? ググっても正規表現関連の内容をちゃんと読めないので微妙な理解になっています
itagagaki

2021/06/21 07:20

仮に対象の文字列の中に、検索したいパターンが複数存在していたら、どうしたいですか? それこそがmatchが配列を返す理由です。
退会済みユーザー

退会済みユーザー

2021/06/21 07:45

> 仮に対象の文字列の中に、検索したいパターンが複数存在していたら、どうしたいですか? 会社名以外も取得したいです。 例えば『担当者名 : 』などです。 この場合はmatchを使うという理解です。大丈夫でしょうか
itagagaki

2021/06/21 07:51

検索したいパターンのすべてと、それぞれのパターンにマッチした部分をどうしたいのかを書き出してみてください。 その共通理解が無いと回答しようがありませんので。
退会済みユーザー

退会済みユーザー

2021/06/21 07:59

説明よりコードの方が伝わりやすいかと思いコードを追記しました。 このコードをメール件数分forで回す予定です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問