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

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

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

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

Gmail

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

626閲覧

[Javascript]GASプログラムのミス

watzkang98

総合スコア8

Google スプレッドシート

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

Gmail

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2019/11/28 14:47

編集2019/12/04 05:49

前提・実現したいこと

ド初心者です。
メールフォームから来た未読メールをスプレッドシートに抽出・記入するシステムを改変し、
以下の助言の元、うまくいったと思いましたが、今度は未読のみならず、既読(抽出・記入済み)のものも抽出するようになってしまいました。
https://teratail.com/questions/225631
問題個所は私が改変した部分だとわかっているのですが、どう修正したものかと頭を抱えております。
どなたかご教授願います。。。

発生している問題

Gmailにて未読のみ抽出したいが、既読(抽出・記入済み)のものが追加で挿入されるようになってしまった。 例 AAAAA (メールフォームでBBBBBを送信) ↓ AAAAA AAAAA BBBBB (メールフォームでさらにCCCCCを送信) ↓ AAAAA AAAAA BBBBB AAAAA BBBBB CCCCC 理想形 AAAAA BBBBB CCCCC

###あたりを付けている修正箇所
>>>>><<<<<で囲っていますが、ここの部分をlengthのままの上で、resultArrとの値と一致させればいいと想定しています。
「returnData関数内でmsgs.length件数分resultArrへpushしている」ということから、returnData関数のmsgsにthreadないしはlength(変数)を紐づけて上げられればいいのかな?とも...
いかんせんド初心者なもので...申し訳ないです。

GAS

function getMailandInsert(){ var sheet = SpreadsheetApp.getActiveSheet(); // start potision var start = 0; // 取得するメールの最大件数 var max = 5; // スプレッドシートに挿入するデータ列数 var insertCol = 6; // 条件にマッチする受信メールを取得 var threads = GmailApp.search('is:unread from:(aaa@aaa.co.jp) subject:(wakaran)',start,max); // 条件にマッチしたスレッド数 var length = threads.length; // データ保存先となるシートの最終行。すなわち挿入開始位置 var row = sheet.getLastRow() + 1; // 取得したメール内容を格納する用の配列 var resultArr = new Array(); for( var n in threads ){ var the = threads[n]; // スレッド内のメールを取得 var msgs = the.getMessages(); // スレッド内のメールを解析して resultArr に格納 returnData(msgs, resultArr); // 取得したスレッドを既読にする the.markRead(); Utilities.sleep(1000); } if( length != 0 ){ sheet.getRange(row, 1, msgs.length, insertCol).setValues( resultArr ); // データ保存 //getRangeの中身は(最終行+1,1,スレッド数,6) //>>>>>>>>length->msgs.lengthに改変<<<<<これが問題。unreadを無視しているのが原因。lengthのまま、lengthの値とresultArrの値を一致させる必要。 } } function returnData(msgs, resArray) { for( m in msgs ){ try{ var tempArray = new Array(); var msg = msgs[m]; // メールの日付 var date = msg.getDate(); // メールの送信元アドレス var from = msg.getFrom(); // メールの件名 var subject = msg.getSubject(); // メール本文をPlainBodyで取得 var body = msg.getPlainBody(); // bodyをXMLパーサーで解析 var xml = XmlService.parse(body); // XML解析結果のルート要素を取得 var root = xml.getRootElement(); // XML内の各子要素を指定してその値を取得。 var hinichi = root.getChild("hinichi").getText(); var zzz = root.getChild("zzz").getText(); var xxx = root.getChild("xxx").getText(); var ddd = root.getChild("ddd").getText(); var vvv = root.getChild("vvv").getText(); var etc = root.getChild("etc").getText(); // 各値を配列に格納 tempArray[0] = hinichi; tempArray[1] = zzz; tempArray[2] = ddd; tempArray[3] = eisei; tempArray[4] = vvv; tempArray[5] = etc; // 配列をpushで末尾に追加 resArray.push(tempArray); }catch(e){ Logger.log("Error: " + e); } } }

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

chrome最新版

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

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

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

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

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

guest

回答1

0

ベストアンサー

既に既読になっているスレッドでも新しくメッセージが来ればスレッドも未読になります。
GmailMessage#isUnreadをチェックして既読を無視すればいいかと思います。

JavaScript

1function returnData(msgs, resArray) { 2 for (m in msgs) { 3 if (!msgs[m].isUnread()) 4 continue; 5 6 //(省略) 7 } 8}

投稿2019/11/29 04:52

編集2019/11/29 05:46
draq

総合スコア2573

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

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

watzkang98

2019/11/29 05:31

そうすると今度は if (!m.isUnread()) の行にて 「オブジェクト 0 で関数 isUnread が見つかりません。」 となってしまいました...。 前回もご回答していただいた方ですね!感謝しかないです。
draq

2019/11/29 05:46

すいません。他言語とごっちゃになって文法間違えてました。この場合のmはインデックスでしたね。修正しました。
watzkang98

2019/11/29 05:49 編集

今度こそ無事動作確認できました!!!!!! 先日から本当にありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問