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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

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

Google Apps Script

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

2回答

4557閲覧

gasスクリプトに日時検索コードを加え実行すると、検索条件と無関係なメールが取得されてしまいます。

takoyaki87

総合スコア19

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

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

Google Apps Script

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

1グッド

2クリップ

投稿2020/03/15 01:00

ネットフリマで売れた商品の売上管理表を、スプレッドシートで作っております。商品が売れるたび購入通知をgmailで取得し、メールに記載されている商品情報 (商品名・購入された日時など)がシート上に自動追記されるプログラムをGASで作っております。
商品情報が重複で取得されないよう、トリガーで1時間ごとにプログラムを実行し、毎度1時間前以内に送られてきた購入通知のメールだけを取得したいです。

1時間ごとに、過去1時間以内の5件分の新規購入の通知メールのみを取得するコード「strTerms」を作成しました。
ですが、このコードを実際の売上管理表のスクリプトに加えると、うまく作動しません。

現時点でわかっていることは、

________________


この日時指定コード (strTerms) が正常に作動するかテスト用のスクリプトで試したところ、問題なく作動しました。なので日時指定のコードに書き間違いはないということ。


実際の売上管理表のスクリプトは上記のstrTermsがない状態だとちゃんと動き、過去5件分の購入通知メールを正常に取得してくれます。なので管理表のコード自体にも間違いはないということ。


上記2つの、

・日時指定コード strTerms (間違いなし)
・売上管理表のスクリプト (同じく間違いなし)

を組み合わせて実行すると、検索条件に合致していないまったく無関係なメールが取得され、スプレッドシート上にその内容が表記されてしまうということ。

__________________

以上3つの事実から、検索コードの書き方か、あるいは環境設定に問題があるのかなと考えているのですが、これについてよろしければアドバイスをいただけないでしょうか?

すみませんがよろしくお願いします。


実際の検索条件のコードで、「,strTerms」の直前には半角スペースを入れています。なのでその点のケアレスミスもないです。

以下実際のコードです。

function autoRefresh() { //受信日時指定 const date = new Date() ;//現在時刻を取得 const unixTime = date.getTime();//UNIX TIMEに変換 const now = Math.floor(unixTime/1000); //ミリ秒を秒に変換 const term = now - 3600; //現在時刻から1時間(3600秒)前 const termStr = term.toString(); //検索期間を文字列に変換 const strTerms = 'after:'+ termStr; //検索条件:termの期間条件に合致するメール const condition = ("subject:発送をお願いします from:no-reply@mercari.jp" ,strTerms); //半角スペースで連結    const thread = GmailApp.search(condition, 0, 5); //条件にマッチしたスレッドを取得 const messages = GmailApp.getMessagesForThreads(thread); //スレッドからメールを取得する for(var i=0; i<messages.length; i++){ var nichiji = messages[i][0].getDate(); var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet.getLastRow(); var plainBody = messages[i][0].getPlainBody(); var name =plainBody.match(/商品名.*/); var price =plainBody.match(/商品価格.*/); var site =plainBody.match(/メルカリをご利用.*/); sheet.getRange(lastRow+1,2).setValue("=ROW()-75"); sheet.getRange(lastRow+1,3).setValue(name[0].replace('商品名 : ', '')); sheet.getRange(lastRow+1,5).setValue(site[0].replace('をご利用いただきありがとうございます。', '')); sheet.getRange(lastRow+1,7).setValue(nichiji); sheet.getRange(lastRow+1,8).setValue(price[0].replace(/[^0-9]/g, '')); sheet.getRange(lastRow+1,9).setValue(0); sheet.getRange(lastRow+1,2,1,15).setBorder(true, true, true, true, true, true); } }
s.k👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

試していませんが読んで思ったことだけ。

const condition = ("subject:発送をお願いします from:no-reply@mercari.jp" ,strTerms); //半角スペースで連結

これって半角スペースで連結されてなくないですか?例えば

const condition = "subject:発送をお願いします from:no-reply@mercari.jp "+strTerms;

とか。
あとこれ日時として「Tue Apr 10 2018 00:00:00 GMT+0900 (JST)」みたいな形式で渡されてると思いますが、Gmailってこれちゃんとパースしてくれるんでしたっけ?
自分のGmailで検索しても引っかかりませんが…。

Googleの解説によれば、

例: after:2004/04/16 例: after:04/16/2004

こういった書き方がされていますね。

そして少し調べると、こんな記事が出てきました。
UNIX秒のまま渡したほうが良いのでは?

投稿2020/03/15 02:04

Takumiboo

総合スコア2534

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

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

Takumiboo

2020/03/15 02:05

ちなみにGAS未経験なので的はずれなことを言っていたらすみません。
takoyaki87

2020/03/15 06:01

ご回答ありがとうございます。 ご指摘いただいた通りに検索条件の書き方を直してみました。するとちゃんと動作しました! 半角スペースで連結されていなかったようで、とんだ思い違いをしておりました、、。 教えてくださりありがとうございますm(_ _)m 他にもいただいたアドバイスを踏まえ、もう少し研究して取り組んでみます。 同じくご回答してくださったdraq様にも大変感謝しております。今回は、先にご回答してくださったTakumiboo様のコメントをベストアンサーとさせていただければと思います。 お二方ともありがとうございました。
guest

0

検索条件に合致していないまったく無関係なメールが取得され

というのが、どんなメールが取得されてしまうのかよくわからないので具体的な情報が欲しいです。


それはともかく、GmailApp.search()は条件に一致するメールを含むスレッドを検索しますが、スレッドに含まれるメールすべてが条件に一致するわけではありません。

そのため、

JavaScript

1const messages = GmailApp.getMessagesForThreads(thread);

で取得した、messagesには条件に一致しないメールも含まれるので、必要に応じて再度フィルタをかける必要があります。


質問内容とはずれますが、GAS のトリガーは実行ログを見る限り指定した時刻から数分遅れで実行されることも多いので、この仕様だと取りこぼしが発生しそうな気がします。

投稿2020/03/15 02:18

draq

総合スコア2573

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

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

takoyaki87

2020/03/15 05:55

ご回答ありがとうございます。 先ほど間違いが見つかりました。検索条件の書き方に問題があったようで、それを直したところひとまず正常に動きました。 また、頂いたアドバイスの通り、このままでは通知メールの取りこぼしが出そうなので対策を考える必要がありそうだなと思いました。わざわざご指摘ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問