選択肢IDを数値として合計したい
下記のスクリプトタスクが動きません。
スクリプトエラーが発生しました。 TypeError: Cannot read property 'get' of null at line number 118
というエラーが発生します。
やりたい事は、選択肢型の選択肢IDに得点をセットして、選択肢の数値を合計する事です。
(未選択の選択肢は0として計算したいです。)
未選択の判定が間違っているようですので、正しい処理を教えていただけますか。
let score1=0;
let score2=0;
//Aパターン アルバイト採点
score1 =+ toNumber("q_select7");
score1 =+ toNumber("q_select9");
score1 =+ toNumber("q_select11");
score1 =+ toNumber("q_select13");
score1 =+ toNumber("q_select15");
score1 =+ toNumber("q_select18");
score1 =+ toNumber("q_select20");
score1 =+ toNumber("q_select22");
score1 =+ toNumber("q_select24");
score1 =+ toNumber("q_select27");
score1 =+ toNumber("q_select29");
score1 =+ toNumber("q_select31");
score1 =+ toNumber("q_select34");
score1 =+ toNumber("q_select36");
score1 =+ toNumber("q_select38");
score1 =+ toNumber("q_select41");
score1 =+ toNumber("q_select43");
score1 =+ toNumber("q_select45");
score1 =+ toNumber("q_select47");
//Bパターン アルバイト採点
score1 =+ toNumber("q_select61");
score1 =+ toNumber("q_select63");
score1 =+ toNumber("q_select65");
score1 =+ toNumber("q_select67");
score1 =+ toNumber("q_select69");
score1 =+ toNumber("q_select71");
score1 =+ toNumber("q_select73");
score1 =+ toNumber("q_select75");
score1 =+ toNumber("q_select77");
score1 =+ toNumber("q_select79");
score1 =+ toNumber("q_select81");
score1 =+ toNumber("q_select83");
score1 =+ toNumber("q_select85");
score1 =+ toNumber("q_select87");
score1 =+ toNumber("q_select89");
score1 =+ toNumber("q_select91");
score1 =+ toNumber("q_select93");
score1 =+ toNumber("q_select95");
score1 =+ toNumber("q_select97");
//Aパターン 店長採点
score2 =+ toNumber("q_select8");
score2 =+ toNumber("q_select10");
score2 =+ toNumber("q_select12");
score2 =+ toNumber("q_select14");
score2 =+ toNumber("q_select16");
score2 =+ toNumber("q_select19");
score2 =+ toNumber("q_select21");
score2 =+ toNumber("q_select23");
score2 =+ toNumber("q_select25");
score2 =+ toNumber("q_select28");
score2 =+ toNumber("q_select30");
score2 =+ toNumber("q_select32");
score2 =+ toNumber("q_select35");
score2 =+ toNumber("q_select37");
score2 =+ toNumber("q_select39");
score2 =+ toNumber("q_select42");
score2 =+ toNumber("q_select44");
score2 =+ toNumber("q_select46");
score2 =+ toNumber("q_select48");
//Bパターン 店長採点
score2 =+ toNumber("q_select62");
score2 =+ toNumber("q_select64");
score2 =+ toNumber("q_select66");
score2 =+ toNumber("q_select68");
score2 =+ toNumber("q_select70");
score2 =+ toNumber("q_select72");
score2 =+ toNumber("q_select74");
score2 =+ toNumber("q_select76");
score2 =+ toNumber("q_select78");
score2 =+ toNumber("q_select80");
score2 =+ toNumber("q_select82");
score2 =+ toNumber("q_select84");
score2 =+ toNumber("q_select86");
score2 =+ toNumber("q_select88");
score2 =+ toNumber("q_select90");
score2 =+ toNumber("q_select92");
score2 =+ toNumber("q_select94");
score2 =+ toNumber("q_select96");
score2 =+ toNumber("q_select98");
engine.log("score1:" + score1);
engine.log("score2:" + score2);
engine.setDataByVarName("q_number55", new java.math.BigDecimal(score1 +''));
engine.setDataByVarName("q_number56", new java.math.BigDecimal(score2 + ''));
//文字を数値に変換する関数
function toNumber(value){
//選択肢がnullの場合は0
const select = engine.findDataByVarName(value).get(0);
if(typeof select === "null"){
engine.log(value + "はnullです");
return 0;
}
//文字を数値に変換
result = parseFloat(value);
//数値に変換できない文字の場合は0
if(isNaN(result)){
engine.log(value + "はNaNです");
return 0;
}
engine.log(value + "は" + result + "です");
return result
}
-
null 判定の前に、null オブジェクトで get() を呼び出そうとしてしまっているのがエラーの原因だと思います。
//選択肢がnullの場合は0
const select = engine.findDataByVarName(value).get(0);
if(typeof select === "null"){次のようなコードではどうでしょうか。
(typeof null は "object" なので書き換えています。)//選択肢がnullの場合は0
const selects = engine.findDataByVarName(value);
let select;
if(selects == null){
...
} else {
select = selects.get(0);
} -
返信ありがとうございます。
色々試行錯誤して、下記のようにJSONにしてからnullを判定していましたが、そのままいけそうですね。
function toNumber(value){
const selects = engine.findDataByVarName(value);
//選択肢がnullの場合は0
if(JSON.stringify(selects)=== "null"){
return 0;
}
//文字を数値に変換
result = parseFloat(selects.get(0).getValue());
//数値に変換できない文字の場合は0
if(isNaN(result)){
return 0;
}
return result
}もう1点困りごとがあります。
engine.setDataByVarName("q_number55", new java.math.BigDecimal(score1 +''));
これが「3.5」などの小数の場合に整数になってしまいます。何か良い解決策はないでしょうか。
サインインしてコメントを残してください。
コメント
5件のコメント