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

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

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

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

Gmail

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

Google Apps Script

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

Q&A

解決済

1回答

790閲覧

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

ASY

総合スコア4

Google スプレッドシート

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

Gmail

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/09/03 06:47

イメージ説明
ここに質問の内容を詳しく書いてください。
(例)
TypeScriptで●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

実現したいこと

WBT管理ひょうを作成しています。動作でうまくいってる部分も、念のためコードのところで関連するかもしれませんので記載しています。
①もしも未回答の案件があったら「どの案件があと何日で締切なのか」をGメールで自動送信。
スプレッドシート上のアドレス先に各個人にそれぞれ未回答案件の内容が届く。
トリガーは日付が更新されるごとに設定したい
もしも、未回答案件があったら締切日の3日前に未回答の方へメールが届く。

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

残り@@日というメールが送られず
5 2022/09/07 4
の記述のみ送信される

該当のソースコード

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 = '';
// 締切3日前の未対応案件を追記する変数
let taskDeadline3days = '';
// 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;
}
// 締切3日前の未完了案件があれば変数taskDeadline3daysに案件情報をセット
if (obj[array[r][0]] &&
array[r][c] === '未' &&
obj[array[r][0]]['remainingDays'] === 'あと3日') {
taskDeadline3days += ${obj[array[r][0]]['task_name']} ${obj[array[r][0]]['deadline']} \n;
}
}

const mailTo = array[0][c]; const targetName = array[1][c]; // 未対応案件があればメール通知 ※ todoTaskが空の場合はfalse if (todoTask) { 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); } // 未対応かつ3日前の案件が存在する場合メール通知 if (taskDeadline3days) { const mailTitle = '締切3日前のお知らせ'; const mailBody = `完了未対応案件がございます。対応案件      \n${taskDeadline3days}`; GmailApp.sendEmail(mailTo, mailTitle, mailBody); }

}
}

### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

YAmaGNZ

2022/09/03 08:58

メール本文を設定しているところでtaskDeadline3daysを指定していますが taskDeadline3daysに「残り@@日」と設定していないようです。 どこで設定するのでしょうか?
guest

回答1

0

ベストアンサー

informTodoTask_ 関数内の下記の部分を

js

1 // 管理番号がオブジェクトの中にあり、かつ未対応であれば変数todoTaskに案件情報をセット 2 if (obj[array[r][0]] && array[r][c] === '未') { 3 // 未対応案件の案件名、締切日、残日数をセット 4 todoTask += `${ obj[array[r][0]]['task_name'] } ${ obj[array[r][0]]['deadline'] } ${ obj[array[r][0]]['remainingDays']}\n`; 5 } 6 // 締切3日前の未完了案件があれば変数taskDeadline3daysに案件情報をセット 7 if (obj[array[r][0]] && 8 array[r][c] === '未' && 9 obj[array[r][0]]['remainingDays'] === 'あと3日') { 10 taskDeadline3days += `${ obj[array[r][0]]['task_name'] } ${ obj[array[r][0]]['deadline'] } \n`; 11 }


以下のように直して下さい。

js

1 // 管理番号がオブジェクトの中にあり、かつ未対応であれば変数todoTaskに案件情報をセット 2 if (obj[array[r][0]] && array[r][c] === '未') { 3 // 未対応案件の案件名、締切日、残日数をセット 4 todoTask += `未完了案件:${ obj[array[r][0]]['task_name'] } 回答期限日:${ obj[array[r][0]]['deadline'] } 残り${ obj[array[r][0]]['remainingDays']}日\n`; 5 } 6 // 締切3日前の未完了案件があれば変数taskDeadline3daysに案件情報をセット 7 if (obj[array[r][0]] && 8 array[r][c] === '未' && 9 ('' + obj[array[r][0]]['remainingDays'] === '3' || obj[array[r][0]]['remainingDays'] === 'あと3日')) { 10 taskDeadline3days += `未完了案件:${ obj[array[r][0]]['task_name'] } 回答期限日:${ obj[array[r][0]]['deadline'] } \n`; 11 } 12

残り3日以上以外(例えば4日以上のタスク)のものはメール送信せず、残り3日になった段階で「未」とステータスのもののみメールで通知したい場合:

下記の8行を削除してください。

js

1// 未対応案件があればメール通知 ※ todoTaskが空の場合はfalse 2if (todoTask) { 3 const mailTitle = '未完了案件のお知らせ'; 4 const now = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm'); 5 const mailHeader = `${now}時点の案件対応状況をお知らせします。`; 6 const mailBody = `${mailHeader}\n${targetName}さん\n\n${todoTask}`; 7 GmailApp.sendEmail(mailTo, mailTitle, mailBody); 8}

投稿2022/09/03 10:05

編集2022/09/04 10:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ASY

2022/09/04 03:27

ありがとうございました! 解決できました。ただ、残り3日以上以外(例えば4日以上のタスク)のものを未対応案件としてメールが来てしまいます。可能であれば残り3日になった段階で「未」とステータスのもののみメールで通知したいのですが可能でしょうか?質問ばかりでもうしわけありません・・。よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2022/09/04 04:09

追記しました
ASY

2022/09/04 04:23

ありがとうございます。 先程TIME BASEDのトリガーを設定してスクリプトがうまくいくか確認した所以下のエラーメッセージが届きました・・。ご助言頂けないでしょうか。以下エラーメッセージ Exception: 範囲の列数には 1 以上を指定してください。
退会済みユーザー

退会済みユーザー

2022/09/04 05:43

詳細は不明ですが、 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sh = ss.getActiveSheet(); ここで、空白のシートを取得しちゃってる可能性はあります。 この2行を const ss = SpreadsheetApp.openByUrl("スプレッドシートのurl"); const sh = ss.getSheetByName("シート名"); に変えてみてはいかがでしょうか。 ("スプレッドシートのurl"、"シート名"、の部分は実際のものに変えてください)
ASY

2022/09/04 10:15

本当にありがとうございます。ですが何度かトライしたのですが通知が来なくなってしまいました。 以下現在のコードになります。 function myFunction_5_2_4() { // シートの各データ取得 const ss = SpreadsheetApp.openByUrl("URLを入れ込んでます"); const sh = ss.getSheetByName("WBT管理表"); 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 = ''; // 締切3日前の未対応案件を追記する変数 let taskDeadline3days = ''; // 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`; } // 締切3日前の未完了案件があれば変数taskDeadline3daysに案件情報をセット if (obj[array[r][0]] && array[r][c] === '未' && obj[array[r][0]]['remainingDays'] === 'あと3日') { taskDeadline3days += `${obj[array[r][0]]['task_name']} ${obj[array[r][0]]['deadline']} \n`; } } const mailTo = array[0][c]; const targetName = array[1][c]; // 未対応かつ3日前の案件が存在する場合メール通知 if (taskDeadline3days) { const mailTitle = '締切3日前のお知らせ'; const mailBody = `完了未対応案件がございます。対応案件      \n${taskDeadline3days}`; GmailApp.sendEmail(mailTo, mailTitle, mailBody); } } }
退会済みユーザー

退会済みユーザー

2022/09/04 10:32

回答欄を修正しました。 最後から14行目くらい前にある obj[array[r][0]]['remainingDays'] === 'あと3日') { を ('' + obj[array[r][0]]['remainingDays'] === '3' || obj[array[r][0]]['remainingDays'] === 'あと3日')) { に直してみて下さい。
ASY

2022/09/04 13:25

ほんと----にありがとうございました!無事思った通りの動作をしてくれました!何度も親切にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問