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

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

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

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

Q&A

解決済

3回答

831閲覧

Gmaiの内容を自動でスプレッドシートに反映させたいです。

Sakanakun_SA

総合スコア4

Google Apps Script

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

0グッド

0クリップ

投稿2021/08/29 10:53

編集2021/09/04 00:30

###実現したいこと

一気に購入した場合下記のような購入履歴が届きます。
下記のようなGmailが届いたとき、メールの内容を自動でスプレッドシートに反映させたいです。

各それぞれのセルに 1.商品名 2.申し込み番号 3.小計(税込み)をスプレッドシートに反映
させたいのですが、1つのメール内に同じような内容があった場合反映されなくて困っています。
どのようにすればよいのでしょうか?

ーーーーーーーーーーーーーーーーーーーーーーー

「現場のチカラ」 【養生テープ】 半透明 幅50mm×50m アスクル 1巻
お申込番号:000000
販売価格(税込) 注文数量 小計(税込)
¥477 3 ¥1,431

伊藤忠リーテイルリンク OPP袋(テープなし) L判写真用 横95×縦135mm 透明袋 1袋(100枚入)
お申込番号:111111
販売価格(税込) 注文数量 小計(税込)
¥160 2 ¥320

「現場のチカラ」 厚手布両面テープ 幅25mm×15m Monf(モンフ) 古藤工業 1巻
お申込番号:222222
販売価格(税込) 注文数量 小計(税込)
¥376 3 ¥1,128

エプソン 写真用紙ライト〈薄手光沢〉KL100SLU L判 1箱(100枚入)
お申込番号:333333
販売価格(税込) 注文数量 小計(税込)
¥671 2 ¥1,342

セイコーエプソン 純正 インクカートリッジ KETA-5CL 1パック(5色入) KEN・TAK(ケンダマ・タケトンボ)シリーズ
お申込番号:444444
販売価格(税込) 注文数量 小計(税込)
¥3,135 1 ¥3,135

ーーーーーーーーーーーーーーーーーーーーーーーーーーー

###コード

function Main2() { // 検索条件に該当するスレッド一覧を取得 var threads = GmailApp.search('【アスクル】ご注文ありがとうございました') // スレッドを一つずつ取り出す threads.forEach(function(thread) { // スレッド内のメール一覧を取得 var messages = thread.getMessages(); // メールを一つずつ取り出す messages.forEach(function(message) { // メール本文を取得 var plainBody = message.getPlainBody();      // メール本文が取得できているかログに出力して確認 Logger.log(plainBody); //注文番号を取り出す  var order_number = plainBody.match(/お申込番号:(.*)/); // 商品の価格を取り出す var order_pay = plainBody.match(/販売価格(税込) 注文数量 小計(税込)[\s]*¥(.*)[\s\S]* ]/); // 商品名を取り出す var order_name = plainBody.match(/ [\s]*(.*)[\s\S]*お申込番号/); // 書き込むシートを取得 var sheet = SpreadsheetApp.getActive().getSheetByName('アスクル自動化'); // 最終行を取得 var lastRow = sheet.getLastRow() + 1; // セルを取得して値を転記 sheet.getRange(lastRow, 1).setValue(order_pay[1] ) sheet.getRange(lastRow, 2).setValue(order_number[1]); sheet.getRange(lastRow, 3).setValue(order_name[1]);; }); }); }

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

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

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

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

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

y_waiwai

2021/08/29 11:26

コードを提示しましょう そのうえで、どういう場合にどういうふうにうまくいかないのかを説明してください
guest

回答3

0

ベストアンサー

メール本文 log内容をありがとうございます。
メール本文 log内容の文で試してみました。
多分出来ると思います。

GAS

1function Main2() { 2 // 検索条件に該当するスレッド一覧を取得 3 var threads = GmailApp.search("【アスクル】ご注文ありがとうございました"); 4 5 // スレッドを一つずつ取り出す 6 threads.forEach(function (thread) { 7 // スレッド内のメール一覧を取得 8 var messages = thread.getMessages(); 9 10 // メールを一つずつ取り出す 11 messages.forEach(function (message) { 12 // メール本文を取得 13 var plainBody = message.getPlainBody(); 14 // メール本文が取得できているかログに出力して確認 15 Logger.log(plainBody); 16 17 //plainBodyから複数の商品を取得 18 var items = plainBody 19 .replace(/ー{4,}/, "") 20 .match(/[\s\S]*?\s+¥.*/gi) 21 .filter(function (str) { 22 return /お申込番号(\s+)?:/.test(str); 23 }); 24 items.forEach(function (item) { 25 //注文番号を取り出す 26 var order_number = item 27 .match(/お申込番号(\s+)?:.*/)[0] 28 .replace(/^[\s\S]*?:/, "") 29 .trim(); 30 console.log(`注文番号は、【${order_number}】`); 31 32 // 商品の価格を取り出す 33 var order_pay = item.replace(/^[\s\S]*小計(税込).*/, "").trim(); 34 console.log(`商品の価格は、【${order_pay}】`); 35 36 // 商品名を取り出す 37 var order_name = item 38 .replace(/^[\s\S]*?[image(\s+)?:[^]]*]/, "") 39 .replace(/<http[^>]*>/gi, "") 40 .replace(/お申込番号(\s+)?:[\s\S]*/, "") 41 .replace(/[[^:]*:[^]]*]/g, "") 42 .trim(); 43 console.log(`商品名は、【${order_name}】`); 44 45 // 書き込むシートを取得 46 var sheet = SpreadsheetApp.getActive().getSheetByName("アスクル自動化"); 47 48 // 最終行を取得 49 var lastRow = sheet.getLastRow() + 1; 50 51 // セルを取得して値を転記 52 sheet.getRange(lastRow, 1).setValue(order_pay); 53 sheet.getRange(lastRow, 2).setValue(order_number); 54 sheet.getRange(lastRow, 3).setValue(order_name); 55 }); 56 }); 57 }); 58} 59

投稿2021/09/02 16:50

fake_shibe

総合スコア806

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

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

Sakanakun_SA

2021/09/02 23:56

ご回答いただきまして、ありがとうございました! 無事に反映させることができました! 本当に何度もありがとうございました。
guest

0

こちらもエラーになるかもしれませんが、別のコードを書いてみました。
メールの内容(plainBodyの値)は以下で試しています。

GAS

1` 2 ーーーーーーーーーーーーーーーーーーーーーーー 3 4 「現場のチカラ」 【養生テープ】 半透明 幅50mm×50m アスクル 1巻 5 お申込番号:000000 6 販売価格(税込) 注文数量 小計(税込) 7 ¥477 3 ¥1,431 8 9 伊藤忠リーテイルリンク OPP袋(テープなし) L判写真用 横95×縦135mm 透明袋 1袋(100枚入) 10 お申込番号:111111 11 販売価格(税込) 注文数量 小計(税込) 12 ¥160 2 ¥320 13 14 「現場のチカラ」 厚手布両面テープ 幅25mm×15m Monf(モンフ) 古藤工業 1巻 15 お申込番号:222222 16 販売価格(税込) 注文数量 小計(税込) 17 ¥376 3 ¥1,128 18 19 エプソン 写真用紙ライト〈薄手光沢〉KL100SLU L判 1箱(100枚入) 20 お申込番号:333333 21 販売価格(税込) 注文数量 小計(税込) 22 ¥671 2 ¥1,342 23 24 セイコーエプソン 純正 インクカートリッジ KETA-5CL 1パック(5色入) KEN・TAK(ケンダマ・タケトンボ)シリーズ 25 お申込番号:444444 26 販売価格(税込) 注文数量 小計(税込) 27 ¥3,135 1 ¥3,135 28 29 ーーーーーーーーーーーーーーーーーーーーーーーーーーー`

もしかした成功するかもしれません。

GAS

1function Main2() { 2 // 検索条件に該当するスレッド一覧を取得 3 var threads = GmailApp.search("【アスクル】ご注文ありがとうございました"); 4 5 // スレッドを一つずつ取り出す 6 threads.forEach(function (thread) { 7 // スレッド内のメール一覧を取得 8 var messages = thread.getMessages(); 9 10 // メールを一つずつ取り出す 11 messages.forEach(function (message) { 12 // メール本文を取得 13 var plainBody = message.getPlainBody(); 14 // メール本文が取得できているかログに出力して確認 15 Logger.log(plainBody); 16 17 var items = plainBody 18 .replace(/ー{4,}/g, "") 19 .match(/[\s\S]*?\n{2,}/gi) 20 .filter(function (str) { 21 return str.length > 10; 22 }); 23 items.forEach(function (item, i) { 24 //注文番号を取り出す 25 var order_number = item 26 .match(/お申込番号(\s+)?:(\s+)?(.*)/)[0] 27 .replace(/お申込番号(\s+)?:(\s+)?/, "") 28 .trim(); 29 console.log(`注文番号は、【${order_number}】です。`); 30 31 // 商品の価格を取り出す 32 var order_pay = item.replace(/^[\s\S]*小計(税込)/, "").trim(); 33 console.log(`商品の価格は、【${order_pay}】です。`); 34 35 // 商品名を取り出す 36 var order_name = item.replace(/お申込番号(\s+)?:[\s\S]*/, "").trim(); 37 console.log(`商品名は、【${order_name}】です。`); 38 39 // 書き込むシートを取得 40 var sheet = SpreadsheetApp.getActive().getSheetByName("アスクル自動化"); 41 42 // 最終行を取得 43 var lastRow = sheet.getLastRow() + 1; 44 45 // セルを取得して値を転記 46 sheet.getRange(lastRow, 1).setValue(order_pay); 47 sheet.getRange(lastRow, 2).setValue(order_number); 48 sheet.getRange(lastRow, 3).setValue(order_name); 49 }); 50 }); 51 }); 52} 53

投稿2021/09/01 09:12

fake_shibe

総合スコア806

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

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

Sakanakun_SA

2021/09/01 10:57

再度ご回答いただきましてありがとうございます。 1つ表示がされましたが複数表示がされませんでした。 477 3 ¥1,431 1587828 「現場のチカラ」 【養生テープ】 若葉色 幅50mm×50m アスクル 1巻 という風に表示はされました! エラー表示はありませんでした。。 他の情報も表示されるようにしたいのですが可能でしょうか
fake_shibe

2021/09/01 12:06

var items = plainBody .replace(/ー{4,}/g, "") .match(/[\s\S]*?\n{2,}/gi) .filter(function (str) { return str.length > 10; }); console.log(`${items.length}個あります。`); として、どのような内容がログに表示されますか? また、 console.log(`注文番号は、【${order_number}】です。`); console.log(`商品の価格は、【${order_pay}】です。`); console.log(`商品名は、【${order_name}】です。`); で表示される内容は、 477 3 ¥1,431 1587828 「現場のチカラ」 【養生テープ】 若葉色 幅50mm×50m アスクル 1巻 一つだけでしょうか? 最後に、 // メール本文を取得 var plainBody = message.getPlainBody();      // メール本文が取得できているかログに出力して確認Logger.log(plainBody); のLogger.log(plainBody)で表示される内容を提示して頂くと助かります。
Sakanakun_SA

2021/09/02 01:28

再度回答していただいたのに申し訳ございません。 実行完了できたのは他のプログラムでして実際、コピーを作成して行った結果 TypeError: Cannot read property 'filter' of null と出ていまして、 .filter(function (str) { eturn str.length > 10; }); 部分でエラーがございました。 cosole.logで表示されている内容はありませんでした。 Logger.log(plainBody)で表示される内容はメール本文の内容そのまま表示されています。 見せることができないないようを控えてメール本文の編集をいたします。 何度も申し訳ございません。
guest

0

試していないので出来るかどうかわかりませんが、以下のようなコードで対応できるかもしれません。

GAS

1function Main2() { 2 // 検索条件に該当するスレッド一覧を取得 3 var threads = GmailApp.search("【アスクル】ご注文ありがとうございました"); 4 5 // スレッドを一つずつ取り出す 6 threads.forEach(function (thread) { 7 // スレッド内のメール一覧を取得 8 var messages = thread.getMessages(); 9 10 // メールを一つずつ取り出す 11 messages.forEach(function (message) { 12 // メール本文を取得 13 var plainBody = message.getPlainBody(); 14 // メール本文が取得できているかログに出力して確認 15 Logger.log(plainBody); 16 17 var items = plainBody.replace(/ー{3,}/g, "").match(/[\s\S]*?\s+¥.*/gi); 18 items.forEach(function (item) { 19 //注文番号を取り出す 20 var order_number = item 21 .match(/お申込番号:(.*)/)[0] 22 .replace(/お申込番号:/, "") 23 .trim(); 24 25 // 商品の価格を取り出す 26 var order_pay = item.replace(/^[\s\S]*注文数量\s+小計(税込)/, "").trim(); 27 28 // 商品名を取り出す 29 var order_name = item.replace(/お申込番号:[\s\S]*/, "").trim(); 30 31 // 書き込むシートを取得 32 var sheet = SpreadsheetApp.getActive().getSheetByName("アスクル自動化"); 33 34 // 最終行を取得 35 var lastRow = sheet.getLastRow() + 1; 36 37 // セルを取得して値を転記 38 sheet.getRange(lastRow, 1).setValue(order_pay); 39 sheet.getRange(lastRow, 2).setValue(order_number); 40 sheet.getRange(lastRow, 3).setValue(order_name); 41 }); 42 }); 43 }); 44} 45

投稿2021/08/31 17:24

fake_shibe

総合スコア806

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

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

Sakanakun_SA

2021/09/01 01:17

ご回答していただきましてありがとうございます! pypeError: Cannot read property '0' of null と出まして var order_number = item .match(/お申込番号:(.*)/)[0] ここの[0]に対するエラー表示がでてしまします、、。
fake_shibe

2021/09/01 09:06

メールの内容(plainBody)が以下の値で試してみましたが、こちらではエラーがでませんでした。 Logger.log(plainBody);で表示されるものを提示して頂くとこちらで検証が出来るようになります。 ` ーーーーーーーーーーーーーーーーーーーーーーー 「現場のチカラ」 【養生テープ】 半透明 幅50mm×50m アスクル 1巻 お申込番号:000000 販売価格(税込) 注文数量 小計(税込) ¥477 3 ¥1,431 伊藤忠リーテイルリンク OPP袋(テープなし) L判写真用 横95×縦135mm 透明袋 1袋(100枚入) お申込番号:111111 販売価格(税込) 注文数量 小計(税込) ¥160 2 ¥320 「現場のチカラ」 厚手布両面テープ 幅25mm×15m Monf(モンフ) 古藤工業 1巻 お申込番号:222222 販売価格(税込) 注文数量 小計(税込) ¥376 3 ¥1,128 エプソン 写真用紙ライト〈薄手光沢〉KL100SLU L判 1箱(100枚入) お申込番号:333333 販売価格(税込) 注文数量 小計(税込) ¥671 2 ¥1,342 セイコーエプソン 純正 インクカートリッジ KETA-5CL 1パック(5色入) KEN・TAK(ケンダマ・タケトンボ)シリーズ お申込番号:444444 販売価格(税込) 注文数量 小計(税込) ¥3,135 1 ¥3,135 ーーーーーーーーーーーーーーーーーーーーーーーーーーー`
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問