使用Google Gemini和Jotform从文档自动化创建测验
中级
这是一个自动化工作流,包含 15 个节点。主要使用 Code、SplitOut、HttpRequest、GoogleSheets、JotFormTrigger 等节点。 使用Google Gemini和Jotform从文档自动化创建测验
前置要求
- •可能需要目标 API 的认证凭证
- •Google Sheets API 凭证
- •Google Gemini API Key
使用的节点 (15 个)
分类
未分类
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"meta": {
"instanceId": "a8699c9e7103d3373edb042353eef6391c809031343da9cc88aa3b40c5b49c65"
},
"nodes": [
{
"id": "280fc45c-62fe-4108-9bd3-a179d4326d64",
"name": "从文件提取",
"type": "n8n-nodes-base.extractFromFile",
"position": [
256,
128
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "9da2b9db-6e6a-4c47-8b9a-633e56eb78fc",
"name": "AI 代理",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
464,
128
],
"parameters": {
"text": "=You are an instructor tasked with generating {{ $('JotForm Trigger').item.json.q5_numberOf }} multiple-choice quiz questions from the following content:\n\n{{ $json.text }}\n\nInstructions:\n- Base all questions strictly on the provided content.\n- {{ $('JotForm Trigger').item.json.q7_quizName }}it should be the title of quiz in the form\n- For each question, generate exactly 4 unique answer options labeled A, B, C, and D.\n- Randomize which option is correct (dont always make it the same letter).\n- Keep both the questions and options clear and concise.\n- Clearly specify the correct answer using the key \"correct_option\" with the letter of the correct choice (e.g., \"A\").\n- Do not include explanations or extra text output JSON only.\n- Ensure valid JSON syntax that can be parsed directly by code.\n\nReturn the output in the exact JSON format below:\n\n[\n {\n \"question\": \"string\",\n \"options\": [\"A. option 1\", \"B. option 2\", \"C. option 3\", \"D. option 4\"],\n \"correct_option\": \"A\"\n }\n]",
"options": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "5c056118-2b7c-458c-9ce9-ff7e5a8f28bc",
"name": "Google Gemini 聊天模型",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
400,
320
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "f7281d5f-4a3a-4bb1-900c-d3fc68f2ee44",
"name": "多表:您可以连接多个表以实现有组织的数据结构",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
640,
336
],
"parameters": {
"autoFix": true,
"jsonSchemaExample": "[\n {\n \"question\": \"string\",\n \"options\": [\"A. ...\", \"B. ...\", \"C. ...\", \"D. ...\"],\n \"correct_option\": \"A\"\n }\n]"
},
"typeVersion": 1.3
},
{
"id": "4dd3a242-d3d2-4805-b78d-0048b823147e",
"name": "分离",
"type": "n8n-nodes-base.splitOut",
"position": [
816,
128
],
"parameters": {
"options": {},
"fieldToSplitOut": "output"
},
"typeVersion": 1
},
{
"id": "c0e31048-8a0f-4093-9215-a3d5f78c81c3",
"name": "HTTP 请求",
"type": "n8n-nodes-base.httpRequest",
"position": [
1440,
128
],
"parameters": {
"url": "https://api.jotform.com/form?apiKey=",
"body": "={{$json}}",
"method": "POST",
"options": {},
"sendBody": true,
"sendQuery": true,
"contentType": "raw",
"sendHeaders": true,
"rawContentType": "application/x-www-form-urlencoded",
"queryParameters": {
"parameters": [
{
"name": "properties[title]",
"value": "Auto-Generated Quiz"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "APIKEY"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "3ed602c6-5550-4797-aade-53e1635081e8",
"name": "JavaScript 代码",
"type": "n8n-nodes-base.code",
"position": [
1232,
128
],
"parameters": {
"jsCode": "const aiData = $('AI Agent').first().json;\n\n// Handle both shapes: [ { output: [...] } ] or { output: [...] }\nconst input = Array.isArray(aiData) ? aiData[0].output : aiData.output;\n\n// Parse if it's a string\nconst quizData = typeof input === 'string' ? JSON.parse(input) : input;\n\n// Validate structure\nif (!Array.isArray(quizData)) {\n throw new Error(\"Expected quizData to be an array, got: \" + typeof quizData);\n}\n\n// ? Dynamic title\nconst title = $('JotForm Trigger').first().json.q7_quizName || \"Auto-Generated Quiz\";\n\nconst body = {\n \"properties[title]\": title,\n \n};\n\n// ? Title centered and styled\nbody[\"properties[title]\"] = title;\nbody[\"properties[titleAlign]\"] = \"center\";\nbody[\"properties[fontFamily]\"] = \"Inter\";\nbody[\"properties[fontColor]\"] = \"#222222\";\n\n// ? General form styling\nbody[\"properties[backgroundColor]\"] = \"#f0f4f8\";\nbody[\"properties[formWidth]\"] = \"800\";\nbody[\"properties[formAlign]\"] = \"center\";\nbody[\"properties[formPadding]\"] = \"40\";\nbody[\"properties[questionSpacing]\"] = \"25\";\n\n// ? Label styling (questions)\nbody[\"properties[labelAlign]\"] = \"top\";\nbody[\"properties[labelWidth]\"] = \"100%\";\nbody[\"properties[labelFontSize]\"] = \"18\";\n\n// ? Option styling (makes radio options display in two columns)\nbody[\"properties[inputTextAlignment]\"] = \"left\";\nbody[\"properties[columns]\"] = \"2\";\nbody[\"properties[radioArrangement]\"] = \"spread\"; // spreads options evenly in 2 columns\n\n// ? Button styling\nbody[\"properties[buttonBackgroundColor]\"] = \"#007bff\";\nbody[\"properties[buttonFontColor]\"] = \"#ffffff\";\n\n// ? Add quiz questions\nquizData.forEach((item, index) => {\n const qIndex = index + 1; // shift by 1 since 0 is the heading\n const formattedOptions = (item.options || []).map(opt => opt.trim()).join('|');\n\n body[`questions[${qIndex}][type]`] = \"control_radio\";\n body[`questions[${qIndex}][text]`] = item.question?.trim() || \"\";\n body[`questions[${qIndex}][options]`] = formattedOptions;\n body[`questions[${qIndex}][correct_option]`] = item.correct_option?.trim() || \"\";\n});\n\nreturn [{ json: body }];\n"
},
"typeVersion": 2
},
{
"id": "48d25cd7-1072-4fce-a0bc-406b36bc0741",
"name": "JotForm 触发器",
"type": "n8n-nodes-base.jotFormTrigger",
"position": [
-112,
128
],
"webhookId": "4da67a4d-d5e5-49c9-a95d-9ee87e2191e8",
"parameters": {
"form": "252856893250062",
"resolveData": false
},
"typeVersion": 1
},
{
"id": "00bd7928-47b7-4a83-922a-9ce47da2c9df",
"name": "HTTP请求1",
"type": "n8n-nodes-base.httpRequest",
"position": [
96,
128
],
"parameters": {
"url": "={{ $json.fileUpload[0] }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "426bb69a-739c-427a-9a74-713aedbf5bff",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
48
],
"parameters": {
"width": 400,
"height": 240,
"content": "## 创建带有文档上传、测验标题和题目数量选项的 JotForm"
},
"typeVersion": 1
},
{
"id": "8c6ccd36-136f-4746-8169-fffaf5dac08e",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
48,
48
],
"parameters": {
"width": 160,
"height": 240,
"content": "下载文档"
},
"typeVersion": 1
},
{
"id": "4180a4ed-83be-4610-b036-666e37254dba",
"name": "便签2",
"type": "n8n-nodes-base.stickyNote",
"position": [
224,
48
],
"parameters": {
"width": 160,
"height": 240,
"content": "从文档中提取内容"
},
"typeVersion": 1
},
{
"id": "f18fbc7d-d400-4eb2-829f-263b9e9f53aa",
"name": "便签3",
"type": "n8n-nodes-base.stickyNote",
"position": [
960,
64
],
"parameters": {
"width": 224,
"height": 240,
"content": "将问题保存到 Google Sheets"
},
"typeVersion": 1
},
{
"id": "ccebe5de-4fc5-4ff8-b2f4-04ede361f787",
"name": "便签4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1376,
64
],
"parameters": {
"height": 240,
"content": "在 JotForm 上创建包含 AI 生成问题的测验"
},
"typeVersion": 1
},
{
"id": "a6904027-8449-41c1-a7bb-0e3b46a101c6",
"name": "在表格中追加行",
"type": "n8n-nodes-base.googleSheets",
"position": [
1024,
128
],
"parameters": {
"columns": {
"value": {
"Option A": "={{ $json.options[0] }}",
"Option B": "={{ $json.options[1] }}",
"Option D": "={{ $json.options[3] }}",
"Question": "={{ $json.question }}",
"Option C ": "={{ $json.options[2] }}",
"Correct Answer": "={{ $json.correct_option }}"
},
"schema": [
{
"id": "Question",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Question",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Option A",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Option A",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Option B",
"type": "string",
"display": true,
"required": false,
"displayName": "Option B",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Option C ",
"type": "string",
"display": true,
"required": false,
"displayName": "Option C ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Option D",
"type": "string",
"display": true,
"required": false,
"displayName": "Option D",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Correct Answer",
"type": "string",
"display": true,
"required": false,
"displayName": "Correct Answer",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HcnT-czkE8XVMRfeLZLTOuKjmk_51CHEWAkbfU-YOJ0/edit#gid=0",
"cachedResultName": "Questions"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1HcnT-czkE8XVMRfeLZLTOuKjmk_51CHEWAkbfU-YOJ0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HcnT-czkE8XVMRfeLZLTOuKjmk_51CHEWAkbfU-YOJ0/edit?usp=drivesdk",
"cachedResultName": "Quiz Management"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "OnKnmW9md5Kmjjg8",
"name": "Google Sheets account"
}
},
"typeVersion": 4.6
}
],
"pinData": {},
"connections": {
"AI Agent": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Append row in sheet",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request1": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
]
]
},
"JotForm Trigger": {
"main": [
[
{
"node": "HTTP Request1",
"type": "main",
"index": 0
}
]
]
},
"Extract from File": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"Append row in sheet": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Structured Output Parser",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
这是一个中级难度的通用自动化工作流。适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
在可视化参考库中探索n8n节点
在可视化参考库中探索n8n节点
If
Ftp
Set
+93
113 节点I versus AI
Other
使用Gemini AI和Elementor为多个客户生成并安排SEO博客文章
使用Gemini AI和Elementor为多个客户生成并安排SEO博客文章
If
N8n
Set
+12
39 节点Zain Khan
Content Creation
第一轮 Telegram 和 LinkedIn 快速通道 AI 招聘助手
AI候选人筛选流程:LinkedIn到Telegram,集成Gemini与Apify
If
Set
Code
+15
55 节点Dean Pike
HR
我的工作流
使用 LinkedIn、Google Sheets 和 AI 简历评分与求职信自动化职位搜索
Set
Code
Html
+12
27 节点Jugal
使用 Mistral AI、LinkedIn 和 Google Sheets 自动化职位搜索与简历定制
使用 Mistral AI、LinkedIn 和 Google Sheets 自动化职位搜索与简历定制
Set
Code
Html
+18
46 节点Jordan Hoyle
Personal Productivity
内容聚合
使用Gemini AI从网站文章自动化社交媒体帖子发布到LinkedIn和X/Twitter
If
Set
Xml
+16
34 节点Vadim
Content Creation
工作流信息
难度等级
中级
节点数量15
分类-
节点类型10
作者
Zain Khan
@zainI partner with businesses to streamline processes and accelerate growth through intelligent AI automation and Web/mobile Development. Leveraging deep expertise in GPT-4, LangChain, and n8n, I develop AI-powered agents and sophisticated LLM pipelines.
外部链接
在 n8n.io 上查看 →
分享此工作流