フォロー

GASで配列をincludeで判定するやつがわけわからんのじゃよ〜
スプレッドシートから取得した配列の中に一致する文字列ちゃんとあるのになんでFALSEになるの…
ていうか先月はちゃんと動いてたのになんで今月はだめだったの…

日付だからややこしいのか きっとそうだ そうであってくれ

· · SubwayTooter · 1 · 0 · 0

先月動いてた理由はよく分からんけど、日付だから失敗してるのは多分合ってると思う。
Date型のオブジェクト同士は、==では比較できない。例えて言うなら、「10と10は同じですか?」だと同じだけど、日付はオブジェクトなので「私の持ってる10円玉とあなたの持ってる10円玉は同じですか?」みたいな感じになる(10円という価値は同じだが、物体としては違う)。
ので、Dateのオブジェクトに対して、getTime()メソッドを呼んで、UNIX時間というミリ秒単位の整数値にしてやると比較できる。
const unixTimes = datesArray.map(date => date.getTime());
const needle = targetDate.getTime();
const hasDate = unixTimes.includes(needle);
みたいにするといいと思う。
GASに限らずいろんな言語の​:aruaru:

ウワァ〜〜なるほどわかりやすいです!ありがとうございます!!
GASは前までできていたことが仕様変更でできなくなるのがあるあるなので先月できてたのは偶然なんだと思います😭

Utilities.formatdate(new Date() , 'JST' , 'yyyy/mm/dd');
こういう感じで今日の日付の形式を指定したつもりで、
スプレッドシートからgetDisplayValuesで取得したyyyy/mm/ddの形の値たちの配列と比較したかったんですが
確かに日付までならともかくミリ秒単位では不一致ですわ…

スプレッドシートから取得する値の時刻は0:00:00、new Date()のほうは実行した日時になっちゃって不一致になるかもと思ってgetTimeは一旦使わないで、
GASでformatDateしたnew Date()はちゃんとyyyy/mm/dd形式の文字列になってたので、文字列同士の比較にするためスプレッドシートのセル内にTEXT関数を入れて配列の中身全部文字列にした、
つもりなんですがこれでもだめだったので
配列を取得するgetValuesの末尾に.joinをつけて配列ではなくひと続きの文字列にしたらTRUE判定出せました😂

結局使いはしませんでしたがgetTimeは大きな知見でした😌

'2023/11/172023/11/202023/12/04'みたいな文字列を作ったってこと?

ログインして会話に参加
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。