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

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

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

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

Q&A

解決済

1回答

1265閲覧

GAS 日数のカウント(表示)を変更したい

araki11

総合スコア4

Google スプレッドシート

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

0グッド

0クリップ

投稿2021/12/09 02:34

編集2021/12/10 09:13

作成しているもの:要回答管理ツールをスプレッドシートで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日」

イスプレッドシート上「本日締切」というのを「昨日締切」という名前で表示されるようにしたいです(88は今日からみたら昨日なのに、本日締切となってしまうから)日メージ説明
ここを

スプレッドシート内の本日締切のところの式は以下のような内容です↓
=IF(D10-TODAY()>0,"あと"&D10-TODAY()&"日",IF(D10-TODAY()<0,"終了",IF(D10-TODAY()=0,"本日締切!","")))
イメージ説明

単純に、上記のスプレッドシート上式で"本日締切!"を"昨日締切"にしてみたところ、GASの動作がしなくなりました。
コードをみていじってみたのですがどこと連携してどう修正すれば良いのかわからず悩んでおりました。スプレッドシートに関するところにもなってしまうかもしれず申し訳ありません...何かヒントでも教えていただけると幸いです。よろしくお願い致します。”の

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/12/09 06:56 編集

「現在締切日の11経過後の日付」とはどういう意味でしょうか。 11経過後の日付とは?誤字ならば訂正してください。 結局、「質問者さんが希望する動作」は具体的にどのようなものなのでしょうか? 下記のような理解で合っていますか? (以下、スプレッドシートを開いている日を、 簡便のため、「当日」と表現します。) ・D列「締切日」が、当日の1日前の場合 →F列「残日数」に「昨日締切」と表示。 ・D列「締切日」が、当日の場合 →F列「残日数」に「本日締切」と表示。 ・D列「締切日」が、当日の2日後以降の場合 →F列「残日数」に「終了」と表示。 ・D列「締切日」が、当日より前の場合 →F列「残日数」に「あと○○日」と表示。 (○○の部分は計算で求めた締切までの残日数)
araki11

2021/12/10 09:28

qnoirさん 見ていただきありがとうございます!質問文修正しました。ここにも念のため記載し、もしかしたら参考になるかもしれないので、もともと参考にしたコードを以下にコピペします...! ①「現在締切日の11経過後の日付」 →失礼しました。誤字です。正しくは「現在締切日+1日経過後の日付」です。 ②具体的に実現したい部分を具体的に記載させていただきました。 〜今日が12月9日だった場合〜 ・D列「締切日」が、当日の場合 →F列「残日数」に「本日締切」と表示。 → D列12月9日の時、F列「本日締切」 ・D列「締切日」が、当日以降の場合 →F列「残日数」に「終了」と表示。 →D列12月8日以降の時、F列「終了」 ・D列「締切日」が、当日より前の場合 →F列「残日数」に「あと○○日」と表示。(○○の部分は計算で求めた締切までの残日数) →D列12月10日の時、F列「あと1日」 ③今回もともと以下のコードを参考にして作成しております。その場合は正常に上記に記載したように表示されます。参考にコピペしますm(_ _)m 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); } } }
guest

回答1

0

ベストアンサー

推測ですが、スプレッドシートのタイムゾーン設定が日本時間になっていない可能性があります。
下記の要領で、タイムゾーンを確認の上、タイムゾーンが「(GMT+09:00)Tokyo」になっているか確認してみてはいかがでしょうか。
仮になっていない場合は、「(GMT+09:00)Tokyo」に設定し直してください。


1.メニューの「ファイル」->「設定」をクリック
イメージ説明


2.タイムゾーンを「(GMT+09:00)Tokyo」にして、右下の「保存して再読み込み」ボタンをクリック。
イメージ説明

投稿2021/12/10 15:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

araki11

2021/12/11 13:41

qnoirさん ありがとうございます。 確かにそこは特に見れていなかったので...確認してみます!現在会社のドライブにシートがあるため、月曜日に確認してみようと思います◎
araki11

2021/12/13 13:59

qnoirさん 教えていただいた設定をしてみたところ、無事に解決しました!やはり「(GMT+09:00)Tokyo」となっていなかったのが原因でした(._.)とても助かりました。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問