結論
以下の通りで動くことを確認しました(テストケース少なめなので、境界値でちゃんと動くかはご自身でお願いします)。
...
var period = Math.ceil((dateAAi - today) / (1000 * 60 * 60 * 24));
if (period >= 0 && period <= 30) { //終了30日前の企業に通知
...
解説
まずご質問を見る限り、if文の判定は問題ない気がしました。
なのでperiodに入ってくる値がそもそも正しくないのでは?と考えます。
Logger.log(period);
を入れて実行後、表示→ログ(MacならCmd+Enter)でログで値の確認ができます。
2020-10-01のような未来の日付を入れて実行したら、本来3が返ってくるはずが、-27.0という結果が返ってきました。未来なのにマイナスなのが明らかにおかしいですね。
よく見ると.getDate()
で減算をしていますが、getDateは年月日の日が返ってきます。
なので(2020年10月1日)-(2020年9月28日)ではなく、1-28=-27
という計算がされます。
そのため、月をまたぐと結果が正しく返ってこないことが分かります。
修正
日付の差を出した後、結果がミリ秒で返ってくるので1000で割って秒、60で割って分、60で割って時、24で割って日数、更に繰上げをして日付に変換すれば、正しく日付の差が出せます。
余談
今回の内容と関係ないですが、getRange().getValue()
は実行ごとにスプレッドシートと通信が走ります。
そのため件数が多いと実行時間がかかりすぎて、件数次第ではタイムアウトの可能性があります。
getRangeで一括で範囲指定し、getValuesで全て取ってきた後にループを回すと、スプレッドシートとの通信が1回で済むので実行時間が短くなります。
リファクタリングの際にご活用ください。