我正试图找到解决这个问题的简单方法。我了解有三种方法可以使用txt
文件自动创建Qualtrics调查:使用Simple format TXT file,Advanced format TXT file或使用QSF
文件,这基本上是一个序列化的json
对象。
为了在大量问题中自动包含相同的javascript代码(并避免手动复制粘贴),我想创建一个包含问题的可导入文件。但是,没有任何TXT文件格式似乎允许包含javascript。
似乎剩下的唯一选择是导入QSF
文件。如果真相被告知,鉴于Qualtrics没有提供API来帮助理解这种格式,尝试几乎从头开始自动构建QSF
一直是一场噩梦。到目前为止,我一直在尝试理解导出的文件,但我开始认为这不值得付出努力。
关于如何更好地解决这个问题的任何想法?为了让您了解其重要性,我所谈论的是大约250个不同的问题,使用相同的JavaScript代码。
如果我有任何见解,请提前感谢你。
修改
我被要求提供一些示例javascript代码,所以这里是:
Qualtrics.SurveyEngine.addOnload(
function()
{
document.getElementById('SkinContent').style.backgroundColor = "Lightblue";
}
);
答案 0 :(得分:2)
有两种解决方案可以应用于所有页面/问题:
最好的方法是在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>
答案 1 :(得分:0)
我花了很长时间才做到这一点,但我终于设法找到了解决方案(请注意我的javascript代码非常复杂,与嵌入式元数据交互,因此,与上面提到的示例不同,所以@T。Gibbons& #39;解决方案对我没用。)
我按照以下步骤解决了问题:
questionnaire
的重要属性是questionnaire$SurveyElements[[6]]$SecondaryAttribute
(包含项目数),questionnaire$SurveyElements[[1]]$Payload[[1]]$BlockElements
(元素列表)按顺序形成一个块,以及questionnaire$SurveyElements
中的元素,从元素8开始(有时它可以来自元素7,我认为它取决于垃圾是否为空)这是定义的这些物品本身。questionnaire
对象,修改这些属性。这是一个简单的代码,可以在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")
这可能会更复杂,包括不同类型的问题,计时器,分页符等,但对于手头的问题,我认为这已经足够了。