This workflow follows the Google Drive → Google Sheets recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Hectelion | Evaluation d'entreprise",
"nodes": [
{
"parameters": {
"operation": "update",
"fileId": {
"__rl": true,
"value": "={{ $json.id }}",
"mode": "id"
},
"newUpdatedFileName": "={{ $('Limiter le nombre de copie').item.json['value clean'] }} - \u00c9valuation d\u2019entreprise indicative \u2013 FR \u2013 Hectelion",
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
3392,
-176
],
"id": "7d91a537-4e50-4cbe-96e5-1e96c5191d0d",
"name": "Renommer le template"
},
{
"parameters": {
"operation": "copy",
"fileId": {
"__rl": true,
"value": "{{FR_SLIDES_TEMPLATE_ID}}",
"mode": "list",
"cachedResultName": "TEMPLATES \u2013 \u00c9valuation d\u2019entreprise indicative \u2013 FR \u2013 Hectelion",
"cachedResultUrl": "https://docs.google.com/presentation/d/{{FR_SLIDES_TEMPLATE_ID}}/edit?usp=drivesdk"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
3136,
-176
],
"id": "b46a7a35-5648-4ac6-8aad-acfaabedee8f",
"name": "Copier le template"
},
{
"parameters": {},
"type": "n8n-nodes-base.limit",
"typeVersion": 1,
"position": [
2960,
-176
],
"id": "0f97d7fe-1ae0-4370-abdd-1fdb81b8cbeb",
"name": "Limiter le nombre de copie"
},
{
"parameters": {
"mode": "combine",
"combineBy": "combineAll",
"options": {}
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
3632,
-176
],
"id": "f62f040c-9ae2-4ddc-b472-6cb573cee710",
"name": "Merge"
},
{
"parameters": {
"jsCode": "// 1) R\u00e9cup\u00e9rer l'ID de la pr\u00e9sentation copi\u00e9e (fiable)\nconst presentationId =\n $('Copier le template').first().json.id\n ?? $('Renommer le template').first().json.id;\n\nif (!presentationId) {\n throw new Error('presentationId introuvable. V\u00e9rifie la sortie de \"Copier le template\" / \"Renommer le template\".');\n}\n\n// 2) Construire les requests \u00e0 partir des lignes metadata uniquement\nconst rows = $input.all()\n .map(i => i.json)\n .filter(r => typeof r?.Key === 'string' && r.Key.trim() !== '');\n\nif (!rows.length) {\n throw new Error('Aucune ligne metadata d\u00e9tect\u00e9e (colonne \"Key\"). V\u00e9rifie ton Google Sheet \"metadata\".');\n}\n\nconst requests = rows.map(r => ({\n replaceAllText: {\n containsText: { text: r.Key, matchCase: true },\n replaceText: String(r['value clean'] ?? ''),\n },\n}));\n\nreturn [{\n json: {\n presentationId,\n body: { requests },\n },\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3824,
-176
],
"id": "179ece71-ab04-4075-8f11-b8c39573538f",
"name": "Code in JavaScript"
},
{
"parameters": {
"method": "POST",
"url": "=https://slides.googleapis.com/v1/presentations/{{$json.presentationId}}:batchUpdate",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleOAuth2Api",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{$json[\"body\"]}}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4032,
-176
],
"id": "88e99fd0-c2be-4d17-9c2e-3a5141da1d36",
"name": "Remplacement des valeurs"
},
{
"parameters": {
"url": "=https://slides.googleapis.com/v1/presentations/{{$json.presentationId}}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleOAuth2Api",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4240,
-176
],
"id": "8caf20ea-1685-449b-9c61-3230abe4dca3",
"name": "Extraire dynamiquement les charts"
},
{
"parameters": {
"jsCode": "const pres = $input.first().json;\n\n// S\u00e9curit\u00e9 : garder l\u2019ID de la pr\u00e9sentation\nconst presentationId = pres.presentationId || $json.presentationId;\n\n// Extraire les charts li\u00e9s \u00e0 Sheets\nconst charts = [];\nfor (const slide of (pres.slides ?? [])) {\n for (const el of (slide.pageElements ?? [])) {\n if (el.sheetsChart && el.objectId) {\n charts.push(el.objectId);\n }\n }\n}\n\n// Construire le body batchUpdate\nconst refreshBody = {\n requests: charts.map(id => ({\n refreshSheetsChart: { objectId: id }\n }))\n};\n\nreturn [{\n json: {\n presentationId,\n detectedChartsCount: charts.length,\n refreshBody\n }\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4464,
-176
],
"id": "9bce732d-8a8f-4274-84d9-49d747e17380",
"name": "D\u00e9tecter les charts"
},
{
"parameters": {
"method": "POST",
"url": "=https://slides.googleapis.com/v1/presentations/{{$json.presentationId}}:batchUpdate",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleOAuth2Api",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{$json.refreshBody}}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4704,
-176
],
"id": "2fb98991-f8d8-41b6-a470-458babc7c145",
"name": "Mettre \u00e0 jour les charts"
},
{
"parameters": {
"url": "=https://www.googleapis.com/drive/v3/files/{{$json.presentationId}}/export?mimeType=application/pdf",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleOAuth2Api",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4912,
-176
],
"id": "e3f1b45b-9693-47a3-b78b-b7717c034c06",
"name": "Conversion en PDF"
},
{
"parameters": {
"inputDataFieldName": "=data",
"name": "={{$json.archiveFileName}}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"folderId": {
"__rl": true,
"value": "{{DRIVE_ARCHIVE_FOLDER_ID}}",
"mode": "list",
"cachedResultName": "Formulaire | Evaluation d'entreprise - IA - FR",
"cachedResultUrl": "https://drive.google.com/drive/folders/{{DRIVE_ARCHIVE_FOLDER_ID}}"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
4992,
96
],
"id": "84ac5e05-9fed-403a-8a0a-3751d143ae37",
"name": "Upload file"
},
{
"parameters": {
"toRecipients": "={{ $('Set | submissionID_FR').first().json.email }}",
"subject": "={{ $('Merge').first().json.name }}",
"bodyContent": "Bonjour,\n\nHectelion vous remercie pour votre int\u00e9r\u00eat et votre confiance.\nVeuillez trouver en pi\u00e8ce jointe le rapport PDF d\u2019\u00e9valuation indicative, g\u00e9n\u00e9r\u00e9 sur la base des informations que vous avez communiqu\u00e9es.\n\nCette analyse a pour objectif de vous fournir un premier ordre de grandeur et des \u00e9l\u00e9ments de r\u00e9flexion sur la valeur de votre entreprise, selon des hypoth\u00e8ses standards et une approche automatis\u00e9e.\n\nSi vous souhaitez aller plus loin, affiner les hypoth\u00e8ses, int\u00e9grer des \u00e9l\u00e9ments sp\u00e9cifiques \u00e0 votre activit\u00e9 ou envisager un accompagnement plus approfondi (\u00e9valuation d\u00e9taill\u00e9e, lev\u00e9e de fonds, cession, structuration financi\u00e8re), nous serions ravis d\u2019en discuter avec vous.\n\nNous restons \u00e0 votre enti\u00e8re disposition pour tout compl\u00e9ment d\u2019information.\n\nBien cordialement,\n\n{{SENDER_NAME}}\n{{SENDER_TITLE}}\n \n\nM : {{SENDER_PHONE}}\nE-mail : {{SENDER_EMAIL}}\nSite web : {{SENDER_WEBSITE}}\n{{SENDER_ADDRESS}}\n",
"additionalFields": {
"attachments": {
"attachments": [
{
"binaryPropertyName": "=data"
}
]
}
}
},
"type": "n8n-nodes-base.microsoftOutlook",
"typeVersion": 2,
"position": [
5456,
-176
],
"id": "62b8ba51-ff25-4ce3-94f8-10a0881005f6",
"name": "Send a message"
},
{
"parameters": {
"jsCode": "// R\u00e9cup\u00e8re le nom de la pr\u00e9sentation (d\u00e9j\u00e0 renomm\u00e9e)\n// Remplace \"Merge\" par le node qui contient le champ .name si besoin\nconst slideName = $('Merge').first().json.name;\n\n// Renomme le binaire\nconst b = $binary.data;\nb.fileName = `${slideName}.pdf`;\n\nreturn [{\n json: { ...$json, slideName },\n binary: { data: b },\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
5088,
-176
],
"id": "ec9d1bad-99a3-4e52-a013-56cc20e6e22e",
"name": "Nom du fichier PDF"
},
{
"parameters": {
"jsCode": "// Nom final de la pr\u00e9sentation (le m\u00eame que tu utilises pour l\u2019upload)\nconst slideName = $('Merge').first().json.name;\n\nconst b = $binary.data;\nb.fileName = `${slideName}.pdf`;\n\nreturn [{\n json: { ...$json, slideName },\n binary: { data: b },\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
5296,
-176
],
"id": "03b936ce-011d-4c31-8d01-ea8d81ffc31b",
"name": "Nom binaire"
},
{
"parameters": {
"jsCode": "// Base : nom du PDF (d\u00e9j\u00e0 \u201cpropre\u201d)\nconst baseName = ($binary.data.fileName || 'Rapport.pdf').replace(/\\.pdf$/i, '');\n\n// UID horodat\u00e9 (anti-doublon)\nconst now = new Date();\nconst uid = now.toISOString().replace(/[-:]/g, '').slice(0, 15); // YYYYMMDDTHHMMSS\n\n// Renommer le binaire pour l\u2019archivage\nconst b = $binary.data;\nb.fileName = `${baseName} \u2013 ${uid}.pdf`;\n\n// (optionnel) stocker uid dans le JSON\nreturn [{\n json: { ...$json, uid, archiveFileName: b.fileName },\n binary: { data: b },\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4784,
96
],
"id": "3577b5d2-044a-4e90-a8ea-f9b6163ec8b4",
"name": "Code \u201cImmatriculation\u201d (branche Drive)"
},
{
"parameters": {
"operation": "deleteFile",
"fileId": {
"__rl": true,
"value": "={{ $('Code in JavaScript').item.json.presentationId }}",
"mode": "id"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
5632,
-176
],
"id": "9880cb58-fdea-47b8-a5dc-263d7383609b",
"name": "Delete a file"
},
{
"parameters": {
"httpMethod": "POST",
"path": "tally-valo-exe-FR",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
0,
-160
],
"id": "3c18ede9-06ee-4a77-8dc2-3f7ae67f4f90",
"name": "Webhook | D\u00e9clencheur - FR"
},
{
"parameters": {
"httpMethod": "POST",
"path": "tally-valo-exe-EN",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
0,
400
],
"id": "024b0678-35bf-46ee-8b95-f7b26d7ac3b5",
"name": "Webhook | D\u00e9clencheur - EN"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "72ce25f4-76dc-4909-b306-d63c66443b8b",
"name": "lang",
"value": "FR",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
400,
-160
],
"id": "754e0e22-9a5c-4272-9e74-ed41eafc0b02",
"name": "SET | LANG = FR"
},
{
"parameters": {
"jsCode": "const body = $json.body ?? $json;\nconst data = body.data ?? body;\n\nconst website =\n data?.hiddenFields?.website ??\n data?.hiddenFields?.Website ??\n data?.website ??\n data?.Website ??\n '';\n\nreturn [{\n json: {\n ...$json,\n website: String(website).trim(),\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
592,
-160
],
"id": "a12a6161-d968-42f4-9145-1128948fe39c",
"name": "Normalize honeypot"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{FR_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | \u00c9valuation d'entreprise - FR",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1618743967,
"mode": "list",
"cachedResultName": "metadata",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit#gid=1618743967"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
2752,
-160
],
"id": "3327df92-2291-4385-85f0-739950b84d37",
"name": "Selection du google sheet - FR"
},
{
"parameters": {
"operation": "update",
"fileId": {
"__rl": true,
"value": "={{ $json.id }}",
"mode": "id"
},
"newUpdatedFileName": "={{ $('Limiter le nombre de copie1').item.json['value clean'] }} - Indicative Business Valuation \u2013 EN \u2013 Hectelion",
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
3376,
400
],
"id": "5401e08d-487e-4edc-a8cd-4d82fd5765ef",
"name": "Renommer le template1"
},
{
"parameters": {
"operation": "copy",
"fileId": {
"__rl": true,
"value": "{{EN_SLIDES_TEMPLATE_ID}}",
"mode": "list",
"cachedResultName": "TEMPLATES \u2013 Indicative Business Valuation \u2013 EN \u2013 Hectelion",
"cachedResultUrl": "https://docs.google.com/presentation/d/{{EN_SLIDES_TEMPLATE_ID}}/edit?usp=drivesdk"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
3120,
400
],
"id": "515cf218-66a2-4a13-ad60-cb976f8d0bbe",
"name": "Copier le template1"
},
{
"parameters": {},
"type": "n8n-nodes-base.limit",
"typeVersion": 1,
"position": [
2928,
400
],
"id": "a165dbe0-3b90-4eff-9dac-622f4e813f30",
"name": "Limiter le nombre de copie1"
},
{
"parameters": {
"mode": "combine",
"combineBy": "combineAll",
"options": {}
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
3616,
400
],
"id": "d163a2de-1453-4049-993d-ab9a304fafca",
"name": "Merge2"
},
{
"parameters": {
"jsCode": "// 1) R\u00e9cup\u00e9rer l'ID de la pr\u00e9sentation copi\u00e9e (fiable)\nconst presentationId =\n $('Copier le template1').first().json.id\n ?? $('Renommer le template1').first().json.id;\n\nif (!presentationId) {\n throw new Error('presentationId introuvable. V\u00e9rifie la sortie de \"Copier le template\" / \"Renommer le template\".');\n}\n\n// 2) Construire les requests \u00e0 partir des lignes metadata uniquement\nconst rows = $input.all()\n .map(i => i.json)\n .filter(r => typeof r?.Key === 'string' && r.Key.trim() !== '');\n\nif (!rows.length) {\n throw new Error('Aucune ligne metadata d\u00e9tect\u00e9e (colonne \"Key\"). V\u00e9rifie ton Google Sheet \"metadata\".');\n}\n\nconst requests = rows.map(r => ({\n replaceAllText: {\n containsText: { text: r.Key, matchCase: true },\n replaceText: String(r['value clean'] ?? ''),\n },\n}));\n\nreturn [{\n json: {\n presentationId,\n body: { requests },\n },\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
3808,
400
],
"id": "5a20693d-7278-43d7-8f0a-746f3cb65607",
"name": "Code in JavaScript1"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{EN_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | \u00c9valuation d'entreprise - EN",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1073246114,
"mode": "list",
"cachedResultName": "metadata",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit#gid=1073246114"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
2736,
400
],
"id": "a2fbb32f-6a9e-4492-bc29-329ded3954ac",
"name": "Selection du google sheet - EN"
},
{
"parameters": {
"method": "POST",
"url": "=https://slides.googleapis.com/v1/presentations/{{$json.presentationId}}:batchUpdate",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleOAuth2Api",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{$json[\"body\"]}}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4016,
400
],
"id": "1e1b5ad7-98a9-483d-b054-7b66f574f875",
"name": "Remplacement des valeurs - EN"
},
{
"parameters": {
"url": "=https://slides.googleapis.com/v1/presentations/{{$json.presentationId}}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleOAuth2Api",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4240,
400
],
"id": "45baded0-c792-4360-bb8f-546e59221630",
"name": "Extraire dynamiquement les charts - EN"
},
{
"parameters": {
"jsCode": "const pres = $input.first().json;\n\n// S\u00e9curit\u00e9 : garder l\u2019ID de la pr\u00e9sentation\nconst presentationId = pres.presentationId || $json.presentationId;\n\n// Extraire les charts li\u00e9s \u00e0 Sheets\nconst charts = [];\nfor (const slide of (pres.slides ?? [])) {\n for (const el of (slide.pageElements ?? [])) {\n if (el.sheetsChart && el.objectId) {\n charts.push(el.objectId);\n }\n }\n}\n\n// Construire le body batchUpdate\nconst refreshBody = {\n requests: charts.map(id => ({\n refreshSheetsChart: { objectId: id }\n }))\n};\n\nreturn [{\n json: {\n presentationId,\n detectedChartsCount: charts.length,\n refreshBody\n }\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4448,
400
],
"id": "104cf458-b979-4ed9-9227-2d1ed83797b4",
"name": "D\u00e9tecter les charts - EN"
},
{
"parameters": {
"method": "POST",
"url": "=https://slides.googleapis.com/v1/presentations/{{$json.presentationId}}:batchUpdate",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleOAuth2Api",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{$json.refreshBody}}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4688,
400
],
"id": "4ce3fbd9-5274-4d77-8eb8-ef8b521f2f94",
"name": "Mettre \u00e0 jour les charts - EN"
},
{
"parameters": {
"url": "=https://www.googleapis.com/drive/v3/files/{{$json.presentationId}}/export?mimeType=application/pdf",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleOAuth2Api",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
4896,
400
],
"id": "f03e54af-ab9a-4784-aa9a-3c1fcfbd6df1",
"name": "Conversion en PDF - EN"
},
{
"parameters": {
"jsCode": "// R\u00e9cup\u00e8re le nom de la pr\u00e9sentation (d\u00e9j\u00e0 renomm\u00e9e)\n// Remplace \"Merge\" par le node qui contient le champ .name si besoin\nconst slideName = $('Merge2').first().json.name;\n\n// Renomme le binaire\nconst b = $binary.data;\nb.fileName = `${slideName}.pdf`;\n\nreturn [{\n json: { ...$json, slideName },\n binary: { data: b },\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
5072,
400
],
"id": "9e03102b-cdf5-4de3-b456-90df3918248f",
"name": "Nom du fichier PDF - EN"
},
{
"parameters": {
"jsCode": "// Nom final de la pr\u00e9sentation (le m\u00eame que tu utilises pour l\u2019upload)\nconst slideName = $('Merge2').first().json.name;\n\nconst b = $binary.data;\nb.fileName = `${slideName}.pdf`;\n\nreturn [{\n json: { ...$json, slideName },\n binary: { data: b },\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
5280,
400
],
"id": "62a1c65d-934b-4b92-9266-3b14bef3c922",
"name": "Nom binaire - EN"
},
{
"parameters": {
"toRecipients": "={{ $('Set | submissionID_EN').first().json.email }}",
"subject": "={{ $('Merge2').first().json.name }}",
"bodyContent": "Hello,\n\nHectelion would like to thank you for your interest and for the trust you have placed in us.\nPlease find attached the indicative valuation report in PDF format, generated based on the information you provided.\n\nThis analysis is intended to give you an initial order of magnitude and key insights into the value of your company, based on standard assumptions and an automated approach.\n\nShould you wish to go further\u2014by refining the assumptions, incorporating elements specific to your business, or considering more comprehensive support (detailed valuation, fundraising, disposal process, financial structuring)\u2014we would be pleased to discuss this with you.\n\nWe remain at your full disposal should you require any additional information.\n\nKind regards,\n\n{{SENDER_NAME}}\n{{SENDER_TITLE}}\n \n\nM : {{SENDER_PHONE}}\nE-mail : {{SENDER_EMAIL}}\nSite web : {{SENDER_WEBSITE}}\n{{SENDER_ADDRESS}}\n",
"additionalFields": {
"attachments": {
"attachments": [
{
"binaryPropertyName": "=data"
}
]
}
}
},
"type": "n8n-nodes-base.microsoftOutlook",
"typeVersion": 2,
"position": [
5456,
400
],
"id": "4b4076e3-c56d-426a-97b2-24b24d0ef4ac",
"name": "Send a message - EN"
},
{
"parameters": {
"operation": "deleteFile",
"fileId": {
"__rl": true,
"value": "={{ $('Code in JavaScript1').item.json.presentationId }}",
"mode": "id"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
5632,
400
],
"id": "ebe65ff2-eaba-45c9-b076-a9224a5bf84a",
"name": "Delete a file - EN"
},
{
"parameters": {
"jsCode": "// Base : nom du PDF (d\u00e9j\u00e0 \u201cpropre\u201d)\nconst baseName = ($binary.data.fileName || 'Rapport.pdf').replace(/\\.pdf$/i, '');\n\n// UID horodat\u00e9 (anti-doublon)\nconst now = new Date();\nconst uid = now.toISOString().replace(/[-:]/g, '').slice(0, 15); // YYYYMMDDTHHMMSS\n\n// Renommer le binaire pour l\u2019archivage\nconst b = $binary.data;\nb.fileName = `${baseName} \u2013 ${uid}.pdf`;\n\n// (optionnel) stocker uid dans le JSON\nreturn [{\n json: { ...$json, uid, archiveFileName: b.fileName },\n binary: { data: b },\n}];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
4768,
672
],
"id": "1e693082-eccb-45a0-90df-6623faf220b9",
"name": "Code \u201cImmatriculation\u201d (branche Drive) - EN"
},
{
"parameters": {
"inputDataFieldName": "=data",
"name": "={{$json.archiveFileName}}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"folderId": {
"__rl": true,
"value": "{{DRIVE_ARCHIVE_FOLDER_ID}}",
"mode": "list",
"cachedResultName": "Formulaire | Evaluation d'entreprise - IA - FR",
"cachedResultUrl": "https://drive.google.com/drive/folders/{{DRIVE_ARCHIVE_FOLDER_ID}}"
},
"options": {}
},
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
4976,
672
],
"id": "d0362bf8-fbc1-498f-8f95-f879c4ac2319",
"name": "Upload file - EN"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "fdc37a3f-a84a-42f5-8c40-254daf179895",
"name": "submissionId",
"value": "={{ $json.body.data.submissionId }}",
"type": "string"
},
{
"id": "9a6ae5a2-b34d-4565-ab68-03705a26b6b3",
"name": "email",
"value": "={{ $json.body.data.fields[2].value }}",
"type": "string"
},
{
"id": "732c4f32-4c2f-4493-8e7e-72f1900a1269",
"name": "first",
"value": "={{ $json.body.data.fields[0].value }}",
"type": "string"
},
{
"id": "0b38e34a-7dd3-4f0d-9a70-f4ff1f0b7cde",
"name": "last",
"value": "={{ $json.body.data.fields[1].value }}",
"type": "string"
},
{
"id": "68f07e2a-6764-4ebe-bf65-b76c2f0564cc",
"name": "company",
"value": "={{ $json.body.data.fields[5].value }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
208,
-160
],
"id": "f7ef57b0-c9cd-4535-b870-5c111da41efb",
"name": "Set | submissionID_FR"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{FR_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | \u00c9valuation d'entreprise - FR",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1726135584,
"mode": "list",
"cachedResultName": "n8n_sent_log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit#gid=1726135584"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
976,
-160
],
"id": "68028664-0c2d-45ee-8fba-a2d4a80c63de",
"name": "(Read n8n_sent_log)"
},
{
"parameters": {
"jsCode": "// FR \u2014 compare submissionId (Set | submissionID_FR) vs colonne \"Submission ID\" du log\n\nconst currentId = String($('Set | submissionID_FR').first().json.submissionId ?? '').trim();\n\nconst logItems = $items('(Read n8n_sent_log)');\n\nconst alreadySent = logItems.some(i =>\n String(i.json['Submission ID'] ?? '').trim() === currentId\n);\n\nreturn [\n {\n json: {\n submissionId_current: currentId,\n alreadySent,\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1168,
-160
],
"id": "a5511fb8-03bd-4d48-a044-4b5d58290a44",
"name": "Code | compute alreadySent"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "a3ef5c19-e14a-4d8d-b808-f631a60343ce",
"leftValue": "={{ $json.alreadySent }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
1376,
-160
],
"id": "9eed2a72-7ce7-4075-8b23-c338d03d4537",
"name": "IF \u201calreadySent\u201d"
},
{
"parameters": {
"options": {
"responseCode": 200
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1376,
-368
],
"id": "27a750f8-c723-4ecd-9626-2e078816ecc8",
"name": "Respond to Webhook"
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "{{FR_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | \u00c9valuation d'entreprise - FR",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1726135584,
"mode": "list",
"cachedResultName": "n8n_sent_log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit#gid=1726135584"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Submission ID": "={{ $('Set | submissionID_FR').first().json.submissionId }}"
},
"matchingColumns": [
"Submission ID"
],
"schema": [
{
"id": "Submission ID",
"displayName": "Submission ID",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1648,
-144
],
"id": "7307a2eb-9e6a-43b2-b134-18c35afff2a4",
"name": "Append to n8n_sent_log"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\nconst rows = $input.all();\n\n// Construire map : \"{{EMAIL}}\" -> \"...\"\nconst map = {};\nfor (const r of rows) {\n const key = String(r.json[\"Key\"] ?? \"\").trim();\n const val = r.json[\"value clean\"] ?? r.json[\"value brute\"] ?? \"\";\n if (key) map[key] = val;\n}\n\n// Extraire UNIQUEMENT les 5 champs requis\nconst sheetFields = {\n email: norm(map[\"{{CLIENT_EMAIL}}\"]),\n first: norm(map[\"{{FIRST}}\"]),\n last: norm(map[\"{{LAST}}\"]),\n company: norm(map[\"{{COMPANY_NAME}}\"]),\n};\n\nreturn [\n {\n json: {\n sheetFields,\n // debug utile (tu peux enlever apr\u00e8s)\n debug: {\n extracted: sheetFields,\n }\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2080,
-144
],
"id": "338fea07-cf15-47de-b0e3-f36372a4a6eb",
"name": "fingerprint_sheet_fr"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "d4773188-3695-47f2-818f-569a6af30cdb",
"leftValue": "={{ $json.isMatch }}",
"rightValue": "={{ $node[\"fingerprint_webhook\"].json.fingerprint_webhook }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
2496,
-144
],
"id": "8be61a37-f2b0-4ad8-93f4-3abc1138bda0",
"name": "Webhook vs. google sheet_fr"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\nconst sheet = $json.sheetFields;\n\n// Lire le payload canonique webhook FR\nconst w = $(\"Set | submissionID_FR\").first().json;\n\nconst webhookFields = {\n email: norm(w.email),\n first: norm(w.first),\n last: norm(w.last),\n company: norm(w.company),\n};\n\nconst checks = {\n email: sheet.email === webhookFields.email,\n first: sheet.first === webhookFields.first,\n last: sheet.last === webhookFields.last,\n company: sheet.company === webhookFields.company,\n};\n\nconst isMatch = Object.values(checks).every(Boolean);\n\nreturn [\n {\n json: {\n isMatch,\n checks,\n sheetFields: sheet,\n webhookFields,\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2272,
-144
],
"id": "8c29376c-913b-48be-ba78-bc3b1164ffb1",
"name": "Match_fr"
},
{
"parameters": {
"options": {
"responseCode": 200
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
2480,
-416
],
"id": "02995b20-b4d8-45c1-b90a-fe265c657f96",
"name": "Respond to Webhook1"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{FR_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | \u00c9valuation d'entreprise - FR",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1618743967,
"mode": "list",
"cachedResultName": "metadata",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{FR_SPREADSHEET_ID}}/edit#gid=1618743967"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1872,
-144
],
"id": "58527e4f-1750-443a-8a46-f426c5c5108d",
"name": "Google Sheet | Tally - Hectelion - Valo - FR"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\n// \u26a0\ufe0f adapte les chemins ci-dessous selon ton webhook Tally\nconst data = $json.body?.data ?? $json.data ?? $json;\n\nconst obj = {\n email: norm(data.email ?? data.hiddenFields?.email),\n company: norm(data.company_name ?? data.company),\n first: norm(data.first_name ?? data.issuer_first_name),\n last: norm(data.last_name ?? data.issuer_last_name),\n term: norm(data.confidentiality_term_years ?? data.term),\n};\n\nconst fingerprint_webhook = Object.keys(obj)\n .sort()\n .map(k => `${k}=${obj[k]}`)\n .join('|');\n\nreturn [{ json: { ...$json, fingerprint_webhook } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
768,
-160
],
"id": "4afb6f48-ac75-4131-8687-bc1379cc33af",
"name": "fingerprint_webhook"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "f18e75f9-6441-4c09-b745-a23942e2ad42",
"name": "lang",
"value": "EN",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
400,
400
],
"id": "cca85b23-59db-4362-883e-538ba157d4b5",
"name": "Set | Lang = EN"
},
{
"parameters": {
"options": {
"responseCode": 200
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
2496,
816
],
"id": "8fe21e34-2d13-4f29-8b8d-058dd6733fbd",
"name": "Respond to Webhook2"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\nconst rows = $input.all();\n\n// Construire map : \"{{EMAIL}}\" -> \"...\"\nconst map = {};\nfor (const r of rows) {\n const key = String(r.json[\"Key\"] ?? \"\").trim();\n const val = r.json[\"value clean\"] ?? r.json[\"value brute\"] ?? \"\";\n if (key) map[key] = val;\n}\n\n// Extraire UNIQUEMENT les 5 champs requis\nconst sheetFields = {\n email: norm(map[\"{{CLIENT_EMAIL}}\"]),\n first: norm(map[\"{{FIRST}}\"]),\n last: norm(map[\"{{LAST}}\"]),\n company: norm(map[\"{{COMPANY_NAME}}\"]),\n};\n\nreturn [\n {\n json: {\n sheetFields,\n // debug utile (tu peux enlever apr\u00e8s)\n debug: {\n extracted: sheetFields,\n }\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2016,
416
],
"id": "8f573b5e-3623-4aa3-b9bb-c8aa05f570aa",
"name": "fingerprint_sheet_en"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "d4773188-3695-47f2-818f-569a6af30cdb",
"leftValue": "={{ $json.isMatch }}",
"rightValue": "={{ $('fingerprint_webhook_en').first().json.fingerprint_webhook }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
2496,
416
],
"id": "58b6d36f-d829-455c-b3f4-fe94896ba510",
"name": "Webhook vs. google sheet_en"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "3346028b-f99f-490a-98aa-b13adf49015a",
"name": "submissionId",
"value": "={{ $json.body.data.submissionId }}",
"type": "string"
},
{
"id": "f172dff5-e7b3-4f8d-813c-4ab3855e7add",
"name": "email",
"value": "={{ $json.body.data.fields[2].value }}",
"type": "string"
},
{
"id": "6cbed047-7011-47ab-97be-09b732637bca",
"name": "first",
"value": "={{ $json.body.data.fields[0].value }}",
"type": "string"
},
{
"id": "ef1cac08-119f-40cb-b95b-b6c3ac9df01d",
"name": "last",
"value": "={{ $json.body.data.fields[1].value }}",
"type": "string"
},
{
"id": "49ccb0eb-beaa-469e-8b83-5c9b485052ad",
"name": "company",
"value": "={{ $json.body.data.fields[5].value }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
208,
400
],
"id": "a987ac62-fd53-42bf-83b1-a0c1c3abbe1e",
"name": "Set | submissionID_EN"
},
{
"parameters": {
"options": {
"responseCode": 200
}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1440,
832
],
"id": "cc6291d8-3610-48a7-a308-a672c98f72cf",
"name": "Respond to Webhook3"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{EN_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | \u00c9valuation d'entreprise - EN",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 190889862,
"mode": "list",
"cachedResultName": "n8n_sent_log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit#gid=190889862"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
992,
400
],
"id": "55f8ebca-5fb9-43a7-af81-ac6ab8ca2e8b",
"name": "(Read n8n_sent_log)_en"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\n// \u26a0\ufe0f adapte les chemins ci-dessous selon ton webhook Tally\nconst data = $json.body?.data ?? $json.data ?? $json;\n\nconst obj = {\n email: norm(data.email ?? data.hiddenFields?.email),\n company: norm(data.company_name ?? data.company),\n project: norm(data.project_name ?? data.project),\n first: norm(data.first_name ?? data.issuer_first_name),\n last: norm(data.last_name ?? data.issuer_last_name),\n term: norm(data.confidentiality_term_years ?? data.term),\n};\n\nconst fingerprint_webhook = Object.keys(obj)\n .sort()\n .map(k => `${k}=${obj[k]}`)\n .join('|');\n\nreturn [{ json: { ...$json, fingerprint_webhook } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
400
],
"id": "05e96e5d-8a2d-4978-a60f-f5d8955afea3",
"name": "fingerprint_webhook_en"
},
{
"parameters": {
"jsCode": "const body = $json.body ?? $json;\nconst data = body.data ?? body;\n\nconst website =\n data?.hiddenFields?.website ??\n data?.hiddenFields?.Website ??\n data?.website ??\n data?.Website ??\n '';\n\nreturn [{\n json: {\n ...$json,\n website: String(website).trim(),\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
592,
400
],
"id": "1982efad-566a-405f-bf62-69b2336caed1",
"name": "Normalize honeypot_en"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "7459da8d-32a0-47c1-897e-8672364d57c5",
"leftValue": "={{ $json.alreadySent }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
1360,
400
],
"id": "134a33ae-aa98-4d10-bbdd-bf890f186f7a",
"name": "IF \u201calreadySent\u201d_en"
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "{{EN_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | \u00c9valuation d'entreprise - EN",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 190889862,
"mode": "list",
"cachedResultName": "n8n_sent_log",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit#gid=190889862"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Submission ID": "={{ $json.submissionId_current }}"
},
"matchingColumns": [
"Submission ID"
],
"schema": [
{
"id": "Submission ID",
"displayName": "Submission ID",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1584,
416
],
"id": "0cacc146-24d7-46fd-b600-efc1f86c4d77",
"name": "Append to n8n_sent_log_en"
},
{
"parameters": {
"jsCode": "// 1) Prendre le submissionId depuis \"Set | submissionID_EN\" SANS pairing\nconst currentId = String($('Set | submissionID_EN').first().json.submissionId ?? '').trim();\n\n// 2) Lire toutes les lignes du log EN\nconst logItems = $items('(Read n8n_sent_log)_en');\n\n// 3) Comparer au champ \"Submission ID\" du log\nconst alreadySent = logItems.some(i =>\n String(i.json['Submission ID'] ?? '').trim() === currentId\n);\n\n// 4) Retourner seulement le bool\u00e9en (et le currentId pour l'\u00e9tape suivante)\nreturn [\n {\n json: {\n submissionId_current: currentId,\n alreadySent\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1168,
400
],
"id": "1f9df9c7-5e9a-4f43-aacf-53fd1ad1d16a",
"name": "Code | compute alreadySent_en"
},
{
"parameters": {
"jsCode": "function norm(v) {\n return String(v ?? '').trim().toLowerCase();\n}\n\nconst sheet = $json.sheetFields;\n\n// Lire le payload canonique webhook FR\nconst w = $(\"Set | submissionID_EN\").first().json;\n\nconst webhookFields = {\n email: norm(w.email),\n first: norm(w.first),\n last: norm(w.last),\n company: norm(w.company),\n};\n\nconst checks = {\n email: sheet.email === webhookFields.email,\n first: sheet.first === webhookFields.first,\n last: sheet.last === webhookFields.last,\n company: sheet.company === webhookFields.company,\n};\n\nconst isMatch = Object.values(checks).every(Boolean);\n\nreturn [\n {\n json: {\n isMatch,\n checks,\n sheetFields: sheet,\n webhookFields,\n }\n }\n];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2240,
416
],
"id": "2e956f80-64cd-4c5e-885e-f4e28724e300",
"name": "Match_en"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "{{EN_SPREADSHEET_ID}}",
"mode": "list",
"cachedResultName": "Hectelion | \u00c9valuation d'entreprise - EN",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1073246114,
"mode": "list",
"cachedResultName": "metadata",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{EN_SPREADSHEET_ID}}/edit#gid=1073246114"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1808,
416
],
"id": "67ae62a0-0a5f-4f29-8e9e-3f4efda69d76",
"name": "Google Sheet | Tally - Hectelion - Valo - EN"
}
],
"connections": {
"Renommer le template": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Copier le template": {
"main": [
[
{
"node": "Renommer le template",
"type": "main",
"index": 0
}
]
]
},
"Limiter le nombre de copie": {
"main": [
[
{
"node": "Copier le template",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Remplacement des valeurs",
"type": "main",
"index": 0
}
]
]
},
"Remplacement des valeurs": {
"main": [
[
{
"node": "Extraire dynamiquement les charts",
"type": "main",
"index": 0
}
]
]
},
"Extraire dynamiquement les charts": {
"main": [
[
{
"node": "D\u00e9tecter les charts",
"type": "main",
"index": 0
}
]
]
},
"D\u00e9tecter les charts": {
"main": [
[
{
"node": "Mettre \u00e0 jour les charts",
"type": "main",
"index": 0
}
]
]
},
"Mettre \u00e0 jour les charts": {
"main": [
[
{
"node": "Conversion en PDF",
"type": "main",
"index": 0
}
]
]
},
"Conversion en PDF": {
"main": [
[
{
"node": "Nom du fichier PDF",
"type": "main",
"index": 0
}
]
]
},
"Upload file": {
"main": [
[]
]
},
"Send a message": {
"main": [
[
{
"node": "Delete a file",
"type": "main",
"index": 0
}
]
]
},
"Nom du fichier PDF": {
"main": [
[
{
"node": "Nom binaire",
"type": "main",
"index": 0
},
{
"node": "Code \u201cImmatriculation\u201d (branche Drive)",
"type": "main",
"index": 0
}
]
]
},
"Nom binaire": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"Code \u201cImmatriculation\u201d (branche Drive)": {
"main": [
[
{
"node": "Upload file",
"type": "main",
"index": 0
}
]
]
},
"Webhook | D\u00e9clencheur - FR": {
"main": [
[
{
"node": "Set | submissionID_FR",
"type": "main",
"index": 0
}
]
]
},
"Webhook | D\u00e9clencheur - EN": {
"main": [
[
{
"node": "Set | submissionID_EN",
"type": "main",
"index": 0
}
]
]
},
"SET | LANG = FR": {
"main": [
[
{
"node": "Normalize honeypot",
"type": "main",
"index": 0
}
]
]
},
"Normalize honeypot": {
"main": [
[
{
"node": "fingerprint_webhook",
"type": "main",
"index": 0
}
]
]
},
"Selection du google sheet - FR": {
"main": [
[
{
"node": "Limiter le nombre de copie",
"type": "main",
"index": 0
},
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Renommer le template1": {
"main": [
[
{
"node": "Merge2",
"type": "main",
"index": 0
}
]
]
},
"Copier le template1": {
"main": [
[
{
"node": "Renommer le template1",
"type": "main",
"index": 0
}
]
]
},
"Limiter le nombre de copie1": {
"main": [
[
{
"node": "Copier le template1",
"type": "main",
"index": 0
}
]
]
},
"Merge2": {
"main": [
[
{
"node": "Code in JavaScript1",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript1": {
"main": [
[
{
"node": "Remplacement des valeurs - EN",
"type": "main",
"index": 0
}
]
]
},
"Selection du google sheet - EN": {
"main": [
[
{
"node": "Limiter le nombre de copie1",
"type": "main",
"index": 0
},
{
"node": "Merge2",
"type": "main",
"index": 1
}
]
]
},
"Remplacement des valeurs - EN": {
"main": [
[
{
"node": "Extraire dynamiquement les charts - EN",
"type": "main",
"index": 0
}
]
]
},
"Extraire dynamiquement les charts - EN": {
"main": [
[
{
"node": "D\u00e9tecter les charts - EN",
"type": "main",
"index": 0
}
]
]
},
"D\u00e9tecter les charts - EN": {
"main": [
[
{
"node": "Mettre \u00e0 jour les charts - EN",
"type": "main",
"index": 0
}
]
]
},
"Mettre \u00e0 jour les charts - EN": {
"main": [
[
{
"node": "Conversion en PDF - EN",
"type": "main",
"index": 0
}
]
]
},
"Conversion en PDF - EN": {
"main": [
[
{
"node": "Nom du fichier PDF - EN",
"type": "main",
"index": 0
}
]
]
},
"Nom du fichier PDF - EN": {
"main": [
[
{
"node": "Nom binaire - EN",
"type": "main",
"index": 0
},
{
"node": "Code \u201cImmatriculation\u201d (branche Drive) - EN",
"type": "main",
"index": 0
}
]
]
},
"Nom binaire - EN": {
"main": [
[
{
"node": "Send a message - EN",
"type": "main",
"index": 0
}
]
]
},
"Send a message - EN": {
"main": [
[
{
"node": "Delete a file - EN",
"type": "main",
"index": 0
}
]
]
},
"Code \u201cImmatriculation\u201d (branche Drive) - EN": {
"main": [
[
{
"node": "Upload file - EN",
"type": "main",
"index": 0
}
]
]
},
"Set | submissionID_FR": {
"main": [
[
{
"node": "SET | LANG = FR",
"type": "main",
"index": 0
}
]
]
},
"(Read n8n_sent_log)": {
"main": [
[
{
"node": "Code | compute alreadySent",
"type": "main",
"index": 0
}
]
]
},
"Code | compute alreadySent": {
"main": [
[
{
"node": "IF \u201calreadySent\u201d",
"type": "main",
"index": 0
}
]
]
},
"IF \u201calreadySent\u201d": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
],
[
{
"node": "Append to n8n_sent_log",
"type": "main",
"index": 0
}
]
]
},
"Append to n8n_sent_log": {
"main": [
[
{
"node": "Google Sheet | Tally - Hectelion - Valo - FR",
"type": "main",
"index": 0
}
]
]
},
"fingerprint_sheet_fr": {
"main": [
[
{
"node": "Match_fr",
"type": "main",
"index": 0
}
]
]
},
"Webhook vs. google sheet_fr": {
"main": [
[
{
"node": "Selection du google sheet - FR",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook1",
"type": "main",
"index": 0
}
]
]
},
"Match_fr": {
"main": [
[
{
"node": "Webhook vs. google sheet_fr",
"type": "main",
"index": 0
}
]
]
},
"Google Sheet | Tally - Hectelion - Valo - FR": {
"main": [
[
{
"node": "fingerprint_sheet_fr",
"type": "main",
"index": 0
}
]
]
},
"fingerprint_webhook": {
"main": [
[
{
"node": "(Read n8n_sent_log)",
"type": "main",
"index": 0
}
]
]
},
"Set | Lang = EN": {
"main": [
[
{
"node": "Normalize honeypot_en",
"type": "main",
"index": 0
}
]
]
},
"fingerprint_sheet_en": {
"main": [
[
{
"node": "Match_en",
"type": "main",
"index": 0
}
]
]
},
"Webhook vs. google sheet_en": {
"main": [
[
{
"node": "Selection du google sheet - EN",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook2",
"type": "main",
"index": 0
}
]
]
},
"Set | submissionID_EN": {
"main": [
[
{
"node": "Set | Lang = EN",
"type": "main",
"index": 0
}
]
]
},
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Hectelion | Evaluation d'entreprise. Uses googleDrive, httpRequest, microsoftOutlook, googleSheets. Webhook trigger; 64 nodes.
Source: https://github.com/Hectelion-SA/n8n-business-valuation/blob/main/workflow.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Hectelion | NDA. Uses googleSheets, googleDrive, httpRequest, microsoftOutlook. Webhook trigger; 50 nodes.
Streamline and standardize your entire client onboarding process with a single end-to-end automation. 🚀📋 This workflow captures detailed client intake data via webhook, automatically creates a fully s
Sell on n8n using Stripe (Fully Automated Delivery)
This workflow creates PDF certificates using Stencil, stores them in Google Drive, and emails them to participants. A new row is added to the Google Sheets document (via form, webhook, or manual entry
✨🔪 Advanced AI Powered Document Parsing & Text Extraction with Llama Parse. Uses gmail, gmailTrigger, limit, stickyNote. Webhook trigger; 54 nodes.