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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1234閲覧

GASでGmailを送信時に不要な宛先『undefined 』を取り除く方法

AK_2023

総合スコア1

Gmail

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

Google Apps Script

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

0グッド

0クリップ

投稿2023/05/02 11:53

実現したいこと

①Googleスプレッドシートから管理番号(base_num)を抽出する。
②Gmailから件名でスレッドを検索する。
③検索したスレッドの中から、先ほどの管理番号を本文に含むメールのみを選択し情報(items)を抜き出して格納する。
⑤格納した情報を使用してメールを作成し、下書きに保存する。(①で抽出した管理番号の人数分(length)メールを作成する。)

前提

参考書やネット文献から参考に見よう見まねで組み立てました。
初めてのコードでして、提示箇所以外にも問題があるようでしたら教えていただけますと幸いです。

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

③で抜き出したメール以外に、②で参照したスレッド分のメール全てが【undefined】としてメールの下書きに作成されてしてしまいます。

該当のソースコード

GAS

1function myFunction() { 2 3 var doc = DocumentApp.openByUrl("https://docs.google.com/document/d/ここにURL/edit"); //DocumentのURLを指定 4 var docBody = doc.getText(); //本文データを取得 5 var docBody = (docBody.match(/[0-9A-Z]{9}/g)); //管理番号取得 6 7 console.log(docBody) 8 var length = docBody.length; 9 console.log(length); //要素の数(メール作成数) 10 11 var docBody = (docBody.join('|')); // 連結 12 var base_num = " /" + docBody + "/ "; // 検索用の加工 13 console.log(base_num) 14 15 //ここまでが管理番号の抽出 16 17 18 var query = "ここに件名, newer_than:10d "; //メールの検索 19 threads = GmailApp.search(query); //スレッド取得 20 21 threads.forEach(thread => { // スレッドを一つずつ取り出す 22 var messages = thread.getMessages(); // スレッド内のメール一覧を取得 23 messages.forEach(function(message) { // メールを一つずつ取り出す 24 var plainBody = message.getPlainBody(); // メール本文を取得 25 26 if ( plainBody.match(docBody)){ //指定の管理番号に一致した場合、情報を抜き出す 27 28 var rez_num = plainBody.match(/管理番号:(.*)/)[0]; 29 var rez_num = rez_num.replace("管理番号:", ""); 30 var rez_date = plainBody.match(/利用日時:(.*)/)[0]; 31 var rez_count = plainBody.match(/数量:(.*)/)[0]; 32 var fname = plainBody.match(/名前(姓):(.*)/)[0]; 33 var fname = fname.replace("名前(姓):", ""); 34 var name = plainBody.match(/名前(名):(.*)/)[0]; 35 var name = name.replace("名前(名):", ""); 36 var mail = plainBody.match(/メールアドレス:(.*)/)[0]; 37 var mail = mail.replace("メールアドレス:", ""); 38 var tel = plainBody.match(/電話番号:(.*)/)[0]; 39 40 var items = []; 41 items.push([rez_num,rez_date,rez_count,fname,name,mail,tel]); //メール作成用の情報を格納 42 43 } else { 44 ; 45 } 46 47 console.log(items); 48 49 //メール内容 50 var subject = ( fname +"さま ここに件名。" ); 51 var body = fname + " " + name + "さま\n" 52 + "\n" 53 + "本文サンプル\n" 54 + "\n" 55 + "管理番号:" + rez_num +"\n" 56 + rez_date +"\n" 57 + rez_count + "個\n" 58 + tel + "\n" 59 + "以上。\n" 60 + "\n" ; 61 62 console.log(body); //メール内容確認用 63 64 GmailApp.createDraft(mail,subject,body); 65 66 }); 67 }); 68} 69 70

試したこと

continue や filter など、実現できそうなものを当てはめてはみてるのですが、どれもうまくいきません。
undefined を事前に除外するには、どこに何を入れ込めば機能させることができるのかご教示いただけますと幸いです。

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

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

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

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

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

YAmaGNZ

2023/05/02 12:01

//指定の管理番号に一致した場合 この条件に一致しなかったんじゃないですか? もしそうなのであれば一致した時のみ処理すればいいのではないでしょうか。
AK_2023

2023/05/02 12:29

ご質問ありがとうございます。 私の説明不足で申し訳ございません。 現状では指定の管理番号に一致する内容のメールは選択できており、(items)をもとにメールの作成までは実行できている状況です。 47列のconsole.log(items) の内容を一部抜粋しますと 情報 undefined 情報 undefined 情報 undefined 情報 [ [ ' 1234ABCDE', '利用日時:2023/04/28(金) 10:00~15:00', '予約数:1', '橋本', '太郎, 'サンプル@gmail', '電話番号:08011111111' ] ] 情報 undefined 情報 undefined のような形で出力されており、指定の管理番号を含まないメールがundefinedとしてメールの下書きに大量に作成されてしまう状況です。 手動で下書きを削除すれば使えるのですが、事前に削除できないものかと模索しているところです。 なにか他に足りない情報がございましたらお知らせいただけますと幸いです。
YAmaGNZ

2023/05/02 13:05

私の言いたかったことが伝わらなかったみたいです。 if ( plainBody.match(docBody)){ // ① } else { // ② } console.log(items); //メール処理 こうなっていますよね? ②の時にundefinedとなっているのではないですか?と言っています。 そうなのであれば if ( plainBody.match(docBody)){ // ① console.log(items); //メール処理 } else { // ② } このようにすればいいのでは?と言っています。
AK_2023

2023/05/02 13:19

直したところ解決いたしました。 流れをみれば確かにelseの後ろにメール作成があるのはおかしいのですね。 作ってるときは本当にわからなかったですが、今見てみると望む結果が出てなかったことが腑に落ちました。 この度はご教示くださりありがとうございます。
guest

回答1

0

自己解決

質問文に記載していただきました内容で解決いたしました。
理由としては、else とメールの処理の位置が正しくなかった為でした。
ご教示くださりありがとうございます。

投稿2023/05/02 13:31

AK_2023

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問