実現したいこと
①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 を事前に除外するには、どこに何を入れ込めば機能させることができるのかご教示いただけますと幸いです。
//指定の管理番号に一致した場合
この条件に一致しなかったんじゃないですか?
もしそうなのであれば一致した時のみ処理すればいいのではないでしょうか。
ご質問ありがとうございます。
私の説明不足で申し訳ございません。
現状では指定の管理番号に一致する内容のメールは選択できており、(items)をもとにメールの作成までは実行できている状況です。
47列のconsole.log(items) の内容を一部抜粋しますと
情報 undefined
情報 undefined
情報 undefined
情報 [ [ ' 1234ABCDE',
'利用日時:2023/04/28(金) 10:00~15:00',
'予約数:1',
'橋本',
'太郎,
'サンプル@gmail',
'電話番号:08011111111' ] ]
情報 undefined
情報 undefined
のような形で出力されており、指定の管理番号を含まないメールがundefinedとしてメールの下書きに大量に作成されてしまう状況です。
手動で下書きを削除すれば使えるのですが、事前に削除できないものかと模索しているところです。
なにか他に足りない情報がございましたらお知らせいただけますと幸いです。
私の言いたかったことが伝わらなかったみたいです。
if ( plainBody.match(docBody)){
// ①
} else {
// ②
}
console.log(items);
//メール処理
こうなっていますよね?
②の時にundefinedとなっているのではないですか?と言っています。
そうなのであれば
if ( plainBody.match(docBody)){
// ①
console.log(items);
//メール処理
} else {
// ②
}
このようにすればいいのでは?と言っています。
直したところ解決いたしました。
流れをみれば確かにelseの後ろにメール作成があるのはおかしいのですね。
作ってるときは本当にわからなかったですが、今見てみると望む結果が出てなかったことが腑に落ちました。
この度はご教示くださりありがとうございます。

回答1件
あなたの回答
tips
プレビュー