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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

正規表現

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

Q&A

解決済

1回答

2455閲覧

GASにて本文から特定の文字を抽出しつつ、特定の文字以降を削除する方法

Sntaro

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

正規表現

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

0グッド

0クリップ

投稿2022/04/26 08:54

GASでGmailからスプレッドシートへ特定の文字を取得させる件についてです。
似た件名の内容を見ましたが、解決できませんでしたので、お力をお貸しください。

メール本文から特定の文字を抽出しつつ、不要なものを削除したいのですが、どこに何を入れたら良いかわかりません。

ーーーメール本文ここからーーー
予約サイト  :A(非会員)
宿泊者氏名  :山田 太郎(ヤマダ タロウ)
チェックイン :2022年04月26日(火)
チェックアウト:2022年04月27日(水)
部屋タイプ  :B
室数     :1室
大人     :2名
子供     :0名
ーーーメール本文ここまでーーー

上記メール本文から下記を取得したいのですが(実現したいこと)、
A 山田 太郎 2022年04月26日(火) 2022年04月27日(水) B 1室 2名 0名

現在は下記のようになってしまいます。
A(非会員) 山田 太郎(ヤマダ タロウ) 2022年04月26日(火) 2022年04月27日(水) B 1室 2名 0名

・A(非会員) の(非会員)
・山田 太郎(ヤマダ タロウ) の(ヤマダ タロウ)
を切り取った状態で取得するにはどのようにすればよろしいでしょうか。

該当のソースコード

GAS

1var sheet = SpreadsheetApp.getActiveSheet(); 2var data = sheet.getRange(7, 21, sheet.getLastRow() + 1).getValues(); 3 4// myFunctionでもいいけど変更 5function getMail01test(){ 6var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 7 8// シート名を記入。例えば2020とか 9var objSheet = objSpreadsheet.getSheetByName("シート作成済"); 10var sheet = SpreadsheetApp.setActiveSheet(objSheet); 11var start = 0; 12 13// 取得するメールの最大件数 14var max = 100; 15 16// Gmailのラベル名をここに記載 17var threads = GmailApp.search('label:ラベル作成済 is:unread',start,max); 18 19// 最後の行探してそれ以降に追加 挿入開始位置 20var Messages = GmailApp.getMessagesForThreads(threads); 21var row = sheet.getLastRow() + 1; 22 23// 見出しがあるためシートの1行目を固定 24sheet.setFrozenRows(1); 25 26// メールから日時、ご注文番号、品名、商品カテゴリ、ご請求金額合計、担当者名、印刷部数を取り出す// 27for(var i = 0; i < Messages.length; i++) { 28for(var j = 0; j < Messages[i].length; j++) { 29var id = Messages[i][j].getId(); 30if(!hasId(id)){ 31var body = Messages[i][j].getPlainBody(); 32var date = threads[i].getMessages()[j].getDate(); 33 34var regOTA = new RegExp('予約サイト  :' + '.*?' + '\r'); 35if(body.match(regOTA) === null) return; 36var OTA = body.match(regOTA)[0].replace('予約サイト  :', '').replace('\r', ''); 37var regName = new RegExp('宿泊者氏名  :' + '.*?' + '\r' ); 38if(body.match(regName) === null) return; 39var Name = body.match(regName)[0].replace('宿泊者氏名  :', '').replace('\r', ''); 40var regCheckin = new RegExp('チェックイン :' + '.*?' + '\r' ); 41if(body.match(regCheckin) === null) return; 42var Checkin = body.match(regCheckin)[0].replace('チェックイン :', '').replace('\r', ''); 43var regCheckout = new RegExp('チェックアウト:' + '.*?' + '\r' ); 44if(body.match(regCheckout) === null) return; 45var Checkout = body.match(regCheckout)[0].replace('チェックアウト:', '').replace('\r', ''); 46var regRoomtype = new RegExp('部屋タイプ  :' + '.*?' + '\r' ); 47if(body.match(regRoomtype) === null) return; 48var Roomtype = body.match(regRoomtype)[0].replace('部屋タイプ  :', '').replace('\r', ''); 49var regRoomnumber = new RegExp('室数     :' + '.*?' + '\r' ); 50if(body.match(regRoomnumber) === null) return; 51var Roomnumber = body.match(regRoomnumber)[0].replace('室数     :', '').replace('\r', ''); 52var regAdult = new RegExp('大人     :' + '.*?' + '\r' ); 53if(body.match(regAdult) === null) return; 54var Adult = body.match(regAdult)[0].replace('大人     :', '').replace('\r', ''); 55var regChild = new RegExp('子供     :' + '.*?' + '\r' ); 56if(body.match(regChild) === null) return; 57var Child = body.match(regChild)[0].replace('子供     :', '').replace('\r', ''); 58 59id 60 61// 同じメールを読み込まないように、メッセージを既読にする 62// threads[i].markRead(); 63// スレッドに処理済みラベルを付ける 64var label = GmailApp.getUserLabelByName('処理済み'); 65threads[i].addLabel(label); 66 67// それぞれの項目をセルを指定してスプレッドシートへ転記 68sheet.getRange(row,1).setValue(date); 69sheet.getRange(row,2).setValue([OTA]); 70sheet.getRange(row,4).setValue([Name]); 71sheet.getRange(row,5).setValue([Checkin]); 72sheet.getRange(row,6).setValue([Checkout]); 73sheet.getRange(row,7).setValue([Roomtype]); 74sheet.getRange(row,8).setValue([Roomnumber]); 75sheet.getRange(row,9).setValue([Adult]); 76sheet.getRange(row,10).setValue([Child]); 77sheet.getRange(row,13).setValue([id]); 78row++ 79 80// 受信日時順の昇順に並び替え 81var range = sheet.getRange("A:U"); 82range.sort({column: 1, ascending: true}); 83} 84} 85} 86} 87 88// 同じメッセージIDがある場合は読み込まないように 89function hasId(id) { 90var hasId = data.some(function(array, i, data) { 91return (array[0] === id); 92}); 93return hasId; 94} 95 96// この記述で正規表記? 97function fetchData(str, pre, suf) { 98var reg = new RegExp(pre + '.*?' + suf); 99var data = str.match(reg)[0] 100.replace(pre, '') 101.replace(suf, ''); 102return data; 103} 104 105

試したこと

・RegExp内のコードを変更

GAS

1var regOTA = new RegExp('予約サイト  :' + '.*?' + '\('); 2if(body.match(regOTA) === null) return; 3var OTA = body.match(regOTA)[0].replace('予約サイト  :', '').replace('\(', '');

・fetchData内のコードを変更

GAS

1function fetchData(str, pre, suf) { 2var reg = new RegExp(pre + '.*?' + suf); 3var data = str.match(reg)[0] 4.slice(\() 5.replace(pre, '') 6.replace(suf, ''); 7return data; 8}

sliceをいろいろな箇所に挿入して試したりしてみましたが、正直よくわかっていないです。
ご協力よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

カッコが半角だとわかっているなら

javascript

1... 2var OTA = body.match(regOTA)[0].replace('予約サイト  :', '').replace(/\(.+\)/, "").replace('\r', ''); 3... 4var Name = body.match(regName)[0].replace('宿泊者氏名  :', '').replace(/\(.+\)/, "").replace('\r', ''); 5...

もしわからないのであれば

javascript

1... 2var OTA = body.match(regOTA)[0].replace('予約サイト  :', '').replace(/[\((].+[\))]/, "").replace('\r', ''); 3... 4var Name = body.match(regName)[0].replace('宿泊者氏名  :', '').replace(/[\((].+[\))]/, "").replace('\r', ''); 5...

「該当のソースコード」のここだけを編集したら動くかと思います。
ここだけしか確かめていないですがいかがでしょうか。

投稿2022/04/26 11:41

ib-k

総合スコア111

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

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

Sntaro

2022/04/27 05:34

できました!一人でずっと悩んでいたので、お伺いできてよかったです。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問