- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-07-2022 01:24 AM
現在、ロールによってエラー文を出すスクリプトを以下のように作成しております。
スクリプトインクルードのelse ifのAND条件が上手く反映されず、エラー文が表示されない状況です。
また、スクリプトバックグラウンドでは、else ifの条件をきちんと満たしており、result.number = 2;という値が取得できていることを確認しました。
javascriptは初心者であるため、解決方法がございましたらご教授いただけると幸いです。
【カタログクライアントスクリプト】
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.addParam('sysparm_user',g_form.getValue('assigned_to'));
ajax.getXMLAnswer(function(answer) {
//戻り値のJSON形式をobject形式に変換
var returnObject = JSON.parse(answer);
//再帰呼び出しを防止する
if (newValue > returnObject.curDate) {
return;
}
//日付が今日より前
if(returnObject.number == '1'){
alert('【エラー】現在時刻より前の日時は予約できません。');
g_form.setValue('work_start',returnObject.curDate);
g_form.showFieldMsg('work_start','現在時刻より前の日時は予約できません。','error');
//予約が1か月以上先かつ、管理者権限を持っていない
}else if(returnObject.number == '2'){
alert('【エラー】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 user = this.getParameter('sysparm_user');
//管理者権限のロールを持っているか
var gr = new GlideRecord('sys_user_has_role');
gr.addQuery('user.sys_id',user);
gr.addQuery('role.name','reservation_manager');
gr.query();
var count = gr.getRowCount();
var gdt = new GlideDateTime();
var currentDate = gdt.getDisplayValue();
gdt.addMonthsLocalTime(1);//1か月後
var maxDate = gdt.getDate();
var result = {};
result.user = user;
//開始日が現在時刻より前の場合
if(work_start < gdt){
result.number = 1;
result.curDate = currentDate;
//開始日が1か月以上先の場合かつ、管理者権限を持っていない場合
}else if(work_start > maxDate && count == 0){
result.number = 2;
result.curDate = currentDate;
}
return JSON.stringify(result);
},
type: 'CalculationDateTime'
});
解決済! 解決策の投稿を見る。

- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-07-2022 05:36 AM
こんにちは、
スクリプトインクルードにログインして、JSONを文字列化してクライアントに送り返すときに、JSONがどのように表示されるかを確認してください。次に、クライアントスクリプトで、ログ(アラート)を使用してオブジェクトの値を確認してください。彼らはひもですか?それとも整数ですか(1と2の場合)?適切な値を使用すると、正しく機能するはずです。
該当する場合は、返信に「役に立った/正しい」のマークを付けてください。ありがとう!
Kon'nichiwa, sukuriputoinkurūdo ni roguin shite, jeison o mojiretsu-ka shite kuraianto ni okurikaesu toki ni, jeison ga dono yō ni hyōji sa reru ka o kakuninshitekudasai. Tsugini, kuraiantosukuriputo de, rogu (arāto) o shiyō shite obujekutono-chi o kakuninshitekudasai. Karera wa himodesu ka? Soretomo seisūdesu ka (1 to 2 no baai)? Tekisetsuna-chi o shiyō suru to, tadashiku kinō suru hazudesu. Gaitō suru baai wa, henshin ni `yakunitatta/ tadashī' no māku o tsukete kudasai. Arigatō!
Please consider marking my reply as Helpful and/or Accept Solution, if applicable. Thanks!

- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-07-2022 05:36 AM
こんにちは、
スクリプトインクルードにログインして、JSONを文字列化してクライアントに送り返すときに、JSONがどのように表示されるかを確認してください。次に、クライアントスクリプトで、ログ(アラート)を使用してオブジェクトの値を確認してください。彼らはひもですか?それとも整数ですか(1と2の場合)?適切な値を使用すると、正しく機能するはずです。
該当する場合は、返信に「役に立った/正しい」のマークを付けてください。ありがとう!
Kon'nichiwa, sukuriputoinkurūdo ni roguin shite, jeison o mojiretsu-ka shite kuraianto ni okurikaesu toki ni, jeison ga dono yō ni hyōji sa reru ka o kakuninshitekudasai. Tsugini, kuraiantosukuriputo de, rogu (arāto) o shiyō shite obujekutono-chi o kakuninshitekudasai. Karera wa himodesu ka? Soretomo seisūdesu ka (1 to 2 no baai)? Tekisetsuna-chi o shiyō suru to, tadashiku kinō suru hazudesu. Gaitō suru baai wa, henshin ni `yakunitatta/ tadashī' no māku o tsukete kudasai. Arigatō!
Please consider marking my reply as Helpful and/or Accept Solution, if applicable. Thanks!
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-07-2022 09:27 PM
ご回答ありがとうございます。
どこが原因かを探る上で、参考になりました。

- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-07-2022 05:37 PM
お世話になります。
スクリプト中の
----
if(returnObject.number == '1'){
alert('【エラー】現在時刻より前の日時は予約できません。');
g_form.setValue('work_start',returnObject.curDate);
g_form.showFieldMsg('work_start','現在時刻より前の日時は予約できません。','error');
}else if(returnObject.number == '2'){
alert('【エラー】1か月以上先の日時は予約できません。');
g_form.setValue('work_start',returnObject.curDate);
g_form.showFieldMsg('work_start','1か月以上先の日時は予約できません。','error');
}
----
について、 returnObject.numberは2が入っているのに、else ifの評価がうまくいかず、そのなかのメッセージが出ない、と理解しました。(違っていたらご指摘ください)
1.returnObject.number == '1'側が正しく動作しているとすると良くわからないのですが、
returnObject.number == 1 または returnObject.number == 2での評価でどうか?
2.条件が二種類しかないのであれば、else ifではなく elseでやってみる(これは今後の拡張性のためには避けたいです)
3.'==='厳密等価演算子を使って、形違いのエラーとなるかどうかやってみる(少しデバッグすることになりますが)
参考になれば幸いです。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
06-07-2022 09:26 PM
ご回答ありがとうございます。
今回の場合、下記が原因でした。
Javascriptにあまり詳しくないため、ご回答内容は参考になりました。
ありがとうございます。
//再帰呼び出しを防止する
if (newValue > returnObject.curDate) {
return;
}