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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Gmail

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

Google Apps Script

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

Q&A

1回答

694閲覧

GASで未読のGメールの内容をスプレッドシートに転記させたい。

yoko24

総合スコア8

Gmail

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

Google Apps Script

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

0グッド

1クリップ

投稿2023/07/05 12:06

実現したいこと

未読のGメールの内容を
スプレッドシートに転記させたい。

前提

お問い合わせフォームに入力された未読のGメールの内容を
GASでスプレッドシートに転記させたいのですが
内容が反映される項目とされない項目があり転記作業が上手くいきません。

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

エラーメッセージ等は、特に表示されてないです。
添付の画像のように転記が上手くいっておりません。イメージ説明

イメージ説明

### 該当のソースコード function getNewEmails() { //スプレッドシートを開く var ss = SpreadsheetApp.openById('転記先のスプレッドシートのID'); var sheet = ss.getSheetByName("台帳"); //検索条件 //同じ件名で未読のメールをさがす var query = 'subject:"件名" is:unread' var threads = GmailApp.search(query); var messageCount = threads.length; //取得したメールを1件ずつ処理していく var mark = ':' //メール内の問い合わせ項目の記号 for (var i = 0; i < messageCount; i++) { //SpreadSheetに書き込む変数 var date, time, companyName, userName, mail, tel var thread = threads[i] var message = thread.getMessages()[0] //メール本文の取得 var body = message.getPlainBody(); var bodyArray = body.split(mark) var bodyArray = body.split("\r\n") for (var n = 0; n < bodyArray.length; n++) { var item = bodyArray[n] if (item) { var itemTitle = itemArray[0] var itemText = itemArray[0] //見出しから内容を判断して取得 switch (itemTitle) { case '会社名': companyName = itemText break; case '担当者名': userName = itemText break; case '電話番号': tel = itemText break; case 'メールアドレス': mail = itemText break;} } } //受信日時の取得 date = message.getDate(); date = Utilities.formatDate(date, 'Asia/Tokyo', 'MM/dd'); time = message.getDate(); time = Utilities.formatDate(time, 'Asia/Tokyo', 'HH:mm'); //列が「受信日 受信時間 会社名 担当者名 電話番号 メールアドレス 」となっているのでその順番で書き込み sheet.appendRow([ date, time, companyName, userName,tel, mail, ]); //メールを既読にする //thread.markRead(); } }

試したこと

私のGASについての知識は、初心者でも書けるレベル及び調べながら読める程度です。
いままでもネット等で公開されているサイトから
拾ってきたものをコピペさせてもらい少しアレンジして使っていました。
今回、自分なりに色々と試してみたのですがどうにもうまくいかない為
こちらにてご相談させてもらいました。

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

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

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

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

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

YAmaGNZ

2023/07/05 12:29

bodyArrayを2つ定義したり、itemArrayの定義等がなかったり、itemTitleとitemTextに同じ値を代入したりしているようですが本当にこのソースで間違いがありませんか?
yoko24

2023/07/05 14:19

ほんとうですね…。おそらく間違ってます…色々試してうる内におかしなことになってますね… 因みに、最初、こちらのサイトを参考にコピペさせてもらいました。 https://www.globalgate.co.jp/blog/mail-automation-using-gas 知識なさすぎで申し訳ないのですが、どの辺を修正すれば転記できそうでしょうか。
guest

回答1

0

サンプルを書くとこんな感じでしょうか
下記はあくまでサンプルで必要な部分しか書いていませんのでそのままコピーしても多分動作しません

JavaScript

1//メール本文の取得 2let body = message.getPlainBody(); 3 4// 改行で分割する(1行づつに分ける) 5let bodyArray = body.split("\r\n"); 6 7// 1行づつ処理する 8for (var n = 0; n < bodyArray.length; n++) { 9 // 区切り文字で分割する 10 let items = bodyArray[n].split(mark); 11 12 if (items.length >= 2) { 13 // 分けた1つ目がタイトル 14 let itemTitle = items[0]; 15 // 分けた2つ目がテキスト 16 let itemText = items[1]; 17 18 //見出しから内容を判断して取得 19 switch (itemTitle) { 20 case '会社名': 21 companyName = itemText 22 break; 23 case '担当者名': 24 userName = itemText 25 break; 26 case '電話番号': 27 tel = itemText 28 break; 29 case 'メールアドレス': 30 mail = itemText 31 break; 32 } 33 } 34}

メール本文を1行づつに分解して、その分解した1行づつに対して”:”で分解するという感じです。

投稿2023/07/05 15:11

YAmaGNZ

総合スコア10544

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

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

yoko24

2023/07/06 11:43

早速の回答ありがとうございます。 教えていただいたコードを試してみたのですが、ステータスの列にに受信日、受信日の列に受信時間が反映されていて、メールの内容が反映されずまだ転記出来てません。 おそらく私の書き方に誤りがあると思うので…修正したコードを記載するので、お手数ですがご確認いただけないでしょうか。 function getNewEmails() { //スプレッドシートを開く var ss = SpreadsheetApp.openById('転記先のスプレッドシートのID'); var sheet = ss.getSheetByName("台帳"); //検索条件 //同じ件名で未読のメールをさがす var query = 'subject:"件名" is:unread' var threads = GmailApp.search(query); var messageCount = threads.length; //取得したメールを1件ずつ処理していく var mark = ':' //メール内の問い合わせ項目の記号 for (var i = 0; i < messageCount; i++) { //SpreadSheetに書き込む変数 var date, time, companyName, userName, mail, tel var thread = threads[i] var message = thread.getMessages()[0] //メール本文の取得 let body = message.getPlainBody(); // 改行で分割する(1行づつに分ける) let bodyArray = body.split("\r\n"); // 1行づつ処理する for (var n = 0; n < bodyArray.length; n++) { // 区切り文字で分割する let items = bodyArray[n].split(mark); if (items.length >= 2) { // 分けた1つ目がタイトル let itemTitle = items[0]; // 分けた2つ目がテキスト let itemText = items[1]; //見出しから内容を判断して取得 switch (itemTitle) { case '会社名': companyName = itemText break; case '担当者名': userName = itemText break; case '電話番号': tel = itemText break; case 'メールアドレス': mail = itemText break; } } } //受信日時の取得 date = message.getDate(); date = Utilities.formatDate(date, 'Asia/Tokyo', 'MM/dd'); time = message.getDate(); time = Utilities.formatDate(time, 'Asia/Tokyo', 'HH:mm'); //列が「日時 社名 担当者 メールアドレス TEL 所在地 問い合わせ内容 詳細」となっているのでその順番で書き込み sheet.appendRow([ date, time, companyName, userName, mail, tel, ]); //メールを既読にする //thread.markRead(); } }
YAmaGNZ

2023/07/06 12:12

各変数がどのようになっているかをご自身で確認されましたか? エディタでデバッグ実行できますので、ステップ実行などしてまずはご自身で確認されてはどうでしょうか? そこで例えばlet bodyArray = body.split("\r\n");で各行に分割しているはずができていないとかfor文でループできていないとかなど確認できることは多いかと思います。 もしかしたら、そもそもメールを取得できていないとかあるかもしれませんし。 各変数の値がどうなってるのか、ソースコードのどの部分が実行されているのかなど確認することはデバッグの基本なのでこの際エディタの使い方も学習されるほうがよろしいかと思います。
yoko24

2023/07/06 12:36

お恥ずかしながら確認はしてなかったです。 基本が身に付いてないので聞いてばかりになってしまいました。 まずは、基礎的ところが何も身についていないことを痛感したのでトライ&エラーしながら探してみます。 お忙しい中、わかりやすい説明とアドバイスを頂きありがとうございました。
YAmaGNZ

2023/07/06 22:11

確認されたうえで、「ここがこうなるはずがこうなってしまう」とか分からない部分をまた質問されればよろしいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問