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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

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

Q&A

解決済

1回答

6004閲覧

GASでメールを送信する際、ある項目のデータが空白の場合、その項目をメール本文中に表示しない方法が知りたい。

koromo_t

総合スコア60

Google Apps Script

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

0グッド

1クリップ

投稿2018/07/22 21:03

編集2018/07/23 08:52

Googleフォームから得たデータを、
GASにて自分のメールアドレスへ送るスクリプトがあります。
メール本文に「名前」「メールアドレス」「URL」の項目を作りました。

このとき、たとえば「メールアドレス」のデータが入力されていない場合、
メール本文に「メールアドレス」の項目が表示されないようにしたいと思いました。
これを実現するには、やはりif関数にて「メールアドレスがある場合」
「URLがある場合」など、場合分けをして、動作を切り替えるしかないのでしょうか。

しかし検索していて見つけたこちらの記事の、

javaScript

1for (key in order) if (order[key]) temp += key + ":"+order[key]+"個\n";

の部分で行われているようなことができれば、
期待通りの結果を得ることができるのではないかと思いましたが、
ちょっと理解できませんでした。
解説、あるいは解決方法をご教示願いたいです。
よろしくお願いします。

ちなみに、現時点でのスクリプトは以下の通りです。

javaScript

1function sendNotification() { 2 // もし列Dの値に異動があれば 3 if(val[3]!=''){ // = if you edit data in col D 4 var dAddress = "***"; 5 var subject = "***"; 6 var content = "名前:"+val[1]+"\n"; 7 content += "メール:"+val[4]+"\n"; 8 content += "URL:"+val[5]+"\n"; 9 content += Utilities.formatDate(val[0],'JST','yyyy年M月d日 H時m分')+"\n"; 10 content += "**********************\n"+val[3]; 11 // メール通知する 12 content = content.replace(/\n/g,'<br>'); //必要があれば改行コードを<br>に差し替え 13 MailApp.sendEmail({ 14 to :dAddress, 15 subject :subject, 16 htmlBody:content //←pタグで挟んでもいい 17 }); 18 }

追記(2018/07/23 17:30)(解決)

javaScript

1 var ss = SpreadsheetApp.getActiveSpreadsheet(); 2 var sheet = ss.getActiveSheet(); 3 var lastLow = sheet.getLastRow(); 4 var val = sheet.getRange(lastLow,1,1,6).getValues()[0]; 5 6function sendOrderMail() { 7 var order = {}; 8 var temp = ""; 9 10 if (val[3]!=''){ 11 var dAddress = "***"; 12 var subject = "***"; 13 var content = "名前:"+val[1]+"\n"; 14 15 order['メール'] = val[4]; 16 order['URL'] = val[5]; 17 18 for (key in order){ 19 if (order[key]){ 20 temp += key + ":"+order[key]+"\n"; 21 } 22 } 23 Logger.log(temp) 24 25 content += temp; 26 content += Utilities.formatDate(val[0],'JST','yyyy年M月d日 H時m分')+"\n"; 27 content += "**********************\n"+val[3]; 28 // メール通知する 29 content = content.replace(/\n/g,'<br>'); //必要があれば改行コードを<br>に差し替え 30 MailApp.sendEmail({ 31 to :dAddress, 32 subject :subject, 33 htmlBody:content //←pタグで挟んでもいい 34 }); 35 } 36}

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascript

1for (key in order) if (order[key]) temp += key + ":"+order[key]+"個\n"; 2 3//省略されている中括弧をつけと下のような感じになっています。 4 5for (key in order){ 6 if (order[key]){ 7 temp += key + ":"+order[key]+"個\n"; 8 } 9}

基本的にはこのソースで実現できるかと思います。
参考元ソースを使用するためには「val」を配列ではなく連想配列に変更すればそのまま使用することができます。
配列の中身やorder['KEY']のKEY部分はご自身のものに合わせてください

javascript

1function myFunction() { 2 var val = [new Date(),'hoge山moge男','null','****','mail@mail.com','http://hogemoge']; 3 var order = {}; 4 var temp = "\n"; 5 order['名前'] = val[1]; 6 order['メール'] = val[4]; 7 order['URL'] = val[5]; 8 order['日時'] = Utilities.formatDate(val[0],'JST','yyyy年M月d日 H時m分'); 9 order['***'] = val[3]; 10 11 for (key in order){ 12 if (order[key]){ 13 temp += key + ":"+order[key]+"\n"; 14 } 15 } 16 Logger.log(temp) 17} 18 19//実行結果のLog 20//[18-07-23 13:34:53:229 JST] 21//名前:aaaa 22//メール:mail@mail.com 23//URL:http://hogem 24//日時:2018年7月23日 13時34分 25//***:**** 26

投稿2018/07/23 04:38

編集2018/07/23 04:41
recter

総合スコア37

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

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

koromo_t

2018/07/23 08:38

ご回答ありがとうございます! 一部ちょっと理解できておらず頼りない感じなのですが、 期待通りの結果を得ることができました! ありがとうございます! できたスクリプトを質問部分に追記しておきます。 しかしやはり「for (key in order) {}」部分が どういう指示をしているのか、よくわかりません。 何をどう調べればいいのかもわからないのですが、 日本語に訳していただけると理解できるのではないかと思いました。 お手数ですが、もしよければお願いします…!
recter

2018/07/23 09:01 編集

「for in」文は「in」の右に書かれたオブジェクトから、順番にプロパティ値を取得して左に書かれた変数に格納する。 という処理になっています。 今回、自分が書いた例の場合だと、以下のような順番でkeyが設定されますので、 「order[key]」で順番に値が取得できるというわけです。 1週目: key = '名前' 2週目: key = 'メール' 3週目: key = 'URL' 4週目: key = '日時' 5週目: key = '***' ちなみに配列の場合だとkey は 0, 1,2,3・・・・という感じで設定されますので、 配列の先頭から値を取得するfor文は以下のようにちょっとだけシンプルに書くことができます。 ``` var array = ['ab', 'cd', 'ef'] //普通のfor文 for( var i = 0 ; i < array.length; i++){ Logger.log(array[i]) } //for in for (var j in array){ Logger.log(array[j]) } } ``` 詳しい解説だと、この記事がすごいわかりやすかったのでおすすめです。 https://www.sejuku.net/blog/20777#for_8211_in
koromo_t

2018/07/23 22:38 編集

解説、そして参考URLもありがとうございます! なるほど…、orderというリストから1個ずつ出してくるイメージでしょうか…。 解説など読んでいるうちに、知識が脳に浸透してきたような気がします。 ちなみに、「orderで定義?した項目にデータが存在しない場合、 メール本文に表示されないこと」。 これは期待通りの結果ではあるのですが、どうしてそうなるのか不思議に思うのです。 「var order = {};」で、orderがオブジェクトだと言っているから、 データがないときは表示されない…? あるいは、「if (order[key])」で「order[key]」の値が存在する場合を指定しているから…? いずれも的外れなことを書いているような気もします。。
recter

2018/07/24 01:00

>あるいは、「if (order[key])」で「order[key]」の値が存在する場合を指定しているから…? その認識で間違いないです。 if(order[key]) → if(order[key] != "")と同じような判定になります。   ※厳密には違いますが、長くなるので割愛します。
koromo_t

2018/07/24 01:52

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問