新規投稿
フォローする

日付け項目制限について

お世話になっております。初投稿でございまして、今後ともご指導お願いいたします。

やりたいこと:開催日の幅はコントロールできましたが開始期間&終了期間が同年度で入力させたい。例:年度が2019年の場合、開始期間&終了期間が2019年内になる。今はその動きをどうすればいいかわからなくて、初心者の為、どなたかご教授頂けましたら大変ありがたいです。どうぞよろしくお願い致します。

(function() {
"use strict";
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function(event){
if(event.record.開催日.value < event.record.開始期間.value || event.record.開催日.value > event.record.終了期間.value){
event.record.開催日.error = '期限内を入力してください。登録できません。';
}
return event;
});
})();
0

5件のコメント

Avatar
FM

開催日と同じ年度でない開始期間or終了期間にエラーを表示したいのか、開始期間or終了期間と同じ年度でない開催日にエラーを表示したいのかで書き方が変わるのですが、エラーメッセージ的に後者だと仮定して以下にサンプルを上げます。
年度、とのことなので4月始まりで計算しています。

(function() {
"use strict";
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function(event){
var record = event.record;
var eventDate = record.開催日.value;
var eventYear = getNendo(eventDate);
var startDate = record.開始期間.value;
var startYear = getNendo(startDate);
var endDate = record.終了期間.value;
var endYear = getNendo(endDate);

if(eventYear !== startYear || eventYear !== endYear){
record.開催日.error = '期限内を入力してください。登録できません。';
}

return event;
});

// 参考記事
// https://javascript.programmer-reference.com/js-nendo/
function getNendo(val){
var result = "日付文字列が不正です。"; //日付不正時のメッセージ
try{
var y = Number(val.substr(0,4));
var m = Number(val.substr(5,2));
var d = Number(val.substr(8,2));
var dt = new Date(y, m-1, d);
if (dt.getFullYear()==y && dt.getMonth()==m-1 && dt.getDate()==d){
if(m<4){ //4月はじまり
result = y-1;
}else{
result = y;
}
}
return result;
}catch(ex){
return result;
}
}

})();
1
Avatar
柳生

FM 様

お世話になっております。貴重なわかりやすいご説明とコードまでいただき、本当にありがとうございます。

私の表現があいまいになって大変申し訳ございません。

現状としては:同じ年で内容によって、開始期間・終了期間の申し込みがいっぱいあります。年別(2019年、2020年など)の集計を後でしたいのが目的です。

年度項目(すみません、名前の付け方が問題ありそうですね・・数値かドロップダウンで記入するとして)&開始期間&終了期間の間の連携を作ろうかなぁと思っております。その際、年度項目をメインとして、開始期間と終了期間が同じ年でないと開始期間項目か終了期間項目に(同じ年で記入してくださいという)エラーメッセージを表示させたいです。可能でしょうか?それとも年度項目を改めたほうがベストなのか、混乱しております...もしお時間ありましたら、是非アドバイスなどいただきたいです。

なにとぞ、宜しくお願い申し上げます。

 

柳生により編集されました
0
Avatar
FM

失礼致しました。開催日の幅というのは開催日の入力制限のことだったんですね。
その様な場合でも、上記で挙げたコードを一部修正して柳生由夏さんが書かれたif文をreturn eventの前に追記するだけで可能だと思います。

var record = event.record;
var eventDate = record.開催日.value;
var eventYear = getNendo(eventDate);
var startDate = record.開始期間.value;
var startYear = getNendo(startDate);
var endDate = record.終了期間.value;
var endYear = getNendo(endDate);
if(eventYear !== startYear || eventYear !== endYear){
record.開催日.error = '期限内を入力してください。登録できません。';
}

//以下に書き換える

var startDate = event.record.開始期間.value;
var startYear = getNendo(startDate);
var endDate = event.record.終了期間.value;
var endYear = getNendo(endDate);
var year = event.record.年度.value;
if(startYear !== year){
event.record.開始期間.error = '年度の値と同じ年度で入力してください。登録できません。';
}
if(endYear !== year){
event.record.終了期間.error = '年度の値と同じ年度で入力してください。登録できません。';
}
// 柳生由夏さんが書かれたif文を追記
if(event.record.開催日.value < event.record.開始期間.value || event.record.開催日.value > event.record.終了期間.value){
event.record.開催日.error = '期限内を入力してください。登録できません。';
}
FMにより編集されました
1
Avatar
FM

getnendoで数値型を返していて、if内の厳密不等価演算子(!==)で文字列と数値を比較していた為に問答無用でエラーになってしまっていたようです。

if (startYear !== year)...
if (endYear !== year)...

上記の「!==」をそれぞれ「!=」に書き換えてください。
②の変更は不要です。(①は年度が1月始まりならそのままで大丈夫です)

1
Avatar
柳生

FM 様

お世話になっております。おかげ様で理想な動きができました。何度も何度も教えていただき、本当にありがとうございました。とても感謝しております。

 

0
ログインしてコメントを残してください。