🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

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

Gmail

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Q&A

解決済

1回答

1192閲覧

スプレッドシートのAPIでGmail抽出時のエラー

Ryoichi0330

総合スコア0

Google スプレッドシート

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

Gmail

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

0グッド

0クリップ

投稿2021/02/24 23:50

編集2021/02/25 00:38

スプレッドシートのAPIを使用し、Gmailの抽出を行っておりますが、
昨日まで、普通に使用できていましたが、いきなりエラー表示が出て使用できなくなりました。
エラーは「TypeError: undefined のメソッド「substring」を呼び出せません。(行 22、ファイル「コード」)と
表示され、22行目は、 var yoken = ary[7].substring(0).replace('\r','');
になります。

コードももう1年以上何も触っていないため、なぜこのようなことになったのか
全くわかりません。

教えていただきたいです。

function getMailToiawase(){    var sheet = SpreadsheetApp.getActive().getSheetByName('メール抽出'); var serach = '(注文確定 - 商品を出荷してください")'; var start = 0; var max = 500; var thds = GmailApp.search(serach,start,max); var row = 1; for(var n in thds){ var thd = thds[n]; var msgs = thd.getMessages(); for(m in msgs){ var msg = msgs[m]; var date = msg.getDate(); var body = msg.getBody(); var bodys= body.replace('■ご用件:','') .replace('■送信元:','');  // 改行を使って配列化する      var ary = bodys.split("\n"); // ご用件の行を取得し文字を抽出 var yoken = ary[7].substring(0).replace('\r',''); // 送信元の行を取得し文字を抽出 var dvi1 = ary[15].substring(0).replace('\r','');   // 送信元の行を取得し文字を抽出 var dvi2 = ary[16].substring(0).replace('\r',''); // 送信元の行を取得し文字を抽出 var dvi3 = ary[17].substring(0).replace('\r',''); // 送信元の行を取得し文字を抽出 var dvi4 = ary[18].substring(0).replace('\r',''); // 送信元の行を取得し文字を抽出 var dvi5 = ary[20].substring(0).replace('\r',''); // 送信元の行を取得し文字を抽出 var dvi6 = ary[23].substring(0).replace('\r',''); // 送信元の行を取得し文字を抽出 var dvi7 = ary[11].substring(0).replace('\r',''); // 送信元の行を取得し文字を抽出 var dvi8 = ary[22].substring(0).replace('\r',''); sheet.getRange(row,1).setValue(date); sheet.getRange(row,2).setValue(yoken); sheet.getRange(row,3).setValue(dvi1);   sheet.getRange(row,4).setValue(dvi2);  sheet.getRange(row,5).setValue(dvi3);   sheet.getRange(row,6).setValue(dvi4); sheet.getRange(row,7).setValue(dvi5); sheet.getRange(row,8).setValue(dvi6); sheet.getRange(row,9).setValue(dvi7);  sheet.getRange(row,10).setValue(dvi8); row++; } } var range = sheet.getRange("A:J"); range.sort({column: 1, ascending: true}); }
抽出内容 ○○様、 ○○○○に出品された商品に対する注文が確定いたしました。 このEメールの手順に従って、商品を出荷し、出荷通知を送信してください。 商品を出荷したら、出品用アカウントに戻り、出荷通知を送信してください。7日以内に出荷通知を送信しない場合、〇〇は該当の注文をキャンセルし、出品者様への支払いは行われません。 注文番号: 5555555-5555555-55 以下の商品を発送してください。 商品: コンディション: コンディション説明: 出品ID: SKU: 数量: 注文日: 価格: 消費税 配送料: 配送料(税額) Amazon手数料 振込金額合計:

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

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

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

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

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

tetsunosuke

2021/02/24 23:59

var body = msg.getBody(); var bodys= body.replace('■ご用件:','') .replace('■送信元:',''); // 改行を使って配列化する var ary = bodys.split("\n"); この状態でaryには bodysにある改行で分割された文字列が配列で入ります。 よってそのary[7]が存在しないということは改行の数が少ないなどが考えられるため、body(msg.getBody() で取得)の内容を確認してみないとわかりません。 そちらも貼り付けお願いします。 なお、コードはhttps://teratail.com/help/question-tips#questionTips3-7を参考に貼り付けてください
Ryoichi0330

2021/02/25 00:17

初めてなので、何もわからずすみません。 よってそのary[7]が存在しないということは改行の数が少ないなどが考えられるため、body(msg.getBody() で取得)の内容を確認してみないとわかりません。 →こちら一応メールの内容貼りましたが、わかりますでしょうか?
tetsunosuke

2021/02/25 00:24

メールの内容もコードと同じ形式で貼っていただいたほうがベターですが、ひとまず状況は見えました。 改行についてはそれなりに入っているようですね... ary の内容を console.logやLogger.logで出力し、その内容を貼り付けてみていただけませんか?
Ryoichi0330

2021/02/25 00:35

いろいろとすみませんm(__)m ary の内容を console.logやLogger.logで出力し、その内容を貼り付けてみていただけませんか? →こちらどういうことかわかりません・・・大変申し訳ないですが、教えていただけないでしょうか・・・
Ryoichi0330

2021/02/25 00:44

9:41:41 お知らせ 実行開始 9:41:42 エラー TypeError: Cannot read property 'substring' of undefined getMailToiawase @ コード.gs:31 こうやってでましたが。あってますでしょうかm(__)m
tetsunosuke

2021/02/25 00:57

プログラム側の var ary = bodys.split("\n"); の次の行あたりに console.log(ary); を追加して実行する必要があります〜
Ryoichi0330

2021/02/25 00:59

情報 [ '<div dir="ltr"><br></div>\r', '' ] 上記のような内容がでました!
tetsunosuke

2021/02/25 01:16

おっと 予想外。 body も console.log(body) して出しておくとよいように思います。 ありえそうな話としては... ・getBodyではなくgetPlainBody() でテキストメールとして取り出してみる ・for(m in msgs) で取り出すのをやめ、 https://developers.google.com/apps-script/reference/gmail/gmail-thread#getmessages にあるように、 for (var i = 0; i < msgs.length; i++) {  var msg = msgs[i];  // 以下は既存コードと同様 } で取り出してみるとかはどうでしょうか
Ryoichi0330

2021/02/25 01:25

回答ありがとうございます。 大変申し訳ありませんが、結果どのようにコードを変更すればいいか教えていただくことは可能ですか?? API自体あまり理解しておらず、すみません。
Ryoichi0330

2021/02/25 22:46

getBodyではなくgetPlainBody() にコード変更すると抽出できました! ご丁寧に教えていただきありがとうございました!
tetsunosuke

2021/02/25 23:55

自己解決できてよかったです。 ちょっと丸投げに頼まれてしまったように感じたので、そこは頑張ってみてよ...と思い時間をおいてしまいました。 さて、解決したということで質問を自己解決として、解決した内容を残してまとめておいてください!
guest

回答1

0

自己解決

var msg = msgs[m]; var date = msg.getDate(); var body = msg.getBody();

getBodyをgetPlainBody()に変更すると抽出されるようになりました。

投稿2021/02/26 00:25

Ryoichi0330

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問