使用嵌入式javascript

时间:2017-11-04 19:34:30

标签: javascript import qualtrics

我正试图找到解决这个问题的简单方法。我了解有三种方法可以使用txt文件自动创建Qualtrics调查:使用Simple format TXT fileAdvanced 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";
    }
);

2 个答案:

答案 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;解决方案对我没用。)

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

  1. 创建&#34;原型&#34;调查一些样本项目。
  2. 将此调查导出为QSF文件。
  3. 将QSF文件作为JSON对象读取。
  4. 标识与项目相关的属性。在我的例子中,我使用了R和包rjson,因此结果列表对象questionnaire的重要属性是questionnaire$SurveyElements[[6]]$SecondaryAttribute(包含项目数),questionnaire$SurveyElements[[1]]$Payload[[1]]$BlockElements(元素列表)按顺序形成一个块,以及questionnaire$SurveyElements中的元素,从元素8开始(有时它可以来自元素7,我认为它取决于垃圾是否为空)这是定义的这些物品本身。
  5. 从导出的suvey中的示例项创建项目,并将它们添加到questionnaire对象,修改这些属性。
  6. 将对象序列化为JSON格式,并将其另存为QSF文件。
  7. 将QSF文件导入Qualtrics中的新调查。
  8. 方便使用带有新项目的块(例如,我将块复制到库中,然后将其导入我的主项目中)。
  9. 这是一个简单的代码,可以在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")
    

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