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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

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

Google Apps Script

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

Q&A

解決済

1回答

3175閲覧

GASで3日前リマインドメールの自動送信

araki11

総合スコア4

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/11/28 10:11

<実現したいこと>
要回答管理シートを作成しています。動作でうまくいってる部分も、念のためコードのところで関連するかもしれませんので記載しています。
①もしも未回答の案件があったら「どの案件があと何日で締切なのか」をGメールで自動送信。スプレッドシート上のアドレス先に各個人にそれぞれ未回答案件の内容が届く。トリガーでは毎月1日に設定→解決済
②もしも、未回答案件があったら締切日の3日前に未回答の方へメールが届く。→今回つまずいいる部分

function myFunction_5_2_4() { // シートの各データ取得 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sh = ss.getActiveSheet(); const lastRow = sh.getLastRow(); const lastColumn = sh.getLastColumn(); // A-G列が案件情報 const _taskInfo = sh.getRange(2, 1, lastRow, 7).getValues(); // 案件情報を(二次元配列から)オブジェクトへ変換 const taskInfo = createObj_(_taskInfo); // 対象者と案件対応状況の開始行と開始列を定義 const startRow = 1; const startColumn = 7; // メール送付の判定情報(対象者と案件対応状況の表)を取得 G-J列 const mailInfo = sh.getRange(startRow, startColumn, lastRow, lastColumn - startColumn + 1).getValues(); // 対象者へ未対応案件をまとめてメール通知 informTodoTask_(taskInfo, mailInfo); } /** * 案件情報を管理番号をキーとするオブジェクトに変換 * * @param {object[][]} 案件情報(二次元配列) * @return {object} 案件情報(ステータス:CLOSE, 開始日が未来は除外) */ function createObj_(array){ // 案件情報格納用のオブジェクト let taskInfoObj = {}; for(let i = 1; i < array.length; i++){ // ステータスがOPENで開始日以降のものをオブジェクトに格納 if(array[i][0] === 'OPEN' && new Date() > array[i][4]){ // 各案件番号に対して、案件名、締切日、残日数を格納 taskInfoObj[array[i][6]] = { task_name: array[i][2], // 案件名 deadline: Utilities.formatDate(new Date(array[i][3]),'JST','yyyy/MM/dd'), // 締切日 remainingDays: array[i][5] // 残日数 } } } return taskInfoObj; } /** * 各個人の未対応案件をチェックして 対象案件をまとめてメール通知 * * @param {object} 案件情報 * @param {object[][]} 対象者の案件対応状況 */ function informTodoTask_(obj, array){ // 1列(c)ずつメンバーの未対応案件をチェック // 1件でも未対応があればメール送付 for(let c = 1; c < array[0].length; c++){ // mailInfo[0][c] 対象者のメールアドレス // mailInfo[1][c] 対象者名 // 未対応案件を追記する変数 let todoTask = ''; // 1行(r)ずつ未対応案件をチェックしてtodoTaskに格納 for(let r = 3; r < array.length; r++){ // mailInfo[r][0] 管理番号 // 管理番号がオブジェクトの中にあり、かつ未対応であれば変数todoTaskに案件情報をセット if(obj[array[r][0]] && array[r][c] === '未'){ // 未対応案件の案件名、締切日、残日数をセット todoTask += `${obj[array[r][0]]['task_name']} ${obj[array[r][0]]['deadline']} ${obj[array[r][0]]['remainingDays']} \n`; } } // 未対応案件があればメール通知 ※ todoTaskが空の場合はfalse if(todoTask){ // 必要情報を準備してメール通知 const mailTo = array[0][c]; const targetName = array[1][c]; const mailTitle = '未完了案件のお知らせ'; const now = Utilities.formatDate(new Date(),'JST','yyyy/MM/dd HH:mm'); const mailHeader = `※${now}時点の案件対応状況をお知らせします。`; const mailBody = `${mailHeader}\n${targetName}さん\n\n${todoTask}`; GmailApp.sendEmail(mailTo, mailTitle, mailBody); } //ここから追加した分 if(todoTask=='済'); //もし済なら何もしない。 else if('未' && 2<day && day <=3){ //未対応かつ3日前の案件の場合     const mailTitle = '締切3日前のお知らせ'; const mailBody = `完了未対応案件がございます。対応案件      `; GmailApp.sendEmail(mailTo, mailTitle, mailBody); }

→実現したいことの対象は下記に記載の部分のコードです。(実現したいこと②:一番下の行から〜下から6行目のこの部分です。)明らかにこれでは不足しているということはわかるのですが、今の知識だと正直にお話しますと何を追加すれば良いのかがあまりピンときておりません...m(_ _)mなんとなく、もしも未対応かつ3日以内ならメールを送るという内容にしたくて下記のように記載してみました。ヒントや、そもそもこの考え間違っているよ!みたいなところとかでも良いので教えていただけると幸いです。
<悩んでいる該当部分>
//ここから追加した分
if(todoTask=='済'); //もし済なら何もしない。

else if('未' && 2<day && day <=3){ //未対応かつ3日前の案件の場合
const mailTitle = '締切3日前のお知らせ';
const mailBody = 完了未対応案件がございます。対応案件      ;
GmailApp.sendEmail(mailTo, mailTitle, mailBody);
}

<エラー>
構文エラー: SyntaxError: Unexpected end of input 行: 86 ファイル: 進捗通知メールリマインド追加.gs

今回GASで利用しているスプレッドシート

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

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

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

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

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

guest

回答1

0

ベストアンサー

動かしてないのでわかりませんが、ぱっと見て目に付いたところでは

diff

1 //ここから追加した分 2+ if(todoTask=='済'); //もし済なら何もしない。//...(1) 3 4+ else if('未' && 2<day && day <=3){ //未対応かつ3日前の案件の場合 //...(2) 5    const mailTitle = '締切3日前のお知らせ'; 6 const mailBody = `完了未対応案件がございます。対応案件      `; 7+ GmailApp.sendEmail(mailTo, mailTitle, mailBody); //...(3) 8 }

・(1)この部分は、「済」のときに何か処理していた場合の名残でしょうか?
もしそうでないのなら、わざわざif/elseにする必要はないと思います(この行は削除して、次の行のelseだけを抜き出せばよい)

・(2)ここで'未'単独の文字が条件式に入っているのは不自然です。また、変数「day」は、どこにも定義されていないのに、いきなり使われています。

・(3) mailToは前のifブロックの中で定義されていますが、そのif内の条件式の評価結果がfalseとなってスキップされた場合、maileToが未定義エラーになる可能性があります。

直すとすれば下記のようになるでしょうか。

js

1function informTodoTask_(obj, array) { 2 // 1列(c)ずつメンバーの未対応案件をチェック 3 // 1件でも未対応があればメール送付 4 for (let c = 1; c < array[0].length; c++) { 5 // mailInfo[0][c] 対象者のメールアドレス 6 // mailInfo[1][c] 対象者名 7 // 未対応案件を追記する変数 8 let todoTask = ''; 9 // 締切3日前の未対応案件を追記する変数 10 let taskDeadline3days = ''; 11 // 1行(r)ずつ未対応案件をチェックしてtodoTaskに格納 12 for (let r = 3; r < array.length; r++) { 13 // mailInfo[r][0] 管理番号 14 // 管理番号がオブジェクトの中にあり、かつ未対応であれば変数todoTaskに案件情報をセット 15 if (obj[array[r][0]] && array[r][c] === '未') { 16 // 未対応案件の案件名、締切日、残日数をセット 17 todoTask += `${obj[array[r][0]]['task_name']} ${obj[array[r][0]]['deadline']} ${obj[array[r][0]]['remainingDays']} \n`; 18 } 19 // 締切3日前の未完了案件があれば変数taskDeadline3daysに案件情報をセット 20 if (obj[array[r][0]] && 21 array[r][c] === '未' && 22 obj[array[r][0]]['remainingDays'] === 'あと3日') { 23 taskDeadline3days += `${obj[array[r][0]]['task_name']} ${obj[array[r][0]]['deadline']} \n`; 24 } 25 } 26 27 const mailTo = array[0][c]; 28 const targetName = array[1][c]; 29 30 // 未対応案件があればメール通知 ※ todoTaskが空の場合はfalse 31 if (todoTask) { 32 const mailTitle = '未完了案件のお知らせ'; 33 const now = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm'); 34 const mailHeader = `${now}時点の案件対応状況をお知らせします。`; 35 const mailBody = `${mailHeader}\n${targetName}さん\n\n${todoTask}`; 36 GmailApp.sendEmail(mailTo, mailTitle, mailBody); 37 } 38 39 // 未対応かつ3日前の案件が存在する場合メール通知 40 if (taskDeadline3days) { 41 const mailTitle = '締切3日前のお知らせ'; 42 const mailBody = `完了未対応案件がございます。対応案件      \n${taskDeadline3days}`; 43 GmailApp.sendEmail(mailTo, mailTitle, mailBody); 44 } 45 } 46}

投稿2021/11/28 10:18

編集2021/11/28 15:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

araki11

2021/11/28 14:23

qnoirさん 早速ご回答いただきありがとうございます!教えていただいた内容で色々いじってみたところ、つまずいていた3日前リマインドメールがなんと届くようになりました...!!本当にありがとうございますm(_ _)m ち、ちなみに、最初の①の方のメールが、一件ずつ増えながら届くようになってしまったのですが、どこかの" } "の位置が関係していたりするのでしょうか...?例えば、 <今までのメール> ※2021/11/28 17:11時点の案件対応状況をお知らせします。 みさん DL 2021/11/28 DL4 2021/11/28 本日締切! DL6 2021/11/30 あと2日 DL6 2021/11/30 あと2日 ⇩<今> ◆1通目のメール ※2021/11/28 23:18時点の案件対応状況をお知らせします。 みさん サービステスト6月 2021/11/30 あと2日 ◆2通目 ※2021/11/28 23:18時点の案件対応状況をお知らせします。 みさん サービステスト6月 2021/11/30 あと2日 DL 2021/11/28 本日締切! (省略) ◆5通目 ※2021/11/28 23:18時点の案件対応状況をお知らせします。 みさん サービステスト6月 2021/11/30 あと2日 DL 2021/11/28 本日締切! DL4 2021/11/28 本日締切! DL5 2021/12/07 あと9日 DL6 2021/11/30 あと2日 自分でももう少し内容見てみますm(_ _)m
退会済みユーザー

退会済みユーザー

2021/11/28 15:16

修正しました。
araki11

2021/11/29 05:22

qnoirさん 先ほど、実際に動かしてみて成功しました!!さらに、33日リマインドの案件まで下に内容が表示できるようになっており、これもとても助かりましたm(_ _)mせっかく教えていただいたのでコードのしくみを再度見て勉強しようと思います。ありがとうございます!前!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問