如何通过内嵌JS获取Qualtrics当前用户全量作答及题目文本
Qualtrics前端默认仅加载当前页面的题目资源和交互逻辑,不存在全局范围的QuestionInfo对象,也不会默认把用户所有历史作答挂载到前端全局变量上,针对当前受访者单份数据的提取需求,可按以下三种方案实现,按需选择即可:
逐页缓存+末尾汇总方案(零额外配置,兼容性最好)
利用浏览器sessionStorage做跨页数据暂存,在每道题的加载事件里同步存储当前题的题面文本、用户实时作答内容,用户走到调研最后一页时直接读取缓存即可拿到全量数据,支持用户返回上一页修改答案时自动更新缓存值。
单题嵌入的参考代码如下:Qualtrics.SurveyEngine.addOnload(function() { const qid = this.questionId; // 提取当前题题面 const questionText = Qualtrics.SurveyEngine.QuestionInfo[qid].questionText; // 监听作答变化实时更新缓存,适配所有题型的作答修改场景 this.questionclick = () => { const storedData = JSON.parse(sessionStorage.getItem('currentUserFullResponse') || '{}'); storedData[qid] = { questionText: questionText, answer: this.getChoiceValue() }; sessionStorage.setItem('currentUserFullResponse', JSON.stringify(storedData)); } });在调研最后一页的脚本里,直接执行
JSON.parse(sessionStorage.getItem('currentUserFullResponse'))就能拿到带题面的全量作答数据,直接用于后续自定义处理即可。提交前提取全量作答+提前映射题面方案(代码量最少)
Qualtrics内置了Qualtrics.SurveyEngine.getAllAnswers()方法,在调研提交前的钩子中调用可以直接拿到当前用户所有题目的作答值,不需要逐页缓存。这个方法的缺陷是无法返回题面文本,你只需要在调研发布前,把所有题目ID和对应题面的映射关系提前写到全局脚本里,拿到作答数据后做一次匹配就能得到带题面的完整数据。
全局脚本参考代码:// 调研发布前提前整理好的题ID-题面映射表 const QID_TEXT_MAP = { "QID1": "您的年龄段是?", "QID2": "您最近1个月内是否有过相关消费行为?" // 补全所有题目即可 }; Qualtrics.SurveyEngine.addOnReady(function() { // 绑定提交前事件 jQuery('#NextButton').on('click', () => { if(jQuery('#NextButton').val() === '提交') { const allAnswers = Qualtrics.SurveyEngine.getAllAnswers(); const fullResponse = Object.entries(allAnswers).map(([qid, answer]) => ({ questionId: qid, questionText: QID_TEXT_MAP[qid] || '题面未匹配', answer: answer })); // 此处对fullResponse做自定义处理即可 } }) });工作流Webhook回传方案(稳定性最高,无前端兼容问题)
如果你的自定义处理逻辑对数据完整性要求高,可以不用写前端JS,直接在Qualtrics后台配置调研提交触发的工作流:选择「Webhook」触发动作,Qualtrics会自动把当前用户的所有题面、作答值打包在请求 payload 里,发送到你自己的服务端接口做后续处理,完全规避前端缓存失效、脚本加载失败导致的数据丢失问题。
注意:不要调用Qualtrics未公开的内部接口拉取全量题面,这类接口没有稳定性承诺,平台版本迭代时随时可能变更参数、增加鉴权,极易导致调研脚本报错,阻断用户正常作答流程。
内容的提问来源于stack exchange,提问作者Colin Fredericks

