見出し画像

Gmailで受信したメール本文をスプレッドシートに転記するGASを修正 その1

とあるサイトで販売している商品が売れると、Gmailで自動送信メールを受信する仕組みになっている。

メールの本文には顧客と購入内容の情報があり、傾向分析のためにいくつかの情報をピックアップして、スプレッドシートの表に転記する。という作業が毎日発生していた。

何とかこれを自動化したいと思い、GAS(Google Apps Script)とChatGPTを駆使して仕組みを構築した。

駄目元でChatGPTに聞いてみた所、「このスクリプトで実現出来ます」という返答が返ってきた。文章から指定した項目の文字列や数値を抽出して転記の対象にする。なんて事は出来ないと思っていたので、「本文の●行目」といった指定のし方になると予想していたが、思ったより柔軟に対応出来る事に少し感動した。

コードの条件は以下の通り
・未読メールを対象とする
・メールの件名(完全一致)
・抽出する文字列や数値の条件
・指定スプレッドシートの指定シートの最下行に転記
・処理後にメールを既読にする

このスクリプトを定時で実行した結果、そのメールに対する返信や転送でも引用部分を抽出してしまう問題が発生。

1つの注文に対して、返信や転送のたびに抽出してカウントしてしまうので、実績が水増しされる事になる。

既存の抽出条件↓

 const searchQuery = 'is:unread subject:"件名" ';

返信・転送のメールは除外するようChatGPTに指示して、以下の様に追記。

const searchQuery = 'is:unread subject:"件名" -subject:Re: -subject:FW:';

これでもなぜか返信・転送メールを抽出してしまうため、ChatGPTに相談。
Gmailのメールに付与されるメールIDを記録して、処理済のメールIDのスレッドは無視する。という手法はどうか?と提案を受けたので実装してみる。

// 既に処理したメールのIDを取得
const processedIds = processedSheet.getDataRange().getValues().flat();

(抽出処理)

// メールのIDをProcessedEmailsシートに記録
processedSheet.appendRow([id]);

新設したシートをメールID記録用に指定し、そのシートを非表示に。
しかし、これを施してもなお返信・転送メールが抽出対象となる事象は終わらず。

抽出された転送メールを確認した所、先頭には「FW:」ではなく「Fwd:」となっている事が判明。また、ChatGPTによると、「Re:」「FW:」などの除外条件は大文字小文字を区別するため、除外したいメールがフィルタリングから漏れる可能性があるとの事。

除外したいメールが抽出されるたびに条件を追加していくのも面倒なので、いっその事「本来の件名の前に何か付いた場合は除外する」という条件にする事に。

// 何らかの文字列が前方にあれば除外する正規表現を設定
const regexAnyPrefixWithColon = /^.+: /;

これにより、ようやく期待する結果が得られるはずだが、しばらくサンプルを受信してみないと答え合わせが出来ないので、本記事はここまでとする。

2023/9/16追記

従来であれば確実に重複して記録されていたであろうメールを何通か受信したが、スプレッドシート上で重複していないため、本記事の対策は成功したようだ。

この記事が気に入ったらサポートをしてみませんか?