Q&A
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をいろいろな箇所に挿入して試したりしてみましたが、正直よくわかっていないです。
ご協力よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/04/27 05:34