将问题导入带有嵌入式 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 的解决方案对我不起作用)。
我按照以下步骤解决了问题:
- 使用一些示例项目创建 "prototype" 调查。
- 将此调查导出为 QSF 文件。
- 将 QSF 文件作为 JSON 对象读取。
- 确定与项目相关的属性。在我的例子中,我使用了 R 和包 rjson,所以结果列表对象
questionnaire
的重要属性是 questionnaire$SurveyElements[[6]]$SecondaryAttribute
(包含项目数),questionnaire$SurveyElements[[1]]$Payload[[1]]$BlockElements
(元素列表形成一个块,按顺序),以及questionnaire$SurveyElements
中的元素,从元素8开始(有时也可以从元素7开始,我觉得要看垃圾箱是否为空)是的定义物品本身。
- 从导出的调查中存在的样本创建项目,并将它们添加到
questionnaire
对象,修改这些属性。
- 将对象序列化为JSON格式,并保存为QSF文件。
- 将 QSF 文件作为 Qualtrics 中的新调查导入。
- 在方便时将块与新项目一起使用(例如,我将块复制到库中,然后将其导入到我的主项目中)。
这是一个简单的代码,可以在 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")
这可以复杂得多,包括不同类型的问题、计时器、分页符等,但对于手头的问题,我认为这已经足够了。
我正在尝试找到解决此问题的直接方法。我知道有三种方法可以使用 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 的解决方案对我不起作用)。
我按照以下步骤解决了问题:
- 使用一些示例项目创建 "prototype" 调查。
- 将此调查导出为 QSF 文件。
- 将 QSF 文件作为 JSON 对象读取。
- 确定与项目相关的属性。在我的例子中,我使用了 R 和包 rjson,所以结果列表对象
questionnaire
的重要属性是questionnaire$SurveyElements[[6]]$SecondaryAttribute
(包含项目数),questionnaire$SurveyElements[[1]]$Payload[[1]]$BlockElements
(元素列表形成一个块,按顺序),以及questionnaire$SurveyElements
中的元素,从元素8开始(有时也可以从元素7开始,我觉得要看垃圾箱是否为空)是的定义物品本身。 - 从导出的调查中存在的样本创建项目,并将它们添加到
questionnaire
对象,修改这些属性。 - 将对象序列化为JSON格式,并保存为QSF文件。
- 将 QSF 文件作为 Qualtrics 中的新调查导入。
- 在方便时将块与新项目一起使用(例如,我将块复制到库中,然后将其导入到我的主项目中)。
这是一个简单的代码,可以在 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")
这可以复杂得多,包括不同类型的问题、计时器、分页符等,但对于手头的问题,我认为这已经足够了。