作成しているもの:要回答管理ツールをスプレッドシートでGASを利用してリマインドメールで通知するように作成しています。今回、もともとあるコードをコピペしながら作っていったものです。
function
1 // シートの各データ取得 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sh = ss.getActiveSheet(); 4 const lastRow = sh.getLastRow(); 5 const lastColumn = sh.getLastColumn(); 6 // A-G列が案件情報 7 const _taskInfo = sh.getRange(2, 1, lastRow, 7).getValues(); 8 // 案件情報を(二次元配列から)オブジェクトへ変換 9 const taskInfo = createObj_(_taskInfo); 10 // 対象者と案件対応状況の開始行と開始列を定義 11 const startRow = 1; 12 const startColumn = 7; 13 // メール送付の判定情報(対象者と案件対応状況の表)を取得 G-J列 14 const mailInfo = sh.getRange(startRow, startColumn, lastRow, lastColumn - startColumn + 1).getValues(); 15 // 対象者へ未対応案件をまとめてメール通知 16 informTodoTask_(taskInfo, mailInfo); 17} 18 19/** 20 * 案件情報を管理番号をキーとするオブジェクトに変換 21 * 22 * @param {object[][]} 案件情報(二次元配列) 23 * @return {object} 案件情報(ステータス:CLOSE, 開始日が未来は除外) 24 */ 25function createObj_(array){ 26 // 案件情報格納用のオブジェクト 27 let taskInfoObj = {}; 28 for(let i = 1; i < array.length; i++){ 29 // ステータスがOPENで開始日以降のものをオブジェクトに格納 30 if(array[i][0] === 'OPEN' && new Date() > array[i][4]){ 31 // 各案件番号に対して、案件名、締切日、残日数を格納 32 taskInfoObj[array[i][6]] = { 33 task_name: array[i][2], // 案件名 34 deadline: Utilities.formatDate(new Date(array[i][3]),'JST','yyyy/MM/dd'), // 締切日 35 remainingDays: array[i][5] // 残日数 36 } 37 } 38 } 39 return taskInfoObj; 40} 41 42/** 43 * 各個人の未対応案件をチェックして 対象案件をまとめてメール通知 44 * 45 * @param {object} 案件情報 46 * @param {object[][]} 対象者の案件対応状況 47 */ 48function informTodoTask_(obj, array) { 49 // 1列(c)ずつメンバーの未対応案件をチェック 50 // 1件でも未対応があればメール送付 51 for (let c = 1; c < array[0].length; c++) { 52 // mailInfo[0][c] 対象者のメールアドレス 53 // mailInfo[1][c] 対象者名 54 // 未対応案件を追記する変数 55 let todoTask = ''; 56 // 締切3日前の未対応案件を追記する変数 57 let taskDeadline3days = ''; 58 // 1行(r)ずつ未対応案件をチェックしてtodoTaskに格納 59 for (let r = 3; r < array.length; r++) { 60 // mailInfo[r][0] 管理番号 61 // 管理番号がオブジェクトの中にあり、かつ未対応であれば変数todoTaskに案件情報をセット 62 if (obj[array[r][0]] && array[r][c] === '未') { 63 // 未対応案件の案件名、締切日、残日数をセット 64 todoTask += `${obj[array[r][0]]['task_name']} ${obj[array[r][0]]['deadline']} ${obj[array[r][0]]['remainingDays']} \n`; 65 } 66 // 締切3日前の未完了案件があれば変数taskDeadline3daysに案件情報をセット 67 if (obj[array[r][0]] && 68 array[r][c] === '未' && 69 obj[array[r][0]]['remainingDays'] === 'あと3日') { 70 taskDeadline3days += `${obj[array[r][0]]['task_name']} ${obj[array[r][0]]['deadline']} \n`; 71 } 72 } 73 const mailTo = array[0][c]; 74 const targetName = array[1][c]; 75 // 未対応案件があればメール通知 ※ todoTaskが空の場合はfalse 76 if (todoTask) { 77 const mailTitle = '未完了案件のお知らせ'; 78 const now = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm'); 79 const mailHeader = `※${now}時点の案件対応状況をお知らせします。`; 80 const mailBody = `${mailHeader}\n${targetName}さん\n\n${todoTask}`; 81 GmailApp.sendEmail(mailTo, mailTitle, mailBody); 82 } 83 // 未対応かつ3日前の案件が存在する場合メール通知 84 if (taskDeadline3days) { 85 const mailTitle = '締切3日前のお知らせ'; 86 const mailBody = `完了未対応案件がございます。対応案件はこちらからご確認ください \n⇒https://docs.google.com/spreadsheets/d/1zsTT-0rgJ5qvpLWhVeHg6qUptRBukKMfKiexSHtNK-4/edit#gid=1741906642 \n${taskDeadline3days}`; 87 GmailApp.sendEmail(mailTo, mailTitle, mailBody); 88 } 89 } 90} 91
このコードで動作自体はうまく進むのですが、ひとつ改善したい点があります。具体的に以下に記載します。
現在締切日+1日経過後の日付になると、「本日締切」になってしまいます。画像の赤枠のところです。
現状)例えば今日が12月9日だった場合
・D列の締切日が12月8日だとF列が「本日締切」となる。(締切日は9日なのでここは「終了」としたい)
・D列の締切日が12月9日だとF列が「あと1日」となる。(今日9日が締切日当日なのでここは「本日締切」としたい)
→現状、1日ずつズレているというような状況だと思われます。最初、元にしたGASコードをそのまま利用したらこの1日ズレるような現象は起きませんでした。ここの日にちのカウントのところを自分で何かいじってはおらず、新しい動作などを少しずつ足して作りあげていたのでどこかにズレてしまった原因があるのかなと思い見ております。
【もう少し具体的に実現したいところを記載させていただきます】
〜今日が12月9日だった場合〜
・D列「締切日」が、当日の場合
→F列「残日数」に「本日締切」と表示。
→ D列12月9日の時、F列「本日締切」
・D列「締切日」が、当日以降の場合
→F列「残日数」に「終了」と表示。
→D列12月8日以降の時、F列「終了」
・D列「締切日」が、当日より前の場合
→F列「残日数」に「あと○○日」と表示。(○○の部分は計算で求めた締切までの残日数)
→D列12月10日の時、F列「あと1日」
スプレッドシート内の本日締切のところの式は以下のような内容です↓
=IF(D10-TODAY()>0,"あと"&D10-TODAY()&"日",IF(D10-TODAY()<0,"終了",IF(D10-TODAY()=0,"本日締切!","")))
単純に、上記のスプレッドシート上式で"本日締切!"を"昨日締切"にしてみたところ、GASの動作がしなくなりました。
コードをみていじってみたのですがどこと連携してどう修正すれば良いのかわからず悩んでおりました。スプレッドシートに関するところにもなってしまうかもしれず申し訳ありません...何かヒントでも教えていただけると幸いです。よろしくお願い致します。”の
回答1件
あなたの回答
tips
プレビュー