Luxonで時間を取得しレコード保存を曜日毎に時間で制限する

いつも楽しく拝見させてもらっています。

プログラミング歴2か月にも満たない超初心者です。

お弁当の注文アプリで例えば土日は注文できない、平日は9:50までに注文するといったルールでレコードの保存ができないようにしたいです。

色々調べてなんとかここまではコードを書いてみたのですが、おそらく間違ってます。

全然、制限がかかりません。

無茶苦茶なコードだとは思うのですが、

どこが間違っているのかも今の自分には分からず、どなたかご教授お願いできないでしょうか?

よろしくお願いいたします。

画像ではなくコードブロックで貼り付けていただけると、回答側もコピペして検証しやすいです(投稿内のコードを見やすくする方法を参考にして下さい)。

見た限りだと

      let currentTime = luxon.DateTime.fromFormatISO(time);
      let startTime = luxon.DateTime.fromFormatISO(start);
      let endTime = luxon.DateTime.fromFormatISO(end);

この3行がエラーでコードそのものが停止(レコードの保存ボタンを押したら固まる)してしまうと思います。fromFormatISOという関数はなく、ドキュメントを見ると分かりますがfromFormatかfromISOのどちらかになると思います。

それでも保存できるということは、その関数(if判定文の中のisTimeWithinRange)自体が実行されていないのではないかと思います。考えられる理由としては、

 if (currentDay in restrictedTimes && 

この段階でfalseが返っている(&&は左辺がfalseの場合右辺の検証をしません)のが原因かなと思います。

つまり、

let currentDay = currentDate.toFormat('EEE');

これが月火水木金土日のいずれでもないという意味になります。これはconsole.log()等でコンソールに出してみましたか?多分ですが、ロケールの設定をしていないのであれば英語表記になるので、そちらの可能性もあるかと思います。

 

デバッグについては動かない?そんな時はデバッグしてみよう!が参考になると思います。

慣れない内はコードのところどころにconsole.log()を入れてどこまで動いているか検証したり、変数をログに出力して正しく処理できているかを見るのも良いと思います(慣れてきたらブレークポイントを設置したり等でより効率的にできます)。

ご指示ありがとうございます。

直してみたのですが、現状はエラーも出ないし何も反応ないです。

更に勉強してみます。

(() => {

  ‘use strict’;

  let restrictedTimes = {

    mon: { start: ‘09:50’, end: ‘23:59’ },

    tue: { start: ‘09:50’, end: ‘23:59’ },

    wed: { start: ‘09:50’, end: ‘23:59’ },

    thu: { start: ‘09:50’, end: ‘23:59’ },

    fri: { start: ‘09:50’, end: ‘23:59’ },

    sat: { start: ‘00:00’, end: ‘23:59’ },

    sun: { start: ‘00:00’, end: ‘23:59’ }

  };

  kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’], (event) => {

    let record = event.record;

    let currentDate = luxon.DateTime.local();

    let currentDay = currentDate.toFormat(‘EEE’);

    let currentTime = currentDate.toFormat(‘HH:mm’);

    if (currentDay in restrictedTimes && isTimeWithinRange(currentTime, restrictedTimes[currentDay].start, restrictedTimes[currentDay].end)) {

      event.error = ‘現在の時間帯は注文できません。’;

      return event;

    }

    return event;

  });

  function isTimeWithinRange(time, start, end) {

    let currentTime = luxon.DateTime.fromISO(time);

    let startTime = luxon.DateTime.fromISO(start);

    let endTime = luxon.DateTime.fromISO(end);

    return currentTime.diff(startTime).milliseconds >= 0 && currentTime.diff(endTime).milliseconds <= 0;

  }

})();

檀上尚居 さま

何も反応ない、という言葉にも2種類あり「レコードの保存自体がされずに固まる(コード実行中にエラーが発生している)」か「レコードが保存される(if文の判定が間違っている)」かで次の課題が分かります。

先の投稿で記載した

    let currentDay = currentDate.toFormat('EEE');

この部分について、

  let restrictedTimes = {
    mon: { start: '09:50', end: '23:59' },
    tue: { start: '09:50', end: '23:59' },
    wed: { start: '09:50', end: '23:59' },
    thu: { start: '09:50', end: '23:59' },
    fri: { start: '09:50', end: '23:59' },
    sat: { start: '00:00', end: '23:59' },
    sun: { start: '00:00', end: '23:59' }
  };

英語に直されていますが、ロケールをjaにしていないのであればおそらく大文字から始まると思います。

こんな感じでコンソールに出して見てみましょう。

  let currentDay = currentDate.toFormat('EEE');

    let currentDay = currentDate.toFormat('EEE');
console.log(`currentDayの値は${currenetDay}`, `restrictedTimesに${currentDay}は${currentDay in restricutedTimes ? '含まれる': '含まれない'}`);

mls-hashimotoさま

このコードでPC版の方は思ったように制限がかかりました。

が、モバイル方がイベントの頭にmobileと付けたコードを読み込んでみたのですが、

これは制限がかからず普通に保存されてしまいました。

モバイルの方はもっと特殊なことをしなくていけないという事でしょうか?

(() => {
  ‘use strict’;

  let restrictedTimes = {
    mon: { start: ‘09:50’, end: ‘23:59’ },
    tue: { start: ‘09:50’, end: ‘23:59’ },
    wed: { start: ‘09:50’, end: ‘23:59’ },
    thu: { start: ‘09:50’, end: ‘23:59’ },
    fri: { start: ‘09:50’, end: ‘23:59’ },
    sat: { start: ‘00:00’, end: ‘23:59’ },
    sun: { start: ‘00:00’, end: ‘23:59’ }
  };

  kintone.events.on([‘mobile.app.record.create.submit’, ‘mobile.app.record.edit.submit’], (event) => {
    let record = event.record;
    let currentDate = luxon.DateTime.local();
    let currentDay = currentDate.toFormat(‘EEE’).toLowerCase();
    let currentTime = currentDate.toFormat(‘HH:mm’);

    if (currentDay in restrictedTimes && isTimeWithinRange(currentTime, restrictedTimes[currentDay].start, restrictedTimes[currentDay].end)) {
      event.error = ‘現在の時間帯は注文できません。’;
      return event;
    }

    return event;
  });

  function isTimeWithinRange(time, start, end) {
    let currentTime = luxon.DateTime.fromFormat(time, ‘HH:mm’);
    let startTime = luxon.DateTime.fromFormat(start, ‘HH:mm’);
    let endTime = luxon.DateTime.fromFormat(end, ‘HH:mm’);

    return currentTime >= startTime && currentTime <= endTime;
  }
})();

檀上尚居 さま

モバイル版に合わせた書き方は問題ないように見えます。原因は他の部分でしょう。

アップロードする場所は問題ないですか?Luxonと共に「スマートフォン用のJavaScript / CSSファイル」にアップロードする必要があります。

そもそも動作しているかを知りたい場合はalert()を入れたり、console.log()に出してPCブラウザから/k/mにアクセスしてモバイル版を閲覧する等の方法があります。

mls-hashimotoさま

もう一度、全てを読み込みなおしたらモバイルでも時間制限できました。

もしかしたら間違っていたのかもしれません。(すみません、原因がわかりません。)

ちゃんと動作するとうれしいです!

この度はありがとうございました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。