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

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

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

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

Google Apps Script

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

Q&A

解決済

2回答

5158閲覧

【GAS】Gmail→スプレッドシートへの自動転記。本文内の項目を取得してセルにおさめたい。

gyanty

総合スコア5

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2021/04/09 16:07

編集2021/04/09 23:39

Gmailに届く内容をスプレッドシートに自動転記したいと考え、
スプレッドシートにスクリプトを記入していますが、エラーが表示され思ったように動きません。

なおメールで届く文面は下記のようなものです。


お問い合わせがありました。

■ メールアドレス
taroyamada@gmail.com
■ お名前
山田 太郎


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

TypeError: Cannot read property '1' of null
(匿名) @ コード.gs:36
(匿名) @ コード.gs:11
myFunction @ コード.gs:6

該当のソースコード

function myFunction() { // 検索条件に該当するスレッド一覧を取得 var threads = GmailApp.search('subject:お問い合わせ'); // スレッドを一つずつ取り出す threads.forEach(function(thread) { // スレッド内のメール一覧を取得 var messages = thread.getMessages(); // メールを一つずつ取り出す messages.forEach(function(message) { // メール本文を取得 var plainBody = message.getPlainBody(); // メール本文が取得できているかログに出力して確認 Logger.log(plainBody); // 日時を取得 var date = message.getDate(); // メールアドレスを取得 var email = plainBody.match(/■ メールアドレス[\s\S]*//); // お名前を取得 var name = plainBody.match(/■ お名前[\s\S]*//); // 書き込むシートを取得 var sheet = SpreadsheetApp.getActive().getSheetByName('supportに届いたメール'); // 最終行を取得 var lastRow = sheet.getLastRow() + 1; // セルを取得して値を転記 sheet.getRange(lastRow, 1).setValue(date); sheet.getRange(lastRow, 2).setValue(email[1]); sheet.getRange(lastRow, 3).setValue(name[1]); }); // スレッドに処理済みラベルを付ける var label = GmailApp.getUserLabelByName('転記済み'); thread.addLabel(label); }); }

試したこと

参考となりそうなサイトで上記と異なるGASの記述を試みたり、
正規表現のページをみてあれこれ試しましたが解決せず・・非エンジニアですが、いよいよ頭を抱えてしまいました。
問題解消のアドバイスを頂けたら有難いです。

補足情報

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

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

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

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

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

guest

回答2

0

gyantyさん
完成したコードを見させていただくことは可能でしょうか。
横入りして申し訳ありません。

投稿2021/08/24 16:20

kishimon0612

総合スコア3

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

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

0

ベストアンサー

※コードは 編集バーの'<code>'を使って埋めてください。

エラーメッセージの通りでは?
36行目、setValue(name[1]); の 1 が 取得できませんと言ってます。

0 が正か、その正規表現抽出にて 名無しさんがいたか、ではないかと。

投稿2021/04/09 22:44

FromMZ1500

総合スコア496

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

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

gyanty

2021/04/09 23:56

※コード部分を<code>を使って埋めなおしました。ご指摘ありがとうございます。 >36行目、setValue(name[1]); の 1 が 取得できませんと言ってます。 ご回答頂きありがとうございます。 スクリプトを実行した際ののエラーは下記の箇所を指定しています。(name[1]も同じ問題とは思います) sheet.getRange(lastRow, 2).setValue(email[1]); >0 が正か、その正規表現抽出にて 名無しさんがいたか、 そういうことなのですね! この記述だと本文中の"email"が取得できない、つまり問題は↓こっちにある・・? var email = plainBody.match(/■ メールアドレス[\s\S]*//); メール本文の該当箇所は下記のようなものですが、どう修正すべきかが分からず方法をご教示頂けると有難いです。(taroyamada@gmail.comの直前に半角スペースが2つありますがこれも正規表現に含める必要があるのでしょうか?) ■ メールアドレス taroyamada@gmail.com
FromMZ1500

2021/04/10 00:13

36行目は適当にしか数えなかったのでどっちかは不明。 コケていては進まないでしょうから、とりあえずフォロー処理をいれて、 値取込の成功失敗を、SheetByName('supportに届いたメール')上で見分けるのがよろしいかと。 var email = plainBody.match(/■ メールアドレス[\s\S]*//); if (((email == null) || (email.length < 2))) email = "Err(取得失敗)";
gyanty

2021/04/10 04:41

FromMZ1500さん、ありがとうございます。 教えて頂いた処理を入れて実行したところ、エラーが下記のように変わりました。 (コード.gs:36だったのが、コード.gs:38に) TypeError: Cannot read property '1' of null (匿名) @ コード.gs:38 (匿名) @ コード.gs:11 myFunction @ コード.gs:6 また、SheetByName('supportに届いたメール')上では、 A列 日付 B列 r という形で「r」一文字が入りますが、これが何を意味するのかいまいち理解できずにいる状態です。
FromMZ1500

2021/04/10 04:51

あっ、配列でしたね。間違いました。 その r は ’Err(取得失敗)’ の2文字目の 'r'でした。 ...まぁそれはいいとして, 配列のindexは0始まりです。それを承知での[1]ですか? sheet.getRange(lastRow, 2).setValue(email[1]); sheet.getRange(lastRow, 3).setValue(name[1]); email[0]、name[0] なのでは?
gyanty

2021/04/10 07:36 編集

FromMZ1500さん返信ありがとうございます。 >配列のindexは0始まりです。それを承知での[1]ですか? 恥ずかしながら承知の上でというよりは、参考ページの記述をそのまま流用しています。 配列の記述(email[1]やname[1] )部分は特に書き換えは不要なのかな、、などと思っており・・。 参考サイト:https://valmore.work/how-to-copy-gmail-message-to-spreadsheet/ sheet.getRange(lastRow, 2).setValue(email[1]); sheet.getRange(lastRow, 3).setValue(name[1]); 上記の[]を0に変えて実行したところ、同じエラーが表示されました。 TypeError: Cannot read property '0' of null (匿名) @ コード.gs:38 (匿名) @ コード.gs:11 myFunction @ コード.gs:6
FromMZ1500

2021/04/10 09:03 編集

失礼。Matchの仕様を確認。 [1]に取得値が返されますね。ただ r になってますので null になってます。 plainBody.match(/■ メールアドレス[\s\S]*//); の再確認を。
gyanty

2021/04/10 23:38

■ メールアドレス taroyamada@gmail.com この部分が正しく取得できていないのですよね。正規表現の記述を見直していますが苦戦しています。 ご回答ありがとうございます。
gyanty

2021/04/13 01:01

その後いろいろ試行錯誤して解決することができました。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問