电子表格中带红色标记修正de代码审查

Avancé

Ceci est unEngineering, AI Summarizationworkflow d'automatisation du domainecontenant 16 nœuds.Utilise principalement des nœuds comme Set, Slack, Function, GoogleSheets, Agent. AI驱动代码审查,含代码检查、Google Sheets红色标记修正etSlacknotification

Prérequis
  • Token Bot Slack ou URL Webhook
  • Informations d'identification Google Sheets API
  • Clé API Google Gemini
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
{
  "id": "CCpAUiVj1gyJZJUw",
  "meta": {
    "instanceId": "15d6057a37b8367f33882dd60593ee5f6cc0c59310ff1dc66b626d726083b48d",
    "templateCredsSetupCompleted": true
  },
  "name": "Code Review with Red-Marked Corrections in Spreadsheet",
  "tags": [],
  "nodes": [
    {
      "id": "4af3c4b2-b7ad-407f-8ead-8509bde98b71",
      "name": "Surveillance de la feuille de saisie de code",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        -624,
        0
      ],
      "parameters": {
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "<YOUR_SHEET_GID_OR_NAME>",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ABYuKFtVf1qgXa8S8yDNOKu7yCuDQzKPZQ-oufhsTJY/edit#gid=0",
          "cachedResultName": "対象コード"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "<YOUR_SPREADSHEET_ID>",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ABYuKFtVf1qgXa8S8yDNOKu7yCuDQzKPZQ-oufhsTJY/edit?usp=drivesdk",
          "cachedResultName": "コードレビュー"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "47c973ae-f613-4a3c-ba53-0166e9a617a0",
      "name": "Mise en forme des résultats de la revue",
      "type": "n8n-nodes-base.set",
      "position": [
        464,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "reviewedCode",
              "type": "string",
              "value": "={{ $json.output }}"
            },
            {
              "id": "id-2",
              "name": "originalCode",
              "type": "string",
              "value": "={{ $('コード入力シート監視').item.json.code }}"
            },
            {
              "id": "id-3",
              "name": "timestamp",
              "type": "string",
              "value": "={{ $now.toISO() }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2bab7e4b-daab-4a05-83bd-2b60465077e9",
      "name": "Écriture des résultats de la revue",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        608,
        0
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "<YOUR_SHEET_GID_OR_NAME>",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ABYuKFtVf1qgXa8S8yDNOKu7yCuDQzKPZQ-oufhsTJY/edit#gid=1115979776",
          "cachedResultName": "レビュー結果"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "<YOUR_SPREADSHEET_ID>",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ABYuKFtVf1qgXa8S8yDNOKu7yCuDQzKPZQ-oufhsTJY/edit?usp=drivesdk",
          "cachedResultName": "コードレビュー"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "WyvnXUuLPJ70Wazr",
          "name": "Google Sheets account 18"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "b6dda288-7b1b-41a0-9e88-f8cadc6499b6",
      "name": "Agent IA",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -176,
        0
      ],
      "parameters": {
        "text": "=Lint summary (consider in review):\n{{ JSON.stringify($('Lint Check').first().json.lintErrors) }}\n\nLint score: {{ $('Lint Check').first().json.lintScore }} / 10\n\n=あなたはコードレビューの専門家です。以下のコードをレビューし、修正が必要な箇所を赤字で示してください。元のコードに対して、修正案を赤字(HTMLの<span style=\"color:red\">タグ)で追記した形式で出力してください。\n\n{{ $json.reviewPrompt }}\n\nコード:\n{{ $('コード入力シート監視').item.json.code }}\n\n【Review Rules】\n- Classify issues as Critical / Major / Minor\n- Use <span style=\"color:red\">red</span> for critical fixes; <span style=\"color:orange\">orange</span> for minor suggestions\n- Append JSON at end: {\"overall_score\": <0-10 number>}\n",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "05ee83db-4b56-43ee-b153-3ba224393f88",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -176,
        224
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "a4fd65ae-4f56-4b3a-be8c-29d2a0b171f8",
      "name": "Obtenir la/les ligne(s) dans la feuille Google Sheets",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        -32,
        224
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "<YOUR_SHEET_GID_OR_NAME>",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ABYuKFtVf1qgXa8S8yDNOKu7yCuDQzKPZQ-oufhsTJY/edit#gid=2003594084",
          "cachedResultName": "コード規約"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "<YOUR_SPREADSHEET_ID>",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ABYuKFtVf1qgXa8S8yDNOKu7yCuDQzKPZQ-oufhsTJY/edit?usp=drivesdk",
          "cachedResultName": "コードレビュー"
        },
        "authentication": "serviceAccount",
        "descriptionType": "manual",
        "toolDescription": "記載される内容をもとにレビュー"
      },
      "typeVersion": 4.7
    },
    {
      "id": "27a24123-0992-4af0-98f4-d37148cb6b5d",
      "name": "Note de déclenchement de feuille",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -688,
        -128
      ],
      "parameters": {
        "content": "Monitors the 'Input Code' sheet for new or edited rows to start the review process automatically."
      },
      "typeVersion": 1
    },
    {
      "id": "11e67e60-aaf1-49f0-a53c-93c9efde194d",
      "name": "Note de revue IA",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -448,
        -128
      ],
      "parameters": {
        "content": "Sends the submitted code to the connected AI model (e.g., Gemini or GPT) for detailed review and feedback."
      },
      "typeVersion": 1
    },
    {
      "id": "e81e15e9-55fa-46c4-b4d1-4304b6bb975c",
      "name": "Note de mise en forme",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        -128
      ],
      "parameters": {
        "content": "Formats AI’s review response — adds red-colored text for corrections and clear comments for improvements."
      },
      "typeVersion": 1
    },
    {
      "id": "d2569a9f-fa2c-4979-9137-a4182b425528",
      "name": "Note d'écriture des résultats",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        -128
      ],
      "parameters": {
        "width": 528,
        "content": "Writes the reviewed and corrected code output into the 'Review Results' sheet for easy comparison."
      },
      "typeVersion": 1
    },
    {
      "id": "6cb8265d-a2a8-4542-80b6-358181a239ee",
      "name": "Vérification de lint",
      "type": "n8n-nodes-base.function",
      "position": [
        -400,
        0
      ],
      "parameters": {
        "functionCode": "const code = $('コード入力シート監視').item.json.code || '';\nconst errors = [];\nif (code.includes('var ')) errors.push({type:'Major', msg:'Avoid var; use let/const.'});\nif (code.includes('console.log')) errors.push({type:'Minor', msg:'Remove console.log in production.'});\nconst open = (code.match(/\\{/g)||[]).length;\nconst close = (code.match(/\\}/g)||[]).length;\nif (open !== close) errors.push({type:'Critical', msg:`Brace imbalance: {=${open}} }=${close}`});\nconst score = Math.max(0, 10 - errors.length * 2);\nreturn [{ json: { code, lintErrors: errors, lintScore: score }}];\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8850c4ee-5296-4a3c-aaca-d6bd9d4bdde2",
      "name": "Formatage des résultats de la revue",
      "type": "n8n-nodes-base.function",
      "position": [
        176,
        0
      ],
      "parameters": {
        "functionCode": "const out = $json.output || '';\nconst lint = $('Lint Check').first().json || {};\nconst errors = lint.lintErrors || [];\nconst counts = { Critical:0, Major:0, Minor:0 };\nerrors.forEach(e=>{ if (counts[e.type]!==undefined) counts[e.type]++; });\nlet overall =  Number((lint.lintScore || 0));\nconst m = out.match(/\\{\\\"overall_score\\\"\\s*:\\s*([0-9.]+)\\}/);\nif (m) overall = (overall + Number(m[1]))/2;\nreturn [{ json: { reviewed: out, lintSummary: counts, lintScore: lint.lintScore||0, overallScore: Number(overall.toFixed(2)) } }];\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a04d8968-8941-440f-bce7-21f42eca1771",
      "name": "Agrégation des statistiques de revue",
      "type": "n8n-nodes-base.function",
      "position": [
        320,
        0
      ],
      "parameters": {
        "functionCode": "const s = $json.lintSummary || {Critical:0, Major:0, Minor:0};\nconst overall = $json.overallScore || 0;\nreturn [{ json: { summary: s, overall, summaryText: `Critical:${s.Critical} Major:${s.Major} Minor:${s.Minor} / Score:${overall}` } }];\n"
      },
      "typeVersion": 1
    },
    {
      "id": "80ece42d-3536-4880-9a12-b745204e40b0",
      "name": "Publication du résumé de la revue",
      "type": "n8n-nodes-base.slack",
      "position": [
        832,
        0
      ],
      "webhookId": "43a4cf92-a74a-4e30-b59a-f0bcae7bef4a",
      "parameters": {
        "text": "={{ `✅ Code Review Completed\\n${$json.summaryText}` }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "<YOUR_SLACK_CHANNEL_ID>",
          "cachedResultName": "code-reviews"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.3
    },
    {
      "id": "9eb4292c-e03e-4e00-bbf5-8d6b19fb78e2",
      "name": "Aperçu du modèle (Avancé)",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1264,
        -368
      ],
      "parameters": {
        "width": 520,
        "height": 1120,
        "content": "## Advanced Code Review Automation (AI + Lint + Slack)\n\n### Who’s it for\nFor software engineers, QA teams, and tech leads who want to **automate intelligent code reviews** with both AI-driven suggestions and rule-based linting — all managed in Google Sheets with instant Slack summaries.\n\n### How it works\nThis workflow performs a two-layer review system:\n1. **Lint Check**: Runs a lightweight static analysis to find common issues (e.g., use of `var`, `console.log`, unbalanced braces).\n2. **AI Review**: Sends valid code to Gemini AI, which provides human-like review feedback with severity classification (`Critical`, `Major`, `Minor`) and visual highlights (red/orange tags).\n3. **Formatter**: Combines lint and AI results, calculating an overall score (0–10).\n4. **Aggregator**: Summarizes results for quick comparison.\n5. **Google Sheets Writer**: Appends results to your review log.\n6. **Slack Notification**: Posts a concise summary (e.g., number of issues and average score) to your team’s channel.\n\n### How to set up\n1. Connect **Google Sheets** and **Slack** credentials in n8n.\n2. Replace placeholders (`<YOUR_SPREADSHEET_ID>`, `<YOUR_SHEET_GID_OR_NAME>`, `<YOUR_SLACK_CHANNEL_ID>`).\n3. Adjust the AI review prompt or lint rules as needed.\n4. Activate the workflow — reviews will start automatically whenever new code is added to the sheet.\n\n### Requirements\n- Google Sheets and Slack integrations enabled\n- A configured AI node (Gemini, OpenAI, or compatible)\n- Proper permissions to write to your target Google Sheet\n\n### How to customize\n- Add more linting rules (naming conventions, spacing, forbidden APIs)\n- Extend the AI prompt for project-specific guidelines\n- Customize the Slack message formatting\n- Export analytics to a dashboard (e.g., Notion or Data Studio)\n\n### Why it’s valuable\nThis workflow brings **realistic, team-oriented AI-assisted code review** to n8n — combining the speed of automated linting with the nuance of human-style feedback. It saves time, improves code quality, and keeps your team’s review history transparent and centralized."
      },
      "typeVersion": 1
    },
    {
      "id": "3198d5f4-06c1-43a4-8e88-a76c9c67eff9",
      "name": "Note autocollante",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        96,
        176
      ],
      "parameters": {
        "content": "Add coding conventions and design documents as tools."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "64769cf0-2122-4615-a487-6ea7fc3dc2b1",
  "connections": {
    "b6dda288-7b1b-41a0-9e88-f8cadc6499b6": {
      "main": [
        [
          {
            "node": "8850c4ee-5296-4a3c-aaca-d6bd9d4bdde2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6cb8265d-a2a8-4542-80b6-358181a239ee": {
      "main": [
        [
          {
            "node": "b6dda288-7b1b-41a0-9e88-f8cadc6499b6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8850c4ee-5296-4a3c-aaca-d6bd9d4bdde2": {
      "main": [
        [
          {
            "node": "a04d8968-8941-440f-bce7-21f42eca1771",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a04d8968-8941-440f-bce7-21f42eca1771": {
      "main": [
        [
          {
            "node": "47c973ae-f613-4a3c-ba53-0166e9a617a0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "05ee83db-4b56-43ee-b153-3ba224393f88": {
      "ai_languageModel": [
        [
          {
            "node": "b6dda288-7b1b-41a0-9e88-f8cadc6499b6",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "47c973ae-f613-4a3c-ba53-0166e9a617a0": {
      "main": [
        [
          {
            "node": "2bab7e4b-daab-4a05-83bd-2b60465077e9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4af3c4b2-b7ad-407f-8ead-8509bde98b71": {
      "main": [
        [
          {
            "node": "6cb8265d-a2a8-4542-80b6-358181a239ee",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2bab7e4b-daab-4a05-83bd-2b60465077e9": {
      "main": [
        [
          {
            "node": "80ece42d-3536-4880-9a12-b745204e40b0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a4fd65ae-4f56-4b3a-be8c-29d2a0b171f8": {
      "ai_tool": [
        [
          {
            "node": "b6dda288-7b1b-41a0-9e88-f8cadc6499b6",
            "type": "ai_tool",
            "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é ?

Avancé - Ingénierie, Résumé IA

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é
Avancé
Nombre de nœuds16
Catégorie2
Types de nœuds9
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34