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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

17602閲覧

Google Apps Script(GAS)で、同じ日付が一致しない

plack

総合スコア13

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/08/14 23:01

GoogleスプレッドシートのB2セルに、本日の日付(2018/08/15)を入力しています。
B2セルの値を取得し、それをData関数で作成した本日の日付と一致させたいのですが、上手くいきません。

ログデータを見る限り、内容は一致していると思うのですが。

[18-08-15 07:59:54:163 JST] day_aの日付
[18-08-15 07:59:54:164 JST] Wed Aug 15 00:00:00 GMT+09:00 2018
[18-08-15 07:59:54:165 JST] todayの日付
[18-08-15 07:59:54:165 JST] Wed Aug 15 00:00:00 GMT+09:00 2018
[18-08-15 07:59:54:166 JST] 【結果】
[18-08-15 07:59:54:167 JST] 一致していません

また、typeofにて型判定を行ってみましたが、両方とも「object」と判定され、一致しています。

本件にて、もしおわかりの方がおられましたら、一致しない理由・解決策をお教えいただけますと助かります。

Google

1function myFunction() { 2 3 //スプレッドシートを取得 4 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 5 var sheet = spreadsheet.getActiveSheet(); 6 7 var day_a = sheet.getRange("B2").getValue(); 8 9 //day_aの日付をログに出力 10 Logger.log("day_aの日付"); 11 Logger.log(day_a); 12 13 //本日の日付の0時00分00秒を設定 14 var today = new Date(); 15 today.setHours(0); 16 today.setMinutes(00); 17 today.setSeconds(00); 18 19 //todayの日付をログに出力 20 Logger.log("todayの日付"); 21 Logger.log(today); 22 23 24 Logger.log("【結果】"); 25 26 if (day_a == today) { 27 Logger.log("2つの日付は一致しています"); 28 } else { 29 Logger.log("一致していません") 30 } 31 32 33} 34

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

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

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

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

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

guest

回答1

0

ベストアンサー

(GASも含めて)JavaScriptで、Dateなどオブジェクトを==で比較すると、同一のオブジェクトの場合にだけtrueとなります。内容の比較にはなりません。

なので、Dateの値を比較したい場合は、.getTime()で得られた数値同士を比較してください。

投稿2018/08/14 23:29

maisumakun

総合スコア145183

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

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

maisumakun

2018/08/14 23:30

あと、「シートから取ってきた値」についても、ちゃんとDateになっているかやタイムゾーンなどの確認が必要です。
plack

2018/08/16 03:30

ご回答いただきありがとうございます。 if (day_a.getTime() == today.getTime()) { Logger.log("2つの日付は一致しています"); } else { Logger.log("一致していません") } このような形に変更して試してみたのですが、やはり「一致していない」と判断されるようです。 強制的に文字列strに変換して比較させるということはできそうですが、もし可能であればスマートな方法で解決したいと考えています。 何が問題なのでしょうか。。。
kikukiku

2018/08/16 04:00

はずれかもしれませんが、下記のようにミリ秒まで表示してみてはどうでしょう。 DateFormat format = new SimpleDateFormat("yyyy MM dd hh:mm:ss.SSS"); String date = format.format(new Date());
miyabi-sun

2018/08/16 04:12

>強制的に文字列strに変換して比較させるということはできそうですが、もし可能であればスマートな方法で解決したいと考えています。 JSはプリミティブな値しか比較できませんので、一致か否かを判定したいなら数値や文字列に変換して確認するしかありません。 したがってgetTimeを使う事自体はJSを使う以上仕方ありません。 ……で、getTimeはミリ秒まで算出するので、 todayを作った瞬間は現在時刻が元になっているので、ミリ秒の部分はほぼランダムであり、1/1000の確率でしか一致しないでしょう。 このコードのままでも1000回実行すれば1回くらいは一致すると思います。 today.setSeconds(0);の後に、 更に`setMilliseconds(0);`を指定して初期化してあげれば解決するでしょう。 https://www.ajaxtower.jp/js/date_class/index16.html
plack

2018/08/18 07:46

アドバイスをいただきありがとうございます。 いただいた内容を試してみましたが上手く行かず、、、 結局、強制的に文字列変換することで期待通りの処理を実現することができました。 変数等、スマートなコードとはいえませんが、非エンジニアなのでひとまずこれでクリアとしたいと思います。 function myFunction() { //スプレッドシートを取得 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getActiveSheet(); var day_a = sheet.getRange("B2").getValue(); var y_a = day_a.getFullYear(); var m_a = day_a.getMonth() + 1; var d_a = day_a.getDate(); var day_a = y_a + "/" + m_a + "/" + d_a; //day_aの日付をログに出力 Logger.log("day_aの日付"); Logger.log(day_a); //本日の日付の0時00分00秒を設定 var today = new Date(); var y_b = today.getFullYear(); var m_b = today.getMonth() + 1; var d_b = today.getDate(); var today = y_b + "/" + m_b + "/" + d_b; //todayの日付をログに出力 Logger.log("todayの日付"); Logger.log(today); Logger.log("【結果】"); if (day_a == today) { Logger.log("2つの日付は一致しています"); } else { Logger.log("一致していません") } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問