- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-02-2022 10:41 PM
現在、フォームにエラー文を表示させるスクリプトを以下のように作成しています。
分岐により、エラーメッセージを変えておりますが、
else ifの条件のときに、エラー文が2つとも出てきてしまいます。※添付画像
解決方法がありましたらご教授いただければ幸いです。
【クライアントスクリプト】
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
var ajax = new GlideAjax('CalculationDateTime');
ajax.addParam('sysparm_name', 'getCorrectDateTime');
ajax.addParam('sysparm_work_start', newValue);
ajax.getXMLAnswer(function(answer) {
var returnObject = JSON.parse(answer);
if(returnObject.number == '1'){ //日付が今日より前
g_form.setValue('work_start',returnObject.curDate);
g_form.showFieldMsg('work_start','現在時刻より前の日時は予約できません。','error');
}else if(returnObject.number == '2'){ //日時が1か月以上先
g_form.setValue('work_start',returnObject.curDate);
g_form.showFieldMsg('work_start','1か月以上先の日時は予約できません。','error');
}
});
}
【スクリプトインクルード】
var CalculationDateTime = Class.create();
CalculationDateTime.prototype = Object.extendsObject(AbstractAjaxProcessor, {
getCorrectDateTime:function(){
var work_start = new GlideDateTime(this.getParameter('sysparm_work_start'));
var gdt = new GlideDateTime();
var currentDate = gdt.getDisplayValue();
gdt.addMonthsLocalTime(1);
var maxDate = gdt.getDate();
var result = {};
if(work_start < gdt){
result.number = 1;
result.curDate = currentDate;
}else if(work_start > maxDate){
result.number = 2;
result.curDate = currentDate;
}
return JSON.stringify(result);
},
type: 'CalculationDateTime'
});
解決済! 解決策の投稿を見る。

- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-02-2022 11:23 PM
aさん、
動作確認はまだ行っていませんが、もしかしてフィールド「work_start」でonChange()を設定されていますでしょうか?もしその場合はonChangeで自分自身の値を変更しているので再帰的にonChangeが実行されます。
それを再帰呼び出しを防止するにはif文に「newValue==<今日の日付>」を追加して既に今日の日付に設定されている場合はonChangeを実行しないようにします。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-05-2022 06:55 PM
Thank you for the advice!

- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-03-2022 02:29 AM
aさん、
日付チェックをするだけならばクライアントスクリプトのみで行えます。
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
var deviation = 5 * 1000; // 5秒。許可する範囲
var today = new Date();
var nextMonth = new Date();
var todayNum = today.valueOf();
var workStartNum = getDateFromFormat(newValue, g_user_date_time_format);
if (workStartNum > todayNum && workStartNum < (todayNum + deviation)) { // 5秒前後の日時が選択された場合はOKとする。再帰呼び出しを防止する
return;
}
var now = formatDate(g_user_date_time_format, (new Date()));
if (workStartNum < (todayNum - deviation)) {
g_form.setValue('work_start', now);
g_form.showFieldMsg('work_start', '現在時刻より前の日時は予約できません。', 'error');
}
nextMonth.setMonth(nextMonth.getMonth() + 1);
var nextMonthNum = nextMonth.valueOf();
if (workStartNum > nextMonthNum) {
g_form.setValue('work_start', now);
g_form.showFieldMsg('work_start', '1か月以上先の日時は予約できません。', 'error');
}
function formatDate(format, date) {
var year = date.getFullYear();
var month = pad(date.getMonth() + 1);
var day = pad(date.getDate());
var hours = pad(date.getHours());
var min = pad(date.getMinutes());
var sec = pad(date.getSeconds());
format = format.replace('yyyy', year);
format = format.replace('MM', month);
format = format.replace('dd', day);
format = format.replace('HH', hours);
format = format.replace('mm', min);
format = format.replace('ss', sec);
return format;
}
function pad(str) {
return ('00' + str).slice(-2);
}
}
実行結果:
1.以前の日時が選択された場合
2.一か月より後の日時が選択された場合
3.一か月以内の日付が選択された場合
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-05-2022 06:52 PM
スクリプトのご提示もありがとうございます。
参考にさせていただきました。