Qualtrics问卷中滑块题(含矩阵)0/5/10选项计数的JS问题
统计Qualtrics问卷中滑块题(含矩阵滑块)的0/5/10选中次数问题
我需要统计Qualtrics问卷里所有单个滑块题和矩阵滑块题中,0、5、10这三个值被选中的总次数,已经初始化了Counter0、Counter5、Counter10三个嵌入式数据(初始值均为0),但尝试的代码都无法正常工作:
最初的代码
Qualtrics.SurveyEngine.addOnload(function() { var isCorrect10 = 10; var currentCounter10 = Qualtrics.SurveyEngine.getEmbeddedData("Counter10"); if (!currentCounter10) { currentCounter10 = 0; } var isCorrect0 = 0; var currentCounter0 = Qualtrics.SurveyEngine.getEmbeddedData("Counter0"); if (!currentCounter0) { currentCounter0 = 0; } var isCorrect5 = 5; var currentCounter5 = Qualtrics.SurveyEngine.getEmbeddedData("Counter5"); if (!currentCounter5) { currentCounter5 = 5; } // If it's selected, increment if (isCorrect10) { currentCounter10++; Qualtrics.SurveyEngine.setEmbeddedData("Counter10",currentCounter10.toString()); } if (isCorrect0) { currentCounter0++; Qualtrics.SurveyEngine.setEmbeddedData("Counter0",currentCounter0.toString()); } if (isCorrect5) { currentCounter5++; Qualtrics.SurveyEngine.setEmbeddedData("Counter5",currentCounter5.toString()); } });
问题:无论选中什么值都会计数1次,且无法适配含多个滑块的矩阵题。
修改版本1
Qualtrics.SurveyEngine.addOnload(function() { // Get current question ID var currentQuestionID = this.getQuestionInfo().QuestionID; // Define result names for counters var Counter10 = "Counter10"; var Counter0 = "Counter0"; var Counter5 = "Counter5"; // Retrieve and parse embedded data values for counters var currentCounter10 = parseInt(Qualtrics.SurveyEngine.getEmbeddedData(Counter10), 10) || 0; var currentCounter0 = parseInt(Qualtrics.SurveyEngine.getEmbeddedData(Counter0), 10) || 0; var currentCounter5 = parseInt(Qualtrics.SurveyEngine.getEmbeddedData(Counter5), 10) || 0; // Function to get the selected value from a slider based on its number function getSliderValue(sliderNumber) { var sliderId = currentQuestionID + '_' + sliderNumber; var responseTextField = document.getElementById(sliderId); if (responseTextField) { return parseInt(responseTextField.value, 10); // Convert to integer } else { console.log("Element with ID " + sliderId + " not found."); return null; } } document.getElementById('NextButton').onclick = function(event) { // Assuming up to 5 sliders, since 4 is max for (var i = 1; i <= 5; i++) { var selectedValue = getSliderValue(i); if (selectedValue !== null) { // Increment the appropriate counter based on the selected value if (selectedValue === 10) { currentCounter10++; Qualtrics.SurveyEngine.setEmbeddedData(Counter10, currentCounter10.toString()); } else if (selectedValue === 0) { currentCounter0++; Qualtrics.SurveyEngine.setEmbeddedData(Counter0, currentCounter0.toString()); } else if (selectedValue === 5) { currentCounter5++; Qualtrics.SurveyEngine.setEmbeddedData(Counter5, currentCounter5.toString()); } // Exit loop after processing the selected value break; } } // Proceed to the next question Qualtrics.SurveyEngine.navClick(event, 'NextButton'); }; });
修改版本2
Qualtrics.SurveyEngine.addOnPageSubmit(function (type) { // To record the selection when the page is submitted if (type == "next") { var selChoice = this.getSelectedChoices(); // Set Embedded Data var currentcount0 = parseInt(Qualtrics.SurveyEngine.getEmbeddedData('count0'),10); var currentcount5 = parseInt(Qualtrics.SurveyEngine.getEmbeddedData('count5'),10); var currentcount10 = parseInt(Qualtrics.SurveyEngine.getEmbeddedData('count10'),10); if (selChoice == 5) { const newcount5 = currentcount5 + 1 ; Qualtrics.SurveyEngine.setEmbeddedData("count5", newcount5); }; if (selChoice == 0) { const newcount0 = currentcount0 + 1 ; Qualtrics.SurveyEngine.setEmbeddedData("count0", newcount0); }; if (selChoice == 10) { const newcount10 = currentcount10 + 1 ; Qualtrics.SurveyEngine.setEmbeddedData("count10", newcount10); }; } });
问题:修改后的代码计数器值始终为0,无法正常统计。
解决方案
问题根源
- 原代码直接判断固定数值(如
isCorrect10=10),该条件永远为真,导致无差别计数 - 修改版1依赖DOM元素ID,Qualtrics滑块的实际ID规则不符,且循环
break只处理第一个滑块,忽略矩阵题的多个滑块 - 修改版2的
getSelectedChoices()不适用于滑块题,滑块题需要获取响应值而非选项ID,同时未处理矩阵题的多响应项
通用适配代码(单个滑块+矩阵滑块)
将以下代码添加到每个需要统计的滑块/矩阵滑块题的JavaScript编辑区:
Qualtrics.SurveyEngine.addOnPageSubmit(function(type) { // 仅在页面向前提交时执行统计 if (type !== "next") return; // 初始化计数器,处理嵌入式数据为空的情况 let counter0 = parseInt(Qualtrics.SurveyEngine.getEmbeddedData("Counter0")) || 0; let counter5 = parseInt(Qualtrics.SurveyEngine.getEmbeddedData("Counter5")) || 0; let counter10 = parseInt(Qualtrics.SurveyEngine.getEmbeddedData("Counter10")) || 0; // 获取当前问题的所有响应数据,自动适配单个/矩阵滑块 const questionResponses = this.getQuestionData().Responses; // 遍历所有响应项 for (const respKey in questionResponses) { if (questionResponses.hasOwnProperty(respKey)) { const value = parseInt(questionResponses[respKey].Value, 10); // 判断并更新对应计数器 switch(value) { case 0: counter0++; break; case 5: counter5++; break; case 10: counter10++; break; default: // 非目标值不处理 break; } } } // 更新嵌入式数据 Qualtrics.SurveyEngine.setEmbeddedData("Counter0", counter0.toString()); Qualtrics.SurveyEngine.setEmbeddedData("Counter5", counter5.toString()); Qualtrics.SurveyEngine.setEmbeddedData("Counter10", counter10.toString()); });
代码说明
- 使用
addOnPageSubmit事件:确保在页面提交时获取最终选中值,避免提前获取导致的错误 - 自动适配题型:通过
getQuestionData().Responses获取所有响应,兼容单个滑块(1个响应项)和矩阵滑块(多个响应项) - 精准判断数值:用
switch分支处理目标值,避免逻辑混乱 - 容错处理:嵌入式数据为空时自动初始化为0,避免NaN错误
注意事项
- 确保
Counter0、Counter5、Counter10已在问卷流程→嵌入式数据中添加,初始值设为0 - 代码需添加到每个需要统计的滑块/矩阵滑块题中(编辑问题→齿轮图标→添加JavaScript)
- 测试时可通过浏览器控制台查看嵌入式数据变化,验证计数正确性
内容的提问来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

