将问题导入带有嵌入式 javascript 的 Qualtrics

Importing questions into Qulatrics with embedded javascript

我正在尝试找到解决此问题的直接方法。我知道有三种方法可以使用 txt 文件自动创建 Qualtrics 调查:使用 Simple format TXT file, the Advanced format TXT file 或使用 QSF 文件,它基本上是序列化的 json对象。

为了在大量问题中自动包含相同的 javascript 代码(并避免手动复制粘贴),我想创建一个包含问题的可导入文件。但是,none 的 TXT 文件格式似乎允许包含 javascript.

似乎剩下的唯一选择就是导入 QSF 文件。说实话,鉴于 Qualtrics 没有提供 API 来帮助理解这种格式,尝试几乎从头开始自动构建 QSF 简直是一场噩梦。到目前为止,我一直在尝试理解导出的文件,但我开始认为这不值得付出努力。

关于如何更好地解决这个问题有什么想法吗?为了让您了解其规模,我所说的是大约 250 个不同的问题,它们具有相同的 javascript 代码。

非常感谢您对我可能收到的任何见解。

编辑:

我被要求提供一些示例 javascript 代码,所以这里是:

Qualtrics.SurveyEngine.addOnload(
    function()
    {
        document.getElementById('SkinContent').style.backgroundColor = "Lightblue";
    }
);

有两种解决方案,因此它适用于所有 pages/questions:

最好的方法就是在 Look&Feel/Advanced 下添加一些自定义 CSS:

#SkinContent { background-color: Lightblue;}

要使用 JavaScript 执行此操作,请在 Look&Feel/Advanced 下将脚本标记内的 Javascript 添加到页眉或页脚:

<script type="text/javascript">
Qualtrics.SurveyEngine.addOnload(function() {
       $('SkinContent').style.backgroundColor = "Lightblue"; 
    });
</script>

我花了很长时间才做到这一点,但我终于找到了解决方案(请注意我的 javascript 代码非常复杂,与嵌入式元数据交互等,与我上面的示例不同,所以@T. Gibbons 的解决方案对我不起作用)。

我按照以下步骤解决了问题:

  1. 使用一些示例项目创建 "prototype" 调查。
  2. 将此调查导出为 QSF 文件。
  3. 将 QSF 文件作为 JSON 对象读取。
  4. 确定与项目相关的属性。在我的例子中,我使用了 R 和包 rjson,所以结果列表对象 questionnaire 的重要属性是 questionnaire$SurveyElements[[6]]$SecondaryAttribute(包含项目数),questionnaire$SurveyElements[[1]]$Payload[[1]]$BlockElements(元素列表形成一个块,按顺序),以及questionnaire$SurveyElements中的元素,从元素8开始(有时也可以从元素7开始,我觉得要看垃圾箱是否为空)是的定义物品本身。
  5. 从导出的调查中存在的样本创建项目,并将它们添加到 questionnaire 对象,修改这些属性。
  6. 将对象序列化为JSON格式,并保存为QSF文件。
  7. 将 QSF 文件作为 Qualtrics 中的新调查导入。
  8. 在方便时将块与新项目一起使用(例如,我将块复制到库中,然后将其导入到我的主项目中)。

这是一个简单的代码,可以在 R 中执行所需的操作:

library(rjson)
library(tidyverse)
library(magrittr)

PROTOTYPE.FILE <- "Prototype.qsf"
JAVASCRIPT.FILE <- "Item_javascript_code.txt"

# Computes the number of questions in the survey (returns a 'character', as stored in the QSF file)
get.item.count <- function(questionnaire)
    questionnaire$SurveyElements %>% length() %>% subtract(7)

# Sets the property "nº of questions" in the questionnaire JSON object
set.num.items <- function(questionnaire, num.items = questionnaire %>% get.item.count) {

    questionnaire$SurveyElements[[6]]$SecondaryAttribute <- num.items %>% as.character

    return(questionnaire)
}

create.item <- function(item.num, stem, choices, javascript = NULL, html.text = FALSE) {

    item <- list(
        SurveyID = "SV_0rLrTOSkjnIWa2x",
        Element = "SQ",
        PrimaryAttribute = paste0("QID", item.num),
        SecondaryAttribute = stem,
        TertiaryAttribute = NULL,
        Payload = list(
            QuestionText = stem,
            DataExportTag = paste0("Q", item.num),
            QuestionType = "MC",
            Selector = "SAVR",
            SubSelector = "TX",
            Configuration = list(
                QuestionDescriptionOption = "UseText"
            ),
            QuestionDescription = stem,
            Choices = list(),
            ChoiceOrder = choices %>% seq_along,
            Validation = list(
                Settings = list(
                    ForceResponse = "OFF", ForceResponseType = "ON", Type = "None"
                )
            ),
            Language = list(),
            QuestionID = paste0("QID", item.num)
        )
    )

    for(choice in choices) {
        item$Payload$Choices <- item$Payload$Choices %>% append(list(list(Display = choice)))
    }
    names(item$Payload$Choices) <- item$Payload$Choices %>% seq_along %>% as.character

    if(javascript %>% is.null %>% not) {
        item$Payload$QuestionJS = javascript
        item$Payload$PrivateData = FALSE
    }

    return(item)
}

add.item <- function(questionnaire, stem, choices, javascript = NULL, html.text = FALSE) {

    item.num <- questionnaire %>% get.item.count +1

    questionnaire$SurveyElements %<>% append(
        list(
            create.item(questionnaire %>% get.item.count +1, stem, choices, javascript)
        )
    )

    questionnaire$SurveyElements[[1]]$Payload[[1]]$BlockElements %<>% append(
        list(
            list(
                Type = "Question",
                QuestionID = paste0("QID", item.num)
            )
        )
    )

    return(questionnaire)
}


questionnaire <- fromJSON(file = PROTOTYPE.FILE)

questionnaire$SurveyElements <- questionnaire$SurveyElements[1:7] # Drop items in the list
questionnaire$SurveyElements[[1]]$Payload[[1]]$BlockElements <- NULL # Empty item list in the block


for(question in 1:10) {

    questionnaire %<>% add.item(
        "Question stem here",
        c("Choice 1", "Choice 2", "etc..."),
        ## Javascript code here
    )
}

questionnaire %<>% set.num.items()


questionnaire %>% toJSON() %>% writeLines(con = "Output_prototype.qsf")

这可以复杂得多,包括不同类型的问题、计时器、分页符等,但对于手头的问题,我认为这已经足够了。