Automatización de creación de cuestionarios a partir de documentos con Google Gemini y Jotform
Este es unautomatización que contiene 15 nodos.Utiliza principalmente nodos como Code, SplitOut, HttpRequest, GoogleSheets, JotFormTrigger. Usar Google Gemini y Jotform para automatizar la creación de cuestionarios a partir de documentos
- •Pueden requerirse credenciales de autenticación para la API de destino
- •Credenciales de API de Google Sheets
- •Clave de API de Google Gemini
Nodos utilizados (15)
Categoría
{
"meta": {
"instanceId": "a8699c9e7103d3373edb042353eef6391c809031343da9cc88aa3b40c5b49c65"
},
"nodes": [
{
"id": "280fc45c-62fe-4108-9bd3-a179d4326d64",
"name": "Extraer de archivo",
"type": "n8n-nodes-base.extractFromFile",
"position": [
256,
128
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "9da2b9db-6e6a-4c47-8b9a-633e56eb78fc",
"name": "Agente de IA",
"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 Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
400,
320
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "f7281d5f-4a3a-4bb1-900c-d3fc68f2ee44",
"name": "Analizador de salida estructurada",
"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": "Dividir salida",
"type": "n8n-nodes-base.splitOut",
"position": [
816,
128
],
"parameters": {
"options": {},
"fieldToSplitOut": "output"
},
"typeVersion": 1
},
{
"id": "c0e31048-8a0f-4093-9215-a3d5f78c81c3",
"name": "HTTP Request",
"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": "Código en 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": "Activador de 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 Request1",
"type": "n8n-nodes-base.httpRequest",
"position": [
96,
128
],
"parameters": {
"url": "={{ $json.fileUpload[0] }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "426bb69a-739c-427a-9a74-713aedbf5bff",
"name": "Nota adhesiva",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
48
],
"parameters": {
"width": 400,
"height": 240,
"content": "## Create a JotForm with Document upload, quiz title and no of questions options"
},
"typeVersion": 1
},
{
"id": "8c6ccd36-136f-4746-8169-fffaf5dac08e",
"name": "Nota adhesiva1",
"type": "n8n-nodes-base.stickyNote",
"position": [
48,
48
],
"parameters": {
"width": 160,
"height": 240,
"content": "Download the document\n"
},
"typeVersion": 1
},
{
"id": "4180a4ed-83be-4610-b036-666e37254dba",
"name": "Nota adhesiva2",
"type": "n8n-nodes-base.stickyNote",
"position": [
224,
48
],
"parameters": {
"width": 160,
"height": 240,
"content": "Extract Content from the document"
},
"typeVersion": 1
},
{
"id": "f18fbc7d-d400-4eb2-829f-263b9e9f53aa",
"name": "Nota adhesiva3",
"type": "n8n-nodes-base.stickyNote",
"position": [
960,
64
],
"parameters": {
"width": 224,
"height": 240,
"content": "Save questions in a google sheet"
},
"typeVersion": 1
},
{
"id": "ccebe5de-4fc5-4ff8-b2f4-04ede361f787",
"name": "Nota adhesiva4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1376,
64
],
"parameters": {
"height": 240,
"content": "Create a quiz on jotform having AI generated questions"
},
"typeVersion": 1
},
{
"id": "a6904027-8449-41c1-a7bb-0e3b46a101c6",
"name": "Agregar fila en hoja",
"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": {
"9da2b9db-6e6a-4c47-8b9a-633e56eb78fc": {
"main": [
[
{
"node": "4dd3a242-d3d2-4805-b78d-0048b823147e",
"type": "main",
"index": 0
}
]
]
},
"4dd3a242-d3d2-4805-b78d-0048b823147e": {
"main": [
[
{
"node": "a6904027-8449-41c1-a7bb-0e3b46a101c6",
"type": "main",
"index": 0
}
]
]
},
"00bd7928-47b7-4a83-922a-9ce47da2c9df": {
"main": [
[
{
"node": "280fc45c-62fe-4108-9bd3-a179d4326d64",
"type": "main",
"index": 0
}
]
]
},
"48d25cd7-1072-4fce-a0bc-406b36bc0741": {
"main": [
[
{
"node": "00bd7928-47b7-4a83-922a-9ce47da2c9df",
"type": "main",
"index": 0
}
]
]
},
"280fc45c-62fe-4108-9bd3-a179d4326d64": {
"main": [
[
{
"node": "9da2b9db-6e6a-4c47-8b9a-633e56eb78fc",
"type": "main",
"index": 0
}
]
]
},
"3ed602c6-5550-4797-aade-53e1635081e8": {
"main": [
[
{
"node": "c0e31048-8a0f-4093-9215-a3d5f78c81c3",
"type": "main",
"index": 0
}
]
]
},
"a6904027-8449-41c1-a7bb-0e3b46a101c6": {
"main": [
[
{
"node": "3ed602c6-5550-4797-aade-53e1635081e8",
"type": "main",
"index": 0
}
]
]
},
"5c056118-2b7c-458c-9ce9-ff7e5a8f28bc": {
"ai_languageModel": [
[
{
"node": "9da2b9db-6e6a-4c47-8b9a-633e56eb78fc",
"type": "ai_languageModel",
"index": 0
},
{
"node": "f7281d5f-4a3a-4bb1-900c-d3fc68f2ee44",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"f7281d5f-4a3a-4bb1-900c-d3fc68f2ee44": {
"ai_outputParser": [
[
{
"node": "9da2b9db-6e6a-4c47-8b9a-633e56eb78fc",
"type": "ai_outputParser",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Intermedio
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
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.
Compartir este flujo de trabajo