如何向JSON变量传值,实现Google Forms数据同步到实时数据库
解决方案
首先你原代码最大的问题是把所有结构化数据都join成了字符串传递,没法对应每个问题的选项、正确答案归属,我们直接调整数据传递逻辑,构造符合要求的JSON结构即可,修改后的完整代码如下:
第一步:修改extractFormData函数
调整数据收集逻辑,直接按问题分组存储所有属性,不再打散为单独数组:
function extractFormData(){ var form = FormApp.getActiveForm(); var form_title = DriveApp.getFileById(form.getId()).getName(); var items = form.getItems(); // 存储所有问题的结构化数据 var questionsData = []; for (var i = 0; i < items.length; i++) { var item = items[i]; var currentQuestion = {}; switch(item.getType()) { case FormApp.ItemType.MULTIPLE_CHOICE: currentQuestion["question-type"] = "multiple-choice"; var question = item.asMultipleChoiceItem(); currentQuestion["question"] = question.getTitle(); var answers = question.getChoices(); var correctAnswers = []; // 遍历添加选项 for (var j = 0; j < answers.length; j++) { var answer = answers[j]; currentQuestion[`option${j+1}`] = answer.getValue(); if(answer.isCorrectAnswer()) { correctAnswers.push(answer.getValue()); } } // 单选题正确答案只有一个,直接取第一个 currentQuestion["answer"] = correctAnswers[0]; questionsData.push(currentQuestion); break; case FormApp.ItemType.CHECKBOX: currentQuestion["question-type"] = "checkbox"; var question = item.asCheckboxItem(); currentQuestion["question"] = question.getTitle(); var answers = question.getChoices(); var correctAnswers = []; for (var k = 0; k < answers.length; k++) { var answer = answers[k]; currentQuestion[`option${k+1}`] = answer.getValue(); if(answer.isCorrectAnswer()) { correctAnswers.push(answer.getValue()); } } // 多选题正确答案拼接为逗号分隔字符串 currentQuestion["answer"] = correctAnswers.join(", "); questionsData.push(currentQuestion); break; case FormApp.ItemType.PARAGRAPH_TEXT: case FormApp.ItemType.TEXT: currentQuestion["question-type"] = "Input-text"; var question = item.getType() === FormApp.ItemType.PARAGRAPH_TEXT ? item.asParagraphTextItem() : item.asTextItem(); currentQuestion["question"] = question.getTitle(); currentQuestion["answer"] = "user-input"; questionsData.push(currentQuestion); break; } } // 直接传递结构化数组,不要转字符串 sendExtractedData(form_title, questionsData); }
第二步:修改sendExtractedData函数
按要求构造最终导出的JSON结构,写入实时数据库:
function sendExtractedData(form_title, questionsData) { var quizDatabase = FirebaseApp.getDatabaseByUrl('URL REALTIME DATABASE'); var newDate = new Date(); var dateAdded = newDate.toLocaleString("en-US"); var dataToExport = {}; // 外层键为表单标题 dataToExport[form_title] = {}; // 遍历填充每个问题的字段 questionsData.forEach((question, index) => { // 问题序号从1开始 var questionIndex = (index + 1).toString(); dataToExport[form_title][questionIndex] = question; // 统一添加日期字段 dataToExport[form_title][questionIndex]["date-added"] = dateAdded; }); // 写入数据库 quizDatabase.setData("nameofdatabase/"+ form_title +"/", dataToExport[form_title]); }
注意事项
- 上述代码已经完全匹配你给出的目标JSON结构,会自动识别题目类型、生成对应option字段、拼接正确答案
- 文本输入类题目会自动设置
answer为user-input,符合你的要求 - 如果需要存储用户提交的输入值,可在表单提交触发的回调中额外获取用户输入内容,补充到对应题目的
user-input字段即可
内容的提问来源于stack exchange,提问作者Roberto Flores
相关产品推荐
相关产品推荐

