Création automatisée de quiz à partir de documents avec Google Gemini et Jotform

Intermédiaire

Ceci est uncontenant 15 nœuds.Utilise principalement des nœuds comme Code, SplitOut, HttpRequest, GoogleSheets, JotFormTrigger. Automatisation de la création de quiz à partir de documents avec Google Gemini et Jotform

Prérequis
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Informations d'identification Google Sheets API
  • Clé API Google Gemini

Catégorie

-
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "meta": {
    "instanceId": "a8699c9e7103d3373edb042353eef6391c809031343da9cc88aa3b40c5b49c65"
  },
  "nodes": [
    {
      "id": "280fc45c-62fe-4108-9bd3-a179d4326d64",
      "name": "Extraire depuis le fichier",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        256,
        128
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "9da2b9db-6e6a-4c47-8b9a-633e56eb78fc",
      "name": "Agent 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 (don’t 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": "Analyseur de sortie structurée",
      "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": "Diviser",
      "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": "Code 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": "Déclencheur 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": "Note adhésive",
      "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": "Note adhésive1",
      "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": "Note adhésive2",
      "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": "Note adhésive3",
      "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": "Note adhésive4",
      "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": "Ajouter une ligne dans la feuille",
      "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
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Intermédiaire

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Intermédiaire
Nombre de nœuds15
Catégorie-
Types de nœuds10
Description de la difficulté

Adapté aux utilisateurs expérimentés, avec des workflows de complexité moyenne contenant 6-15 nœuds

Auteur
Zain Khan

Zain Khan

@zain

I 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.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34