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 基于以下评论:

  1. javascript 中的管道值在页面发送到浏览器之前在服务器端得到解析,因此它们是固定值。在 javascript 中无法使它们动态化。如果您的问题由于显示逻辑或结转而具有可变行数,则您必须在 javascript 中包含所有可能的管道值,然后检查它们以查看哪些有效。

  2. 对于多答案矩阵,您可以使用 str.split(',') 将逗号分隔列表转换为数组,然后遍历数组。 Qualtrics 在逗号分隔列表中的逗号后包含空格,因此您必须 trim() 数组中的字符串。