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

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

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

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

Q&A

1回答

656閲覧

知識がなくGメールから、自動でスプレッドシートに項目ごとに抽出したいので色々試しましたができません。どなたか助けてください。

diabolos.596

総合スコア0

Gmail

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

0グッド

0クリップ

投稿2023/02/14 12:09

編集2023/02/15 23:10

はじめまして。
当方知識が無いため色々調べ、コードを書いてみたのですが抽出できません。
どなたか知恵をお貸しいただけないでしょうか?

以下のようなメールから、自動でスプレッドシートに項目ごとに抽出したいと思っております。

[フォームズ]------------------------------
ID:S000000 投稿がありました

[投稿日時] 2023年00月00日 10時00分00秒
お申込日 : 00月00日

■お名前
山田 一郎 様

■お名前(フリガナ)
ヤマダ イチロウ 様

■ご住所※全角25文字以内(半角不可)
[郵便番号] : 〒062-0000
[都道府県] : 北海道
[市区町村] : 札幌市○○区
[町名番地] : 美園○条○丁目○-○
[建物名] : ハイツ○○-101

■電話番号区分1
3.携帯

■連絡
3:夕方以降
======================

function getMail(){
var sheet = SpreadsheetApp.getActive().getSheetByName('フォームズ回答');
var start = 0;
var max = 500;
var threads = GmailApp.search('label:【フォームズ】 is:unread',start,max);
var row = sheet.getLastRow() + 1;

for(var n in threads){
var the = threads[n];

var msgs = the.getMessages();
for(m in msgs){
var msg = msgs[m];
var body = msg.getBody();
var res = body.split('<br/>\n')
var date = msg.getDate();

sheet.getRange(row,1).setValue(date);

var customer = res[res.indexOf('■お名前')+1]
sheet.getRange(row,2).setValue(customer);

var name = res[res.indexOf('■お名前(フリガナ)')+1]
sheet.getRange(row,3).setValue(name);

var address1 = plainBody.match(/[都道府県] :(.*)/);
// Logger.log(address1);

var address2 = plainBody.match(/[市区町村] : (.*)/);
// Logger.log(address2);

var address3 = plainBody.match(/[町名番地] : (.*)/);
// Logger.log(address3);

var address4 = plainBody.match(/[建物名] : (.*)/);
// Logger.log(address4);

var tel = res[res.indexOf('■電話番号区分1')+1]
sheet.getRange(row,3).setValue(tel);

var call = res[res.indexOf('■連絡')+1]
sheet.getRange(row,3).setValue(call);

}

the.markRead();
row++;
}
Utilities.sleep(1000);
}

======================
抽出したい情報は、
■お名前の一つ下の行の情報(様を抜きたい)
■お名前(フリガナ)の一つ下の行の情報(様を抜きたい)
■ご住所※全角25文字以内(半角不可)の
[郵便番号] : 以降の情報
[都道府県] : 以降の情報
[市区町村] : 以降の情報
[町名番地] :以降の情報
[建物名] : 以降の情報
■電話番号区分1の一つ下の行の情報
■連絡の一つ下の行の情報
を横並びにセルに抽出し自動で追加されていくようにしたいと考えております。

住所以外でやってみましたが、ひとつづつではなく1メール全部1セルに入っており
住所のコードを足すとエラーは出ないのですが何も反映されなくなりました。

お手数ですがどのようにGASのコードを書けばよいか
ご教授お願いいたします。

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

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

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

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

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

kappa

2023/02/14 13:49

ざっくりとした流れとしては、 ・自分のニーズにあったなんらかのイベントでgas関数を呼ぶ。 ・gas関数でGmailApp→threads→thread→messages→message→bodyとたどりメール本文を取得。 ・メール本文を正規表現処理などして各項目の値を切り出す。 ・それをスプレッドのセルにセットする。 ということになります。 各流れの詳細・コード例などは順番に詰めていくしかないでしょう。 全体を例示しようとしたらそれなりの長さになってしまいますね。
diabolos.596

2023/02/15 23:07

ご回答ありがとうございます。試したコード追記いたしましたので お助けいただけるようでしたら、ぜひとも知恵をお貸し願いたいです。 何卒よろしくお願いいたします。
kappa

2023/02/16 01:24

実際に走らせて検証してないので、ざっと見の推測で話しますが、 var res = body.split('<br/>\n') これでメールを行ごとに分割したいようですが、できないと思いますよ。 できないのでres[0]に全文が入るだけだと思います。 また、コードを修正して行ごとの配列ができたとしても、 res[res.indexOf('■お名前(フリガナ)')+1] これで「■お名前~(フリガナ)」のあるインデックスは得られないですよ。 indexOfがヒットしないので-1が返り、それに+1しているのでインデックスは0、つまり全文が入っているres[0]を参照することになる。 結果「ひとつづつではなく1メール全部1セルに入っており」となるんだと思います。 それから、 var address1 = plainBody.match(/[都道府県] :(.*)/); これの「plainBody」はどこから持ってきたものですか? たぶんempty状態でなににもmatchしないので、「エラーは出ないのですが何も反映されなく」となると思います。
diabolos826

2023/02/16 22:33

ありがとうございます。 似たような事例のWEBからコピペしていたのですが 知識がなく、具体的にどのように書いたらいいかもわかりません。 どうかお助けいただけませんでしょうか? よろしくお願いいたします。
kappa

2023/02/17 12:24

正規表現を使えば文字パターンを扱えそうだとわかっているわけですよね。 正規表現なんて文字の組み合わせ、特別な意味を持ついくつかの制御文字、挙動を指示するいくつかのフラグ、それらを使ったいくつかの関数、それだけだしその使い方を説明するドキュメントは公式・非公式にたくさんある。 ネットでそれっぽいコードを見つけてコピペしました、動きません、どうか助けてください。 数日前にこのサイトに登録したばかりの新参者なんだけど、今のソフト業界ってこれが普通なの?
guest

回答1

0

抽出部分はこんな感じのコードでどうでしょう。
ただ、
・一致するものがなくてmatchがnullを返した場合のことは考慮してない。
・環境によっては改行は\nじゃなくて\r\nとかかもしれない。
など現実の運用ではもう少し修正が必要かもしれません。

javascript

1const body = msg.getPlainBody(); 2const customer = body.match(/(?<=■お名前\n)(.*)(?=\s様\n)/)[0]; 3const name = body.match(/(?<=■お名前(フリガナ)\n)(.*)(?=\s様\n)/)[0]; 4const address1 = body.match(/(?<=\[郵便番号\] : )(.*)(?=\n)/)[0]; 5const address2 = body.match(/(?<=\[都道府県\] : )(.*)(?=\n)/)[0];

正規表現がどんな結果を返すかは、
JavaScript正規表現テスター - instant tools
とか
正規表現チェッカー | WWWクリエイターズ
とかでいろいろ試してみるとおもしろいと思いますよ。

投稿2023/02/19 14:47

kappa

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問