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

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

ただいまの
回答率

88.59%

gasで同じ年月日かどうか判断するプログラムを教えてください

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 468

sakana_motoki

score 15

スプレッドシートに値が入力される度に日付と1ヶ月後の日付を取得し埋め込んでおります。
イメージ説明
上記のようにうまく日付を取れているのですが別の関数で日付を比較しているのですがif文でtrueが返ってきません。
ログをみたのですが

cansellRow[i]
[ [ Thu Jul 23 2020 00:00:00 GMT+0900 (日本標準時) ], [ Thu Jul 23 2020 00:00:00 GMT+0900 (日本標準時) ], [ Wed Jun 24 2020 00:00:00 GMT+0900 (日本標準時) ], [ Fri Jul 24 2020 00:00:00 GMT+0900 (日本標準時) ], [ Fri Jul 24 2020 00:00:00 GMT+0900 (日本標準時) ] ]

today
Wed Jun 24 2020 00:00:00 GMT+0900 (日本標準時)

とちゃんと取れています。

//退会日のアカウントがないか確認する関数
  function checkAcount(){
//年月日を取得
 var today =new Date(new Date().toDateString());
// アクセストークン 
var ACCESS_TOKEN = 'xxxxxxx'; 
// 利用しているシート
var data = SpreadsheetApp.openById('xxxxxxx').getSheetByName('シート1');
//最終行を取得
var last_row = data.getLastRow();
//全ての行を取得
    var allRow =data.getRange(2,2,last_row-1,4).getValues();
//退会の行のみ取得
    var cansellRow=data.getRange(2,4,last_row-1,1).getValues();
    console.log(cansellRow);
    console.log(today);
    for(var i = 2; i < cansellRow.length; i++) {
    if(cansellRow[i] == today) {
      console.log("ここまでは行けてる");
     function pushMessage() {
    var postData = {
    "to": "xxxxx",
    "messages": [{
      "type": "text",
      "text": "おはよう",
    }]
  };
  var url = "https://api.line.me/v2/bot/message/push";
  var headers = {
    "Content-Type": "application/json",
    'Authorization': 'Bearer ' +ACCESS_TOKEN,
  };

  var options = {
    "method": "post",
    "headers": headers,
    "payload": JSON.stringify(postData)
  };
  var response = UrlFetchApp.fetch(url, options);
}
    }
  }
  }

---他に試したこと
moment.jsというライブラリを入れてしっかりと値を取れているのを確認して

if(cansellRow[i].isSame(today,"day")){
console.log("ここまでは行けてる");
}else{
console.log("あかん");
}


上記ではそもそもエラーになりました。エラー文
TypeError: cansellRow[i][0].isSame is not a function at checkAcount(コード:78:25)

など色々試したのですがうまく行きません。

どなたか良い方法、またはコードで間違っている箇所があれば教えていただければ幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • draq

    2020/06/25 01:39

    LINEのアクセストークンとユーザーIDはもし本物を質問に記載しているなら消してください。
    他人が悪用できてしまいます。

    キャンセル

  • sakana_motoki

    2020/06/25 02:00

    ご指摘ありがとうございます
    あとで消そうと思っていたのですが忘れていました

    キャンセル

回答 2

checkベストアンサー

+1

Date型を直接比較した場合、同じインスタンスを指しているかどうかの比較になるので、値で比較したい場合はDate.prototype.getTime()を使って取得したUNIXエポックからの経過ミリ秒を比較してください。

Date.prototype.getTime() - MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime

const date1 = new Date("2020-06-25");
const date2 = new Date("2020-06-25");
const date3 = date1;

console.log(date1 === date2)
// => false

console.log(date1.getTime() === date2.getTime())
// => true

console.log(date1 === date3)
// => true

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/06/25 02:22

    なるほど、ありがとうございます!
    今回の場合一度スプレッドシートに埋め込んだ値を取得するのですが
    cansellRow[i].getTime()でUNIXエポックからの経過ミリ秒を取得できるのでしょうか?

    キャンセル

  • 2020/06/25 11:29

    cansellRow[i] のデータ型が Date 型なら取得できます。スプレッドシート上での見た目が同じでも書式設定次第で、string型になったりDate型になったりします。
    string 型になっている場合は、 new Date(cansellRow[i]) 等して Date 型にしてから getTime() 読んでください。

    キャンセル

0

const checkAccount = () => {
    const today = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd');
    const data = SpreadsheetApp.openById('xxxxxxx').getSheetByName('シート1').getDataRange().getValues().slice(1);
    // const data = SpreadsheetApp.getActive().getSheetByName('シート1').getDataRange().getValues(); //でよいのでは。
    data.forEach(e => {
        if(today !== Utilities.formatDate(e[3], 'JST', 'yyyy/MM/dd')) return;
        pushMessage();
    });
}
const pushMessage = () => {
    const ACCESS_TOKEN = 'xxxxxxx';
    const postData = {
        "to": "xxxxx",
        "messages": [{
            "type": "text",
            "text": "おはよう",
        }]
    };
    const url = "https://api.line.me/v2/bot/message/push";
    const headers = {
        "Content-Type": "application/json",
        'Authorization': 'Bearer ' +ACCESS_TOKEN,
    };

    const options = {
        "method": "post",
        "headers": headers,
        "payload": JSON.stringify(postData)
    };
    UrlFetchApp.fetch(url, options);
}

時刻が意図しない時刻になったことがあって、日付文字列にして比較してます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る