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

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

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

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

Q&A

解決済

1回答

419閲覧

GASで日付計算をしたときに、元の値が計算する度に代わってしまう

gonngonn

総合スコア3

Google Apps Script

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

0グッド

0クリップ

投稿2022/04/15 09:31

すみません、
https://teratail.com/questions/0nfrsgonfdpkg3
でさせていただいた質問の続きです。

GASで、日付が入った行を取得
→ 取得した日付を1日前、3日前、・・
と計算して出した日付をシートに書き込むことを想定しています。

GAS

1function Dayire() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const Sheet = ss.getSheetByName('スケジュール管理表'); 4 const MasterHiduke = Sheet.getDataRange().getValues(); 5 6 ///未作業の行だけ抜き出す+行番号 7 const HeaderHiduke = MasterHiduke.shift(), cIndex = {}; 8 for (var i = 0; i < HeaderHiduke.length; i++) cIndex[HeaderHiduke[i]] = i; 9 10 //作業状態が未作業の行だけを取得して配列化 11 const FileHiduke = MasterHiduke 12 .filter(function(e){return e[cIndex['日付確定']] === '未作業'}) 13 .map(function(e){ 14 const Columns = [ 15 16 cIndex['行番号'], 17 cIndex['開催日'], 18 19 ], row = []; 20 for (var i = 0; i < Columns.length; i++) row.push(e[Columns[i]]); 21 return row; 22 }); 23 console.log(FileHiduke); 24 25 for( var i = 0 ; i< FileHiduke.length ; i++){ 26 //開催日 27 const Kaisaibi0 = FileHiduke[i][1]; 28 var Kaisaibi = Utilities.formatDate( Kaisaibi0, 'Eastern Daylight Time', 'yyyy/MM/dd'); 29 30 //1日前 31 var D1mae0 = Kaisaibi0; 32 D1mae0.setDate(D1mae0.getDate() - 1); 33 34 var D1mae = Utilities.formatDate( D1mae0, 'Asia/Tokyo', 'yyyy/MM/dd'); 35 console.log('[開催日0] ',Kaisaibi0); 36 console.log('[D1mae0] ',D1mae0); 37 console.log('[開催日もと] ',Kaisaibi); 38 39 //3日前 40 var D3mae0 = Kaisaibi0; 41 D3mae0.setDate(D3mae0.getDate() - 1); 42 var D3mae = Utilities.formatDate( D3mae0, 'Asia/Tokyo', 'yyyy/MM/dd'); 43 console.log('[開催日0] ',Kaisaibi0); 44 console.log('[D3mae0] ',D3mae0); 45 console.log('[開催日もと] ',Kaisaibi); 46 47 //7日前 48 var D7mae0 = Kaisaibi0; 49 D7mae0.setDate(D7mae0.getDate() - 7); 50 var D7mae = Utilities.formatDate( D7mae0, 'Asia/Tokyo', 'yyyy/MM/dd'); 51 console.log('[開催日0] ',Kaisaibi0); 52 console.log('[D7mae0] ',D7mae0); 53 console.log('[開催日もと] ',Kaisaibi); 54 55 } 56} 57 58

この結果が

18:30:23 情報 [ [ 74, Thu Jul 21 2022 11:00:00 GMT-0400 (Eastern Daylight Time) ] ] 18:30:23 情報 [★最初の開催日0] Thu Jul 21 2022 11:00:00 GMT-0400 (Eastern Daylight Time) 18:30:23 情報 [1日前] 18:30:23 情報 [開催日0] Wed Jul 20 2022 11:00:00 GMT-0400 (Eastern Daylight Time) 18:30:23 情報 [D1mae0] Wed Jul 20 2022 11:00:00 GMT-0400 (Eastern Daylight Time) 18:30:23 情報 [開催日もと] 2022/07/21 18:30:23 情報 [3日前] 18:30:23 情報 [開催日0] Tue Jul 19 2022 11:00:00 GMT-0400 (Eastern Daylight Time) 18:30:23 情報 [D3mae0] Tue Jul 19 2022 11:00:00 GMT-0400 (Eastern Daylight Time) 18:30:23 情報 [開催日もと] 2022/07/21 18:30:23 情報 [7日前] 18:30:23 情報 [開催日0] Tue Jul 12 2022 11:00:00 GMT-0400 (Eastern Daylight Time) 18:30:23 情報 [D7mae0] Tue Jul 12 2022 11:00:00 GMT-0400 (Eastern Daylight Time) 18:30:23 情報 [開催日もと] 2022/07/21

となりい、Kaisaibi0の値が計算する度に影響を受けてしまっています。
constで宣言していても、再代入がかかってしまうものなのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記の部分で、D1mae0は日付オブジェクトKaisaibi0への参照となっており、
それに対してsetDateを行っているため、元のKaisaibi0が変更されてしまいます。

js

1 //1日前 2 var D1mae0 = Kaisaibi0; 3 D1mae0.setDate(D1mae0.getDate() - 1);

ここは下記のように、Kaisaibi0と同じ日付時刻を持つ、あらたな日付オブジェクトを作成します。

js

1 //1日前 2 var D1mae0 = new Date(Kaisaibi0.getTime()); 3 D1mae0.setDate(D1mae0.getDate() - 1);

D3mae0, D7mae0も同様です。

投稿2022/04/15 11:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

gonngonn

2022/04/18 00:53

ありがとうございます。今更ながら、日付データの扱いは普通の定数代入と違うということがわかりました。 日付データの扱いについて、改めて勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問