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

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

ただいまの
回答率

90.00%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,002

plack

score 11

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」と判定され、一致しています。

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

function myFunction() {

  //スプレッドシートを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();

  var day_a = sheet.getRange("B2").getValue();

  //day_aの日付をログに出力
  Logger.log("day_aの日付");
  Logger.log(day_a);

  //本日の日付の0時00分00秒を設定
  var today = new Date();  
  today.setHours(0);
  today.setMinutes(00);
  today.setSeconds(00);

  //todayの日付をログに出力
  Logger.log("todayの日付");
  Logger.log(today);


  Logger.log("【結果】");

  if (day_a == today) {
    Logger.log("2つの日付は一致しています");
  } else {
    Logger.log("一致していません")
  }


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/16 13:00

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

    キャンセル

  • 2018/08/16 13: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

    キャンセル

  • 2018/08/18 16: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("一致していません")
    }


    }

    キャンセル

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる