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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

1388閲覧

GASでメールの本文を作成

HAMASHO

総合スコア0

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/04/25 17:47

実現したいこと

自動メールにて期限通知アラートを実現したいです。

条件

パスの対象
①C列が【印鑑済み】または、E列が【コピー済み】の行
②期限またはモニター日が本日含め30日以内でない行

自動メール通知アラート対象
①赤色またはオレンジ色が含まれる列がある行

ーーーーーーーーーーーー

スプレッドシート上で顧客の情報を管理しています。

赤が期限切れ、オレンジが期限間近。
C列とE列はそれぞれ左隣の日付に対しての進捗状況を表しています。
色が赤、もしくはオレンジになっている行のA列からE列の内容を期限通知アラートメールとして
自動でメールを送りたいと思ってます。

メールを1件ずつではなく
条件に当てはまる行のA列からE列を
そのまま本文にしてひとまとめのですが、
for文で繰り返すプログラムの中で
まとめて本文にするところでとまっています。

ぜひ教えていただけると助かります。

イメージ説明

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

1行に対してメールが1件ごとに作成されてしまう。 上記の条件分岐のコードの組み方がわからない

試したこと

for文からメール送信につなげる

function mailAlerts2() { //シートを取得 var bk = SpreadsheetApp.getActiveSpreadsheet(); var sh = bk.getSheetByName("シート1 のコピー のコピー"); var last_row = sh.getLastRow(); //最後の行を取得(繰り返し処理の回数) // Logger.log(last_row); var begin_row = 2; // 処理を開始する行 (1行目は項目名なので2から) //今日の日付を取得し文字列を成型する var today = new Date();   // Logger.log(today); var formatDate = Utilities.formatDate(today, "JST","yyyy/MM/dd"); // Logger.log(formatDate); // 完了の水色カラーコード var formatColer = "#00ffff"; // Logger.log(formatColer); // 期限間近のオレンジ var formatColer1 = "#ff9900"; // 期限切れの赤 var formatColer2 = "#ff0000"; コード//繰り返し処理(1行づつ処理し、行の数だけ繰り返す) for(var i = begin_row; i <= last_row; i++) {   //それぞれのセルの中身を取得していく //名簿を取得 var sell0 = "A"+i; var name = sh.getRange(sell0).getValue(); // 期限のまとめ //日を取得 var sell1 = "B"+i; var value1 = sh.getRange(sell1).getValue(); var value1 = Utilities.formatDate(value1, "JST","yyyy/MM/dd");   //B列の背景カラーを取得 var Ecoler4 = "B"+i; var Ecoler45 = sh.getRange(Ecoler4).getBackgrounds(); // Logger.log(Ecoler45); //Cの進捗を取得 var sell3 = "C"+i; var value3 = sh.getRange(sell3).getValue(); // Logger.log(value3);   //進捗の背景カラーを取得 var Ecoler = "C"+i; var Ecoler2 = sh.getRange(Ecoler).getBackgrounds(); // Logger.log(Ecoler2);  // モニター日の取得   var sell2 = "D"+i;   var value2 = sh.getRange(sell2).getValue();   var value2 = Utilities.formatDate(value2, "JST","yyyy/MM/dd"); // Logger.log(value2);   //モニター日の背景カラーを取得 var Ecoler8 = "D"+i; var Ecoler85 = sh.getRange(Ecoler8).getBackgrounds(); // Logger.log(Ecoler85); //モニタリングの進捗を取得 var sell4 = "E"+i; var value4 = sh.getRange(sell4).getValue(); // Logger.log(value4);   //モニタリングの背景カラーを取得 var Gcoler = "E"+i; var Gcoler2 = sh.getRange(Gcoler).getBackgrounds(); // Logger.log(Gcoler2);   //もし、今日の日付と納期が同じで、なおかつ状況が完了でない場合メールを送る if(formatColer != Ecoler2){ var one = []; one.push([name,value1,value3,value2,value4]); GmailApp.sendEmail('xxxxxxxxxx@gmail.com', '【期限アラート】',one);

補足情報(FW/ツールのバージョンなど)

イメージ説明
このような状態でメールが送られてくるのが理想です

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

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

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

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

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

guest

回答2

0

javascript

1const q335171 = () => { 2 const sheetName = "シート1 のコピー のコピー" 3 const to = "xxxxxxxxxx@gmail.com" 4 const subject = "【期限アラート】" 5 const allRange = SpreadsheetApp.getActive().getSheetByName(sheetName).getDataRange(); 6 const indexes = allRange.getBackgrounds().map((e,i)=> [i,...e]).filter(e=> q335171_hasOrangeOrRed(e)).map(e => e[0]); 7 const body = allRange.getValues().filter((e,i) => indexes.includes(i)).map(e=>e.map((f,i)=> i % 2 ? Utilities.formatDate(f, "JST","yyyy/MM/dd"): f).join(",")).join("\n") 8 GmailApp.sendEmail(to,subject,body); 9} 10const q335171_hasOrangeOrRed = (e) => { 11 const red = "#ff0000" 12 const orange = "#ff9900" 13 return e.slice(1).includes(red) || e.slice(1).includes(orange) 14}

投稿2021/05/06 14:40

papinianus

総合スコア12705

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

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

HAMASHO

2021/05/11 02:29

回答ありがとうございます。 コピペして実行したのですが、すぐに実行完了して変化がありませんでした。 どんなコードなのか詳細に教えていただけますでしょうか?
guest

0

配列の状態でGmailApp.sendEmailをして改行を入れるという手法がわからなかったので、文字列で本文を作成するという手法での例ですが
一まとめにするということであれば、以下のコートでいいのではないでしょうか。

GAS

1 mailbody="" 2 for(var i = begin_row; i <= last_row; i++) { 3 //データの取得(省略) 4 5 if (送信するか判定){ 6 mailbody+=[name,value1,value3,value2,value4].join(",")+"\n" 7 } 8 } 9 10 GmailApp.sendEmail('xxxxxxxxxx@gmail.com', 11 '【期限アラート】',one);

あと、判定についてですが

var today = new Date();
var target = //日付のデータ

に対して

 (target-today)/86400000>=31

というような条件でいいのではないでしょうか。

[JavaScript] 2つの日付の差を日数で求める

あとは・・・蛇足かもしれませんが

if (formatColer != Ecoler2 && (target-today)/86400000>=31) {

}

というように && でつなぐと複数の条件を同時に満たすときに処理する。というようになります。

【JavaScript】if文を使った条件分岐の書き方

投稿2021/04/27 21:54

編集2021/04/27 21:58
xail2222

総合スコア1497

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問