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

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

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

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

JavaScript

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

Q&A

解決済

1回答

1666閲覧

GASでGmailに届いたたのめーるからの注文明細をスプレッドシートに書き出したい

fumien

総合スコア3

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2021/07/17 09:39

編集2021/07/17 14:48

GASでGmailに届いたたのめーるからの注文明細をスプレッドシートに書き出したく下記の様なコードを書きました。
ちなみにたのめーるからのメールも下記にあります。
このGASの記述で問い合わせ番号、購入部署、お支払金額はスプレッドシートへの書き出しは出来るのですが、
ご提供価格(税抜)が取って来れません。
正規表現の問題かもしれませんがコピペしてみても書き出しが出来ないので何か他の問題があるのかもしれないと考えています。
ちなみvar m=[...body.matchAll(/お支払い金額(税込):(.?)\r\n/g)];のお支払金額を商品名に代えると書き出しできます。
ただ商品名分だけお問い合わせ番号等も再度スプレッドシートに書き出されてしまい行が増えてしましますのでそこも改善出来るならしたいと考えています。
何かアドバイスございましたら助言いただけましたら幸いでございます。

タイトル:【アサヒ商会 たのめーるMA】ご注文ありがとうございました

本文:この度はたのめーるをご利用頂き、誠にありがとうございます。
以下の内容でご注文を承りました。


お問い合わせ番号:U12345678(お問い合わせの際にご連絡ください)
ご注文日時:2021年7月14日 10時43分
購入部署:総務課
お支払い金額(税込):1,000円

■お届け予定とご注文明細

【在庫商品】以下の商品は、2021年7月15日にお届け予定です。

商品名:マグエックス 両面カラーマグネットシート 300×100×1mm 赤/白 MSR-10RW 1枚
お申込番号:123-4560
ご提供価格(税抜):334円 ご注文数:1 金額(税抜):334円

商品名:マグエックス マグネット粘着付シート 強力カットタイプ 25×25×1.2mm MSWFPC-12 1パック(48片)
お申込番号:012-3456
ご提供価格(税抜):333円 ご注文数:1 金額(税抜):333円

商品名:TANOSEE 合皮製ネームカードホルダー ヨコ型 ストラップ付 ブラック 1個
お申込番号:000-0000
ご提供価格(税抜):333円 ご注文数:2 金額(税抜):33③円

小計(税抜) :1000円
課税対象額 :1000円
消費税 :100円
合計(税込) :1,100円
(10% 対象
小計(税抜) :1,100円
消費税 :100円
合計(税込) :1,100円)

GAS

1コード

//シートを取得する。
var sheet = SpreadsheetApp.getActiveSheet();

function getMail() {
var threads = GmailApp.search('subject:たのめーる');
// メール検索する文字列:今回はタイトルにたのめーると入っているもの
var str = "subject:たのめーる";

// 上記の文字列に合致するスレッドを取得(とりあえず100件取得します)
var threads = GmailApp.search(str,0,100);

// メッセージを取得する
var messages = GmailApp.getMessagesForThreads(threads);

for(var i = 0; i < messages.length; i++){
for(var j = 0; j < messages[i].length; j++){

//メッセージIDを取得(重複を防ぐため) var messageId = messages[i][j].getId(); //もし、スプレッドシートに存在したら実行しない if(!hasId(messageId)){ //メール受信日時を取得  //var mailDate = messages[i][j].getDate(); // メッセージの本文をプレーンテキストで取得+取得出来てるかをlooger.log確認 var body = messages[i][j].getPlainBody(); Logger.log(body); //正規表現をマッチさせ変数に格納 var No = /お問い合わせ番号*:(.*?)\r\n/.test(body)? RegExp.$1 : ''; var Time = /ご注文日時*:(.*?)\r\n/.test(body)? RegExp.$1 : ''; var Part = /購入部署*:(.*?)\r\n/.test(body)? "'"+RegExp.$1 : ''; var Money = /お支払い金額(税込)*:(.*?)\r\n/.test(body)? "'"+RegExp.$1 : ''; // elemntを複数取得し、そのままセルに書き込むようにする var m=[...body.matchAll(/お支払い金額(税込)*:(.*?)\r\n/g)]; for (var k=0; k<m.length; k++) { var Element=(m[k][1]); //セルに行を追加する(ID、日時問い合わせ番号、ご注文日時、購入部署、お支払金額) sheet.appendRow([messageId,No,Time,Part,Money,Element]); } } }

}
}

// 同じIDのメールは転記しないようにするため、すでにIDがあるかどうか調べる関数
function hasId(id){
//今回は1列目にメールIDを入れていくので1列目から探す
var data = sheet.getRange(1, 1,sheet.getLastRow(),1).getValues();
var hasId = data.some(function(value,index,data){
//コールバック関数
return (value[0] === id);
});
return hasId;
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

(なるべく元のコードを変えない形の回答を念頭に置いたものですが)

・「ご提供価格(税抜)」の()は半角括弧なので、それぞれ「\」でエスケープする必要があると思います。
・価格だけを抜き出したいので、注文番号の前の空白で区切ります。([^\s])

js

1 // *TOS記載* elemntを複数取得し、そのままセルに書き込むようにする 2 var m = [...body.matchAll(/ご提供価格(税抜):([^\s]+)/g)]; 3 Logger.log(m) 4 5ログ出力: 6>>> [[ご提供価格(税抜)334, 334], [ご提供価格(税抜)333, 333], [ご提供価格(税抜)333, 333]]

これで
m[0][1],
m[1][1],
m[2][1]
とすれば一応それぞれの価格が順番に取り出せると思います。


商品名分だけお問い合わせ番号等も再度スプレッドシートに書き出されてしまい行が増えてしましますのでそこも改善出来るならしたいと考えています。

考え方の問題ですが、商品の数だけ行を記録してよいのではないでしょうか。
質問文掲載の例ですと、商品数が3つなので、画像のように明細を3つ記録するという形式です。
(A列からE列は同じ内容の繰り返し、F列以降が各商品の明細となります)

イメージ説明

もし、「1つの注文メールに1行だけしか使いたくない」というのならば、たとえば複数の商品明細の配列を文字列化して1つのセルに格納する方法もあるかもしれません。
しかし、複数行に明細を記録した方が
・フィルタしやすい
・各商品のデータが分かりやすい
というメリットがあると思います。

投稿2021/07/17 13:41

編集2021/07/17 13:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fumien

2021/07/17 14:46

ありがとうございました! 半角括弧には「\」でエスケープする必要があるんですね! 勉強になりました! 確かに明細としてはそっちのが使いやすいかもしれませんね! 一つのメールで一つの行にした方がいいかと頭が固くなっていました! 色々なやり方を考えてみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問