qualtrics javascript:使用以前的答案自动填充矩阵 table
qualtrics javascript: autopopulate matrix table using previous answers
我在 Qualtrics 调查中问了两次相同的矩阵 table(多选)问题。当我第二次向用户显示问题时,我希望从用户第一次回答问题时自动填充答案。我查看了文档中的代码片段,所以我知道如何 select 当前问题中的复选框,例如
for (var i = 1; i <= rows; i++) {
for (var j = 1; j <= cols; j++) {
this.setChoiceValue(i, j, true);
}
}
我的问题是我不知道如何从上一个问题中得到 selected 答案。我已经尝试过类似的方法但它不起作用(无法读取 null 的 属性 'attr'):
var isChecked = $("#QR~QID2~" + i + "~" + j").attr('checked');
This page from the documentation 建议使用管道文本,类似于:
var selectedChoice = "${q://QID2/ChoiceGroup/SelectedChoices}";
这似乎为我提供了已 selected 的调查行中的独特陈述,但我需要为每个陈述(行) 在问题中。我不确定如何制定正确的管道文本。
如有任何建议,我们将不胜感激!谢谢。
编辑 1:这是我最终使用的代码。
Qualtrics.SurveyEngine.addOnload(function()
{
/*Place Your Javascript Below This Line*/
var numChecks = $(this.getQuestionContainer()).select('input[type="checkbox"]');
var numCols = 4;
var numRows = numChecks.length / numCols;
var map = {};
//I won't have more than 20 rows in the matrix
map[1] = "${q://QID53/SelectedAnswerRecode/1}";
map[2] = "${q://QID53/SelectedAnswerRecode/2}";
map[3] = "${q://QID53/SelectedAnswerRecode/3}";
map[4] = "${q://QID53/SelectedAnswerRecode/4}";
map[5] = "${q://QID53/SelectedAnswerRecode/5}";
map[6] = "${q://QID53/SelectedAnswerRecode/6}";
map[7] = "${q://QID53/SelectedAnswerRecode/7}";
map[8] = "${q://QID53/SelectedAnswerRecode/8}";
map[9] = "${q://QID53/SelectedAnswerRecode/9}";
map[10] = "${q://QID53/SelectedAnswerRecode/10}";
map[11] = "${q://QID53/SelectedAnswerRecode/11}";
map[12] = "${q://QID53/SelectedAnswerRecode/12}";
map[13] = "${q://QID53/SelectedAnswerRecode/13}";
map[14] = "${q://QID53/SelectedAnswerRecode/14}";
map[15] = "${q://QID53/SelectedAnswerRecode/15}";
map[16] = "${q://QID53/SelectedAnswerRecode/16}";
map[17] = "${q://QID53/SelectedAnswerRecode/17}";
map[18] = "${q://QID53/SelectedAnswerRecode/18}";
map[19] = "${q://QID53/SelectedAnswerRecode/19}";
map[20] = "${q://QID53/SelectedAnswerRecode/20}";
for (var i = 1; i <= numRows; i++) {
//Get the recode values for row i
var rowValues = map[i].split(",");
//Loop through all the recode values for the current row
for (var c = 0 ; c < rowValues.length; c++) {
var val = parseInt(rowValues[c].trim());
//Select the current question's checkboxes corresponding to the recode values
this.setChoiceValue(i, val, true);
}
}
});
编辑 2:
我现在有一些奇怪的行为。我正在尝试填充只有 3 行的 table,所以我认为
"${q://QID53/SelectedAnswerRecode/1}";
"${q://QID53/SelectedAnswerRecode/2}";
"${q://QID53/SelectedAnswerRecode/3}";
会给我前一个 table 问题 "QID53" 的前三行的值。但实际上那些 return 空字符串,直到调用
"${q://QID53/SelectedAnswerRecode/5}";
"${q://QID53/SelectedAnswerRecode/6}";
"${q://QID53/SelectedAnswerRecode/7}";
我得到前三个值。
对于 14 行的 table,在调用
之前没有 returns
"${q://QID53/SelectedAnswerRecode/4}";
并且 table 中的最后 3 行留空。
我假设 "SelectedAnswerRecode" 之后的数字是行号是错误的吗?我缺少关于偏移量的东西吗?
我想你会想要输入重新编码值。类似于:
var r1ar = parseInt("${q://QID2/SelectedAnswerRecode/1}");
var r2ar = parseInt("${q://QID2/SelectedAnswerRecode/2}");
然后设置值:
this.setChoiceValue(1, r1ar, true);
this.setChoiceValue(2, r2ar, true);
确保您的重新编码值与列 ID 匹配。
Edits/additions 基于以下评论:
javascript 中的管道值在页面发送到浏览器之前在服务器端得到解析,因此它们是固定值。在 javascript 中无法使它们动态化。如果您的问题由于显示逻辑或结转而具有可变行数,则您必须在 javascript 中包含所有可能的管道值,然后检查它们以查看哪些有效。
对于多答案矩阵,您可以使用 str.split(',') 将逗号分隔列表转换为数组,然后遍历数组。 Qualtrics 在逗号分隔列表中的逗号后包含空格,因此您必须 trim() 数组中的字符串。
我在 Qualtrics 调查中问了两次相同的矩阵 table(多选)问题。当我第二次向用户显示问题时,我希望从用户第一次回答问题时自动填充答案。我查看了文档中的代码片段,所以我知道如何 select 当前问题中的复选框,例如
for (var i = 1; i <= rows; i++) {
for (var j = 1; j <= cols; j++) {
this.setChoiceValue(i, j, true);
}
}
我的问题是我不知道如何从上一个问题中得到 selected 答案。我已经尝试过类似的方法但它不起作用(无法读取 null 的 属性 'attr'):
var isChecked = $("#QR~QID2~" + i + "~" + j").attr('checked');
This page from the documentation 建议使用管道文本,类似于:
var selectedChoice = "${q://QID2/ChoiceGroup/SelectedChoices}";
这似乎为我提供了已 selected 的调查行中的独特陈述,但我需要为每个陈述(行) 在问题中。我不确定如何制定正确的管道文本。
如有任何建议,我们将不胜感激!谢谢。
编辑 1:这是我最终使用的代码。
Qualtrics.SurveyEngine.addOnload(function()
{
/*Place Your Javascript Below This Line*/
var numChecks = $(this.getQuestionContainer()).select('input[type="checkbox"]');
var numCols = 4;
var numRows = numChecks.length / numCols;
var map = {};
//I won't have more than 20 rows in the matrix
map[1] = "${q://QID53/SelectedAnswerRecode/1}";
map[2] = "${q://QID53/SelectedAnswerRecode/2}";
map[3] = "${q://QID53/SelectedAnswerRecode/3}";
map[4] = "${q://QID53/SelectedAnswerRecode/4}";
map[5] = "${q://QID53/SelectedAnswerRecode/5}";
map[6] = "${q://QID53/SelectedAnswerRecode/6}";
map[7] = "${q://QID53/SelectedAnswerRecode/7}";
map[8] = "${q://QID53/SelectedAnswerRecode/8}";
map[9] = "${q://QID53/SelectedAnswerRecode/9}";
map[10] = "${q://QID53/SelectedAnswerRecode/10}";
map[11] = "${q://QID53/SelectedAnswerRecode/11}";
map[12] = "${q://QID53/SelectedAnswerRecode/12}";
map[13] = "${q://QID53/SelectedAnswerRecode/13}";
map[14] = "${q://QID53/SelectedAnswerRecode/14}";
map[15] = "${q://QID53/SelectedAnswerRecode/15}";
map[16] = "${q://QID53/SelectedAnswerRecode/16}";
map[17] = "${q://QID53/SelectedAnswerRecode/17}";
map[18] = "${q://QID53/SelectedAnswerRecode/18}";
map[19] = "${q://QID53/SelectedAnswerRecode/19}";
map[20] = "${q://QID53/SelectedAnswerRecode/20}";
for (var i = 1; i <= numRows; i++) {
//Get the recode values for row i
var rowValues = map[i].split(",");
//Loop through all the recode values for the current row
for (var c = 0 ; c < rowValues.length; c++) {
var val = parseInt(rowValues[c].trim());
//Select the current question's checkboxes corresponding to the recode values
this.setChoiceValue(i, val, true);
}
}
});
编辑 2:
我现在有一些奇怪的行为。我正在尝试填充只有 3 行的 table,所以我认为
"${q://QID53/SelectedAnswerRecode/1}";
"${q://QID53/SelectedAnswerRecode/2}";
"${q://QID53/SelectedAnswerRecode/3}";
会给我前一个 table 问题 "QID53" 的前三行的值。但实际上那些 return 空字符串,直到调用
"${q://QID53/SelectedAnswerRecode/5}";
"${q://QID53/SelectedAnswerRecode/6}";
"${q://QID53/SelectedAnswerRecode/7}";
我得到前三个值。
对于 14 行的 table,在调用
之前没有 returns"${q://QID53/SelectedAnswerRecode/4}";
并且 table 中的最后 3 行留空。
我假设 "SelectedAnswerRecode" 之后的数字是行号是错误的吗?我缺少关于偏移量的东西吗?
我想你会想要输入重新编码值。类似于:
var r1ar = parseInt("${q://QID2/SelectedAnswerRecode/1}");
var r2ar = parseInt("${q://QID2/SelectedAnswerRecode/2}");
然后设置值:
this.setChoiceValue(1, r1ar, true);
this.setChoiceValue(2, r2ar, true);
确保您的重新编码值与列 ID 匹配。
Edits/additions 基于以下评论:
javascript 中的管道值在页面发送到浏览器之前在服务器端得到解析,因此它们是固定值。在 javascript 中无法使它们动态化。如果您的问题由于显示逻辑或结转而具有可变行数,则您必须在 javascript 中包含所有可能的管道值,然后检查它们以查看哪些有效。
对于多答案矩阵,您可以使用 str.split(',') 将逗号分隔列表转换为数组,然后遍历数组。 Qualtrics 在逗号分隔列表中的逗号后包含空格,因此您必须 trim() 数组中的字符串。