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

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

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

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

Google Apps Script

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

1回答

869閲覧

GASプログラムのエラー

watzkang98

総合スコア8

Google スプレッドシート

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

Google Apps Script

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2019/11/26 09:46

編集2019/12/04 05:49

前提・実現したいこと

ド初心者です。
以下のURLを参考にして、メールフォームからスプレッドシートに抽出するシステムを作っています。
https://www.virment.com/google-apps-script-gmail-spreadsheet/
当該サイトどおり作りましたが、どうもメール2通目から以下のエラーメッセージが発生しました。

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

データの行数が範囲の行数と一致しません。データは X 行ですが、範囲は 1.行です。(行 55、ファイル「コード」)

Xの数字は、var threadの行にあります、GmailApp.searchで該当するメールの既読を含めたスレッド数でした。

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, length, insertCol).setValues( resultArr ); // データ保存 //########上がエラーが出た行。エラーメッセージでデータの行数が複数行と言われるが...########## //getRangeの中身は(最終行+1,1,スレッド数,6) } } 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

ベストアンサー

ざっと読んだだけですが、returnData関数内でmsgs.length件数分resultArrへpushしているため
メールのスレッドが複数メールを含んでいる場合やreturnData内でエラーが発生した場合などに

JavaScript

1sheet.getRange(row, 1, length, insertCol).setValues( resultArr ); // データ保存

で、lengthresultArr.lengthが不一致となっているのではないでしょうか。

投稿2019/11/26 11:38

draq

総合スコア2573

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

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

watzkang98

2019/11/27 01:24 編集

ありがとうございます。無事動作しました。 助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問