Complex scoring of a form and sharing it with the user - example | XM Community
Skip to main content
I wanted to score the SF-36, a popular general physical and mental health questionnaire and share the results with the client.



I needed to solve two main issues: How to do the scoring and how to do the workflow so that there would be the least amount of disruption and a user would receive a pdf with all 10 scores listed (8 primary and 2 summary scores).



The scoring was done by javascript as I couldn"t see how Math alone could do the job. The scoring feature didn"t work as it only shares one score in the end, even though you can calculate at least the 8 primary scales (I didn"t check whether the 2 summary scores could be done).



The latter was achieved by using a timing question, in a block of its own at the end, which runs the javascript on load and moves to the next question after 1 second with the text "Calculating scores ...". In the next block was a text paragraph giving the scores and by clicking on "next", the user received a pdf with the scores at the end.



Here is the javascript Part 1. I expect to put the second part (message too long otherwise) as an answer:



```

Qualtrics.SurveyEngine.addOnload(function()

{

/*Place your JavaScript here to run when the page loads*/



/*Place your JavaScript here to run when the page is unloaded*/

// PF

var v1 = parseInt("${q://QID13/SelectedAnswerRecode/1}",10);

var v2 = parseInt("${q://QID13/SelectedAnswerRecode/2}",10);

var v3 = parseInt("${q://QID13/SelectedAnswerRecode/3}",10);

var v4 = parseInt("${q://QID13/SelectedAnswerRecode/4}",10);

var v5 = parseInt("${q://QID13/SelectedAnswerRecode/5}",10);

var v6 = parseInt("${q://QID13/SelectedAnswerRecode/6}",10);

var v7 = parseInt("${q://QID13/SelectedAnswerRecode/7}",10);

var v8 = parseInt("${q://QID13/SelectedAnswerRecode/8}",10);

var v9 = parseInt("${q://QID13/SelectedAnswerRecode/9}",10);

var v10 = parseInt("${q://QID13/SelectedAnswerRecode/10}",10);

PF = ((v1+v2+v3+v4+v5+v6+v7+v8+v9+v10-10) * 100) / (30-10);

Qualtrics.SurveyEngine.setEmbeddedData("PF",PF);



//RP

var v1 = parseInt("${q://QID14/SelectedAnswerRecode/1}",10);

var v2 = parseInt("${q://QID14/SelectedAnswerRecode/2}",10);

var v3 = parseInt("${q://QID14/SelectedAnswerRecode/3}",10);

var v4 = parseInt("${q://QID14/SelectedAnswerRecode/4}",10);

RP = ((v1+v2+v3+v4-4) * 100) / (8-4);

Qualtrics.SurveyEngine.setEmbeddedData("RP",RP);



var q28Val = "${q://QID17/SelectedChoicesRecode}";

var q29Val = "${q://QID18/SelectedChoicesRecode}";



var q28RecodeMap = {"1" : "6", "2" : "5.4", "3" : "4.2", "4" : "3.2", "5" : "2.2", "6" : "1"};

var q28Val_new ="";

q28Val_new = q28RecodeMap[q28Val];



var q29RecodeMap_1 = {"1" : "6", "2" : "4", "3" : "3", "4" : "2", "5" : "1"};

var q29RecodeMap_2 = {"1" : "5", "2" : "4", "3" : "3", "4" : "2", "5" : "1"};

var q29Val_new = "";

if(q28Val && q28Val == "1") {

q29Val_new = q29RecodeMap_1[q29Val];

} else {

q29Val_new = q29RecodeMap_2[q29Val];

}

BP = ((parseFloat(q28Val_new) + parseInt(q29Val_new) - 2) * 100) / 10;

BP = Math.round( BP * 10 ) / 10;

Qualtrics.SurveyEngine.setEmbeddedData("BP",BP);





// GH

var q2Val = "${q://QID11/SelectedChoicesRecode}";

var q12Val_1 = "${q://QID21/SelectedAnswerRecode/1}";

var q12Val_2 = "${q://QID21/SelectedAnswerRecode/2}";

var q12Val_3 = "${q://QID21/SelectedAnswerRecode/3}";

var q12Val_4 = "${q://QID21/SelectedAnswerRecode/4}";



var q2RecodeMap = {"1" : "5", "2" : "4.4", "3" : "3.4", "4" : "2", "5" : "1"};

var q2Val_new ="";

q2Val_new = q2RecodeMap[q2Val];



var q12RecodeMap = {"1" : "5", "2" : "4", "3" : "3", "4" : "2", "5" : "1"};

var q12Val_new_2 = "";

q12Val_new_2 = q12RecodeMap[q12Val_2];

var q12Val_new_4 = "";

q12Val_new_4 = q12RecodeMap[q12Val_4];



GH = ((parseFloat(q2Val_new) + parseInt(q12Val_1) + parseInt(q12Val_new_2) + parseInt(q12Val_3) + parseInt(q12Val_new_4) - 5) * 100) / (25-5);

GH = Math.round( GH * 10 ) / 10;

Qualtrics.SurveyEngine.setEmbeddedData("GH",GH);



// VT

var q10Val_1 = "${q://QID19/SelectedAnswerRecode/1}";

var q10Val_5 = "${q://QID19/SelectedAnswerRecode/5}";

var q10Val_7 = "${q://QID19/SelectedAnswerRecode/7}";

var q10Val_9 = "${q://QID19/SelectedAnswerRecode/9}";



var q10RecodeMap = {"1" : "6", "2" : "5", "3" : "4", "4" : "3", "5" : "2", "6" : "1"};

var q10Val_1_new ="";

q10Val_1_new = q10RecodeMap[q10Val_1];

var q10Val_5_new ="";

q10Val_5_new = q10RecodeMap[q10Val_5];



VT = ((parseInt(q10Val_1_new) + parseInt(q10Val_5_new) + parseInt(q10Val_7) + parseInt(q10Val_9 ) - 4) * 100) / 20;

//alert("VT: " + VT + " 1: " + parseInt(q10Val_1_new) + " 5: " + parseInt(q10Val_5_new) + " 7: " + parseInt(q10Val_7) + " 9: " + parseInt(q10Val_9));

Qualtrics.SurveyEngine.setEmbeddedData("VT",VT);





// SF

var q7Val = "${q://QID16/SelectedChoicesRecode}";

var q11Val = "${q://QID20/SelectedChoicesRecode}";



var q7Val_new ="";

q7Val_new = q12RecodeMap[q7Val];

// alert("q7Val: " + q7Val + " q11Val: " + q11Val + " q7Val_new: " + q7Val_new);

SF = ((parseInt(q7Val_new) + parseInt(q11Val) - 2) * 100) / 8;

// alert("SF: " + SF + " 1: " + parseInt(q17Val_new) + " 2: " + parseInt(q11Val_new));

SF = Math.round( SF * 10 ) / 10;

Qualtrics.SurveyEngine.setEmbeddedData("SF",SF);





// RE

var v1 = parseInt("${q://QID15/SelectedAnswerRecode/1}",10);

var v2 = parseInt("${q://QID15/SelectedAnswerRecode/2}",10);

var v3 = parseInt("${q://QID15/SelectedAnswerRecode/3}",10);

RE = ((v1+v2+v3-3) * 100) / (6-3);

RE = Math.round(RE * 10 ) / 10;

Qualtrics.SurveyEngine.setEmbeddedData("RE",RE);



//alert("RE: " + RE + " 1: " + parseInt(v1) + " 2: " + parseInt(v2) + " 3: " + parseInt(v3));





// MH

var q10Val_2 = "${q://QID19/SelectedAnswerRecode/2}";

var q10Val_3 = "${q://QID19/SelectedAnswerRecode/3}";

var q10Val_4 = "${q://QID19/SelectedAnswerRecode/4}";

var q10Val_6 = "${q://QID19/SelectedAnswerRecode/6}";

var q10Val_8 = "${q://QID19/SelectedAnswerRecode/8}";



var q10Val_4_new ="";

q10Val_4_new = q10RecodeMap[q10Val_4];

var q10Val_8_new ="";

q10Val_8_new = q10RecodeMap[q10Val_8];



MH = ((parseInt(q10Val_2) + parseInt(q10Val_3) + parseInt(q10Val_4_new) + parseInt(q10Val_6) + parseInt(q10Val_8_new) - 5) * 100) / 25;

//alert("MH: " + MH + " 1: " + parseInt(q10Val_2) + " 3: " + parseInt(q10Val_3) + " 4: " + parseInt(q10Val_4_new) + " 6: " + parseInt(q10Val_6) + " 8: " + parseInt(q10Val_8_new));

Qualtrics.SurveyEngine.setEmbeddedData("MH",MH);



var PF_ZC = "";

PF_ZC = ((parseFloat(PF) - 83.46290)/23.22864);

var RP_ZC = "";

RP_ZC = ((parseFloat(RP) - 80.28166)/34.83783);

var BP_ZC = "";

BP_ZC = ((parseFloat(BP) - 76.94163)/24.83714);

var GH_ZC = "";

GH_ZC = ((parseFloat(GH) - 71.81575)/20.35165);

var VT_ZC = "";

VT_ZC = ((parseFloat(VT) - 64.47694)/19.77187);

var SF_ZC = "";

SF_ZC = ((parseFloat(SF) - 85.05929)/22.29047);

var RE_ZC = "";

RE_ZC = ((parseFloat(RE) - 83.19165)/32.15215);

var MH_ZC = "";

MH_ZC = ((parseFloat(MH) - 75.97772)/16.96210);



// alert("PF_ZC: " + PF_ZC + " PF: " + PF);

// alert("MH_ZC: " + MH_ZC + " MH: " + MH);



```
Part 2 of the javascript:

```



var GPH = "";

GPH = (((parseFloat(PF_ZC) * 0.47268) + (parseFloat(RP_ZC) * 0.38210) + (parseFloat(BP_ZC) * 0.36750) + (parseFloat(GH_ZC) * 0.18993) + (parseFloat(VT_ZC) * -0.01883) + (parseFloat(SF_ZC) * -0.01324) + (parseFloat(RE_ZC) * -0.14971) + (parseFloat(MH_ZC) * -0.27145)) * 10 + 50);

var GMH = "";

GMH = (((parseFloat(PF_ZC) * -0.24358) + (parseFloat(RP_ZC) * -0.13410) + (parseFloat(BP_ZC) * -0.12414) + (parseFloat(GH_ZC) * 0.05271) + (parseFloat(VT_ZC) * 0.27100) + (parseFloat(SF_ZC) * 0.26460) + (parseFloat(RE_ZC) * 0.35922) + (parseFloat(MH_ZC) * 0.48753)) * 10 + 50);

var GPH_ZC = (GPH - 50) / 10;

var GMH_ZC = (GMH - 50) / 10;



GPH = Math.round( GPH * 10 ) / 10;

Qualtrics.SurveyEngine.setEmbeddedData("GPH",GPH);

GMH = Math.round( GMH * 10 ) / 10;

Qualtrics.SurveyEngine.setEmbeddedData("GMH",GMH);

// alert("PF: " + PF + " RP: " + RP + " BP: " + BP + " GH: " + GH + " VT: " + VT + " SF: " + SF + " RE: " + RE + " MH: " + MH + " GPH: " + GPH + " GMH: " + GMH);



function GetZPercent(z)

{

//z == number of standard deviations from the mean



//if z is greater than 6.5 standard deviations from the mean

//the number of significant digits will be outside of a reasonable

//range

if ( z < -6.5)

return 0.0;

if( z > 6.5)

return 1.0;



var factK = 1;

var sum = 0;

var term = 1;

var k = 0;

var loopStop = Math.exp(-23);

while(Math.abs(term) > loopStop)

{

term = .3989422804 * Math.pow(-1,k) * Math.pow(z,k) / (2 * k + 1) / Math.pow(2,k) * Math.pow(z,k+1) / factK;

sum += term;

k++;

factK *= k;



}

sum += 0.5;

sum = sum * 100;

sum = Math.round( sum * 10 ) / 10;



return sum;

}



var PFPercent = GetZPercent(PF_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("PFPercent",PFPercent);

var RPPercent = GetZPercent(RP_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("RPPercent",RPPercent);

var BPPercent = GetZPercent(BP_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("BPPercent",BPPercent);

var GHPercent = GetZPercent(GH_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("GHPercent",GHPercent);

var VTPercent = GetZPercent(VT_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("VTPercent",VTPercent);

var SFPercent = GetZPercent(SF_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("SFPercent",SFPercent);

var REPercent = GetZPercent(RE_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("REPercent",REPercent);

var MHPercent = GetZPercent(MH_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("MHPercent",MHPercent);

var GPHPercent = GetZPercent(GPH_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("GPHPercent",GPHPercent);

var GMHPercent = GetZPercent(GMH_ZC);

Qualtrics.SurveyEngine.setEmbeddedData("GMHPercent",GMHPercent);





});



```

Leave a Reply