時刻制限について

お世話になっております。

タイムカードでバイトの出勤状態を計算したいですが、開始時刻、終了時刻を記入する際、現在は1:00、1:30、2:00と自動で選択することできます。規定として15分刻で記入をするようにしてますが、人によってはやっぱりバラバラで大変困っております。15分刻で入力しないとエラーになり、保存できないというやりかたあるでしょうか?

初心者で大変恐縮ですが、なにかアドバイスいただけると幸いです。宜しくお願い致します。

比較的簡単な方法としては、2通りあると思います。

1.時刻フィールドではなくドロップダウンフィールドで15分刻みの選択肢を使用する
15分刻みの値しか選択できなくなるので、エラーチェックの必要がなくなります。
ただし、通知やグラフなどで計算したい場合は比較ができなくなるのでオススメしません。

2.javascriptでエラーチェックを追加する
以下のようなコードになります。(サンプルなので動かない可能性があります)

(function() {
"use strict";

var Events = [
"app.record.create.submit",
"app.record.edit.submit",
"app.record.index.edit.submit"
],
checks = ["00", "15", "30", "45"];

kintone.events.on(Events, function(event) {

var record = event.record,
startTime = record["開始時刻"].value,
endTime = record["終了時刻"].value,
startMin = startTime.substr(3, 2),
endMin = endTime.substr(3, 2);

if(checks.includes(startMin)){
record["開始時刻"].errror = "15分刻みで入力してください。";
}
if(checks.includes(endMin)){
record["終了時刻"].errror = "15分刻みで入力してください。";
}

return event;

});

})();

FM様

お世話になっております。

アドバイスいただき、誠にありがとうございます。

2.javascriptでエラーチェックを追加するの方法でやってみたいと思います。サンプルコードまで提示していただき、本当に助かりました。まだ動かない状態なので、どこに問題があるか模索しつつ、やってみます。本当にありがとうございました。

後で気付いたんですが、includesがIEだと使えないみたいなので、
if(checks.includes(startMin))…の部分は素直にif(startMin === “00” || startMin === “15” || startMin === “30” || startMin === “45”)…
とした方がいいかもしれません。
また、record[“開始時刻”].〇〇〇の部分の「開始時刻」などの文字列はフィールドコードなので、アプリ側のフィールドと合わせるようにして下さい。

FM様

お世話になっております。

再びアドバイスいただき、本当にありがとうございます。

edit.js:113 Uncaught TypeError: Cannot read property ‘substr’ of undefined
at download.do?app=793&contentId=30130&jsType=DESKTOP&hash=dbe7b81e4b934d8fd3fd777d09e450fdc1dd9d4e:17

となり、

startMin = startTime.substr(3, 2),
endMin = endTime.substr(3, 2);

で止まっているようです。

アプリ側のフィールドは時刻型で「開始時刻」と「終了時刻」のみの項目でテストしております。

「〇〇 of undefined」というエラーは、〇〇の上位オブジェクトがundefinedであるということなので、
startTime = record[“開始時刻”].value が上手く取得できていないことになります。

「開始時刻」のフィールドコードは一致していますでしょうか?(フィールド名ではありません)
または、空欄だと同じ現象が起こるため、値を入力した状態で試してください。

空欄でエラーが起こらないようにするには、(小技)undefined と 空文字のスマートな if 文判定 を参考にしてみてください。

FM様

お世話になっております。ご丁寧に教えていただき、ありがとうございます。

時刻型でフィールド名:「開始時刻」と「終了時刻」のみの項目で、

フィールドコード:「開始時刻」と「終了時刻」

以下のコードで実行してみたら、エラーメッセージは出てないまま、保存できてしまいます。

引き続き模索します。

(function() {
"use strict";

var Events = [
"app.record.create.submit",
"app.record.edit.submit",
"app.record.index.edit.submit"
],
checks = ["00", "15", "30", "45"];

kintone.events.on(Events, function(event) {

var record = event.record,
startTime = record["開始時刻"].value,
endTime = record["終了時刻"].value,
startMin = startTime.substr(3, 2),
endMin = endTime.substr(3, 2);

if(startMin === "00" || startMin === "15" || startMin === "30" || startMin === "45"){
record["開始時刻"].errror = "15分刻みで入力してください。";
}
if(endMin === "00" || endMin === "15" || endMin === "30" || endMin === "45"){
record["終了時刻"].errror = "15分刻みで入力してください。";
}

return event;

});

})();

失礼致しました。よく見たら条件が間違っていたので以下のように修正してみてください。

if(startMin ==="00"|| startMin ==="15"|| startMin ==="30"|| startMin ==="45")...
if(endMin ==="00"|| endMin ==="15"|| endMin ==="30"|| endMin ==="45")...

// ↓条件を以下に書き換える
if(!(startMin ==="00"|| startMin ==="15"|| startMin ==="30"|| startMin ==="45"))...
if(!(endMin ==="00"|| endMin ==="15"|| endMin ==="30"|| endMin ==="45"))...

FM様

お世話になっております。

再度アドバイスいただき、本当にありがとうございます。

コードを変えてみましたが前と同じくエラーメッセージは出てないまま、保存できてしまいます・・・

単純なスペルミスでした。

record[“開始時刻”].errror = “15分刻みで入力してください。”;
record[“終了時刻”].errror = “15分刻みで入力してください。”;

の、「errror」を「error」に修正してください。

FM様

お世話になっております。

私もすっかり気にしてなかった。お忙しいのに、何度も何度もご親切にご指導いただき、本当にありがとうございました。

15分刻みで入力することができました。誠にありがとうございました。