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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

2911閲覧

GAS:gmail 30分以内に受信した未読メールの内容をメール送信する

hbng

総合スコア1

Gmail

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/06/22 09:12

前提・実現したいこと

30分以内に受信したgmailの中から、未読かつ特定の送信者のメール内容を、指定アドレスに送信する。

発生している問題・エラーメッセージ

エラーは出ませんが、送信されたメールの中に既読のものがあったり、条件に当てはまるはずの未読メールが送信されていなっかたりします。

該当のソースコード

gas

1function unread_forward() { 2 3 // Gmailから特定条件のスレッドを検索しメールを取り出す 4 //受信日時指定 5 const date = new Date() ;//現在時刻を取得 6 const unixTime = date.getTime();//UNIX TIMEに変換 7 const now = Math.floor(unixTime/1000); //ミリ秒を秒に変換 8 const term = now - 18000; //現在時刻から30分(1800秒)前 9 const termStr = term.toString(); //検索期間を文字列に変換 10 11 //検索条件指定 12 const srchCondition = [ //検索条件を配列で格納 13 'is:unread', 14 'from:hoge@gmail.com' 15 ].join("\u0020"); //半角スペースで連結 16 17 const strTerms = 'after:'+ term +' '+ srchCondition; //検索条件:termの期間に、srchConditionの条件に合致するメール 18 const myThreads = GmailApp.search(strTerms, 0, 30); //条件にマッチしたスレッドを取得 19 const myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する 20 21 22 //転送メール 23 var forwardTo = 'hoge2@gmail.com'; //転送先アドレス 24 var forwardSubject = '転送メール件名'; //転送メール件名 25 var forwardBody = ''; //転送メール本文 26 27 //1スレッドずつ確認 28 for(var i=0; i < myMsgs.length; i++) { 29 30 var messageId = myMsgs[i][0].getId(); //メッセージIdを取得 31 var messageSender = myMsgs[i][0].getFrom(); //最後のメール送信者を取得 32 var messageDate = myMsgs[i][0].getDate(); //メッセージの受信日時を取得 33 var messageSubject = myMsgs[i][0].getSubject(); //メッセージの件名を取得 34 var messageBody = myMsgs[i][0].getPlainBody(); //メッセージの本文を取得 35 forwardBody = 36 'メッセージID : ' + messageId + '\r\n' + 37 '送信者 : ' + messageSender + '\r\n' + 38 '送信日 : ' + messageDate + '\r\n' + 39 '件名 : ' + messageSubject + '\r\n' + 40 '内容 : \r\n' + messageBody + '\r\n' ; //転送用のメッセージ本文を作成 41 42 43 //転送メール送信 44 GmailApp.sendEmail(forwardTo, forwardSubject, forwardBody); 45 } 46 //Logger.log(forwardBody); 47 48 49}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

draq

2020/06/22 15:47

特定の送信者からのメールを転送するのが目的の様に読めますが、Gmailのフィルタで転送設定するんじゃだめなんでしょうか。
hbng

2020/06/23 08:42 編集

draq様 質問ありがとうございます。 残念ながら、フィルタだけでは適わない条件なのです。
hbng

2020/06/23 08:54

桁違いの記述ミスです ✕ const term = now - 18000 ◯ const term = now - 1800
guest

回答1

0

ベストアンサー

const term = now - 18000 ・・・桁間違い

は、取り合えず記載ミスとして、

var messageId = myMsgs[i][0] の記述だと、各スレッドの1番目のメールとなります。
よって、myMsgs[i][j] みたいにして 各スレッド、各スレッド内の各メール 両方 for で回してあげる必要があります。

また、検索条件の is:unread は、未読メールのあるスレッドを抽出してしまうので、これだと抽出されたスレッド内の既読メールまで 対象となってしまいます。

なんか面倒な感じなのですが、各メールに対して isUnread() で 未読判定をして 未読なら 処理を実行というコードにすると希望の動きになるかと。

参考
https://be-do.jp/blog/9391

投稿2020/06/22 14:32

sawa

総合スコア3002

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

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

hbng

2020/06/23 09:53

sawa様 回答ありがとうございます。 ご指摘内容、リンク先の情報が大変参考になります。 桁間違いしておりました????すみません。 対象のメールアカウントの場合は、1スレッドには1メールしか来ないものだと思い込んでおりました。 実際には、別の用件のメールでも、自動で複数メールがスレッド化されておりました。 受信トレイの設定が「スレッド表示させない設定」なことも災いし、気づくことが出来ませんでした。 スレッドと、スレッド内各メールも巡回させ、isUnread()判定させるようにしてみたいと思います。
hbng

2020/06/23 10:00

追加の質問になります。 お分かりになりましたら、お教えください、 >各メールに対して isUnread() で 未読判定をして 未読なら 処理を実行 これを実現したく、「//1スレッドずつ確認」の箇所を下記のような書き方にしたのですが、ifの行が「TypeError: Cannot read property 'isUnread' of undefined」となってしまいます。 //1スレッドずつ確認 for(var i=0; i < myMsgs.length; i++) { for(var j=0; j < myMsgs.length; j++) { if (myMsgs.isUnread()) { var messageId = myMsgs[i][j].getId(); var messageDate = myMsgs[i][j].getDate();    ・    ・    ・
sawa

2020/06/23 10:12

スレッドの配列の中にメールの配列があるので、その書き方だと for(var i=0; i < myMsgs.length; i++) { for(var j=0; j < myMsgs[i].length; j++) { if (myMsgs[i][j].isUnread()) { こんな感じになるかと思います。
hbng

2020/06/25 06:14

sawa様 追加質問への返答も頂きありがとうございます! 回答頂いた通りの記述に直し、エラーがでなくなりました。
hbng

2020/06/25 06:27

ご丁寧に対応頂き感謝いたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問