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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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

解決済

3回答

1235閲覧

【GAS】Gmailとスプレッドシートの連携/自動でスプレッドシートへ入力する方法を知りたい

Tsubanishi

総合スコア43

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クリップ

投稿2021/05/28 04:48

前提・実現したいこと

Gmailで受信している問合せメールの内容の一部を、スプレッドシート/GASを使って下記の流れで自動的に転記できるようにしたいと考えています。

・特定のラベル付き+未読状態のメールを取得する
・メール内から該当箇所のみをスプレッドシートに転記する
・取得が終わったメールは既読状態に変更する
■元のメールデータ/例文
下記のようなメールから「予約日時、名前、電話番号」の部分のみを取り出してスプレッドシートに転記したい。

「体験申込フォーム」に予約がありました。

+++-----------------------------+++
予約の種類:体験申込フォーム
料金:¥0 (税込)
予約日時:2021年6月1日(火) 14時30分 / 幼児コース(対象:2歳半~6歳)
料金:¥0 (税込) /1名分
+++-----------------------------+++

+------------------------
+------------------------

名前:山田太朗
電話番号:0120-1111-2222

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

GAS Sprict内28行目に
TypeError: Cannot read property 'markRead' of undefinedと出てしまいます
非プログラマーの為、他のサイトを確認しながら作成しましたがどこが間違っているのかわからずです

GAS

1function getMail(){ 2 var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();    3 var objSheet = objSpreadsheet.getSheetByName("シート1"); //出力先のシートを指定 4 var sheet = SpreadsheetApp.setActiveSheet(objSheet); 5 6 //メールチェック用の変数 7 var start = 0; 8 var max = 500; 9 10 //配列"threads"にラベルが問合せ、状態が未読のスレッドを検索、代入。 11 var threads = GmailApp.search('label:Kids School 体験申込フォーム is:unread',start,max); 12 13 //オブジェクト"threads"のプロパティ数ループする 14 for(var n in threads){ 15 var thd = threads[n]; 16 var msgs = thd.getMessages(); //未読スレッドに含まれるメッセージを配列として取得 17 18 for(var m in msgs){ 19 var msg = msgs[m]; 20 var body = msg.getBody(); //メール本文を1データの塊として取得する 21 var dateandtime = body.match(/^予約日時\s*?:(.+)$/m)[1]; 22 var name = body.match(/^名前\s*?:(.+)$/m)[1]; 23 var tel = body.match(/^電話番号\s*?:(.+)$/m)[1]; 24 sheet.appendRow([dateandtime, name, "", "", tel]); 25 } 26 } 27 //スレッドを既読に変更する 28 thd.markRead(); 29 Utilities.sleep(1000); 30} 31

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

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

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

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

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

guest

回答3

0

エラーが意味しているのは、thd.markRead();thdundefinedだから。
thdforのブロックの中でvarで宣言しているのでブロックスコープではなく関数スコープになるはず、ではあるのですが、たぶん処理としてはforループの中に無ければならない処理なのではないかと想像します。
現在のコードだとthreadsが空のときもthd.markRead();が実行されるので、その場合にエラーが出ているのではないかと。

非プログラマーとのことですので修正コードを示すと、こうです。

//オブジェクト"threads"のプロパティ数ループする for(var n in threads){ var thd = threads[n]; var msgs = thd.getMessages(); //未読スレッドに含まれるメッセージを配列として取得 for(var m in msgs){ var msg = msgs[m]; var body = msg.getBody(); //メール本文を1データの塊として取得する var dateandtime = body.match(/^予約日時\s*?:(.+)$/m)[1]; var name = body.match(/^名前\s*?:(.+)$/m)[1]; var tel = body.match(/^電話番号\s*?:(.+)$/m)[1]; sheet.appendRow([dateandtime, name, "", "", tel]); } //スレッドを既読に変更する thd.markRead(); // ←この処理をループの中に移動 } Utilities.sleep(1000);

投稿2021/05/28 06:00

itagagaki

総合スコア8402

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

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

Tsubanishi

2021/05/31 14:51 編集

@itagagaki様 ありがとうございます。勉強になります。 エラーが消えました。ただログをみると何も出てこないのとスプレッドシートには何も書き込まれてこないのは、まだ何か抜けているからでしょうか? すいません。わかる範囲で構いませんのでご教授いただけないでしょうか?
itagagaki

2021/05/31 16:34

冷たいようですが、プログラミングを学ばれなければ思った通りに動くコードを書くのは無理だと思います。
Tsubanishi

2021/06/01 11:54

ご連絡ありがとうございます。 現在プログラミングを独学で勉強中でして、ご迷惑をおかけしました。1つ1つ解決していこうと思います
guest

0

自己解決

メール受信方法にプレーンメール形式とHTMLメール形式で若干コードが異なる為それに気づかずできない状況が続いておりました。プログラミング初心者ですが、そういう方もいらっしゃると思う為より詳しくコードを別々に記載します。他の方に回答いただいたものを参考に作成いたしました
プレーンメール形式コード```GAS
function getMail(){
var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();   
var objSheet = objSpreadsheet.getSheetByName("シート1"); //出力先のシートを指定
var sheet = SpreadsheetApp.setActiveSheet(objSheet);

//メールチェック用の変数
var start = 0;
var max = 500;

//配列"threads"にラベルが問合せ、状態が未読のスレッドを検索、代入。
var threads = GmailApp.search('label:【SELECTTYPE】予約がありました is:unread',start,max);
//var threads = GmailApp.search("is:unread", 0, 500);
console.log(threads);

//オブジェクト"threads"のプロパティ数ループする
for(var n in threads){
var thd = threads[n];

var msgs = thd.getMessages(); //未読スレッドに含まれるメッセージを配列として取得 for(var m in msgs){ var msg = msgs[m]; var body = msg.getBody(); console.log(body); var dateandtime = body.match(/^予約日時\s*?:(.+)$/m)[1]; var name = body.match(/^名前\s*?:(.+)$/m)[1]; var tel = body.match(/^電話番号\s*?:(.+)$/m)[1]; var mail = body.match(/^メールアドレス\s*?:(.+)$/m)[1]; tel = Utilities.formatString("'%s",tel); console.log(mail); sheet.appendRow([dateandtime, name, tel, mail]); } //スレッドを既読に変更する thd.markRead(); // ←この処理をループの中に移動

}
Utilities.sleep(1000);

}

HTML形式 ```GAS function getMail(){ var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();    var objSheet = objSpreadsheet.getSheetByName("シート1"); //出力先のシートを指定 var sheet = SpreadsheetApp.setActiveSheet(objSheet); //メールチェック用の変数 var start = 0; var max = 500; //配列"threads"にラベルが問合せ、状態が未読のスレッドを検索、代入。 var threads = GmailApp.search('label:【SELECTTYPE】予約がありました is:unread',start,max); console.log(threads[0]); //オブジェクト"threads"のプロパティ数ループする for(var n in threads){ var thd = threads[n]; var msgs = thd.getMessages(); //未読スレッドに含まれるメッセージを配列として取得 for(var m in msgs){ var msg = msgs[m]; var body = msg.getBody(); var dateandtime = body.match(/予約日時\s*?:.*?(?=/)/m)[0]; var name = body.match(/名前\s*?:.*?(?=<)/m)[0]; var tel = body.match(/電話番号\s*?:.*?(?=<)/m)[0]; tel = Utilities.formatString("'%s",tel); sheet.appendRow([dateandtime, name, "", "", tel]); } //スレッドを既読に変更する thd.markRead(); // ←この処理をループの中に移動 } Utilities.sleep(1000); }

ラベル作成方法は
こちら→https://www.g-workspace.jp/googleworkspace-reference/gmail/make-label/

投稿2021/07/27 04:39

編集2021/07/27 04:42
Tsubanishi

総合スコア43

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

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

0

上の回答者の答えでエラーは消えたようなので、後は動くコードを書いておきます。

(基本的には質問者様のコードを使用しています。変更箇所のあたりだけ載せますね)

for(var m in msgs){ var msg = msgs[m]; var body = msg.getBody(); var dateandtime = body.match(/予約日時\s*?:.*?(?=/)/m)[0]; var name = body.match(/名前\s*?:.*?(?=<)/m)[0]; var tel = body.match(/電話番号\s*?:.*?(?=<)/m)[0]; sheet.appendRow([dateandtime, name, "", "", tel]); }

正規表現の部分(予約日時、名前、電話番号の所です) と 配列のindex部分だけ変えれば一応動くかと思います。
これで動かなければどこで処理が止まっているかご自分でお調べのうえもう一度質問をお願いします。

もしこれ以上のことを求めるのなら、上の回答者の言う通り、勉強をしてご自分のレベルを高めていきながら質問をすべきだと思います。

投稿2021/06/01 06:54

AYuMu-sakura

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問