AI-Powered Code Review with Linting, Red-Marked Corrections in Google Sheets & Slack

Experte

Dies ist ein Engineering, AI Summarization-Bereich Automatisierungsworkflow mit 16 Nodes. Hauptsächlich werden Set, Slack, Function, GoogleSheets, Agent und andere Nodes verwendet.

Voraussetzungen
  • Slack Bot Token oder Webhook URL
  • Google Sheets API-Anmeldedaten
  • Google Gemini API Key
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
  "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": "Code-Eingabeblatt überwachen",
      "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": "Review-Ergebnisse formatieren",
      "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": "Review-Ergebnisse schreiben",
      "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": "KI-Agent",
      "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": "Zeile(n) in Google Sheets abrufen",
      "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": "Sheet Trigger Note",
      "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": "AI Review Note",
      "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": "Formatting Note",
      "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": "Write Output Note",
      "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": "Lint Check",
      "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": "Format Review Output",
      "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": "Review-Statistiken aggregieren",
      "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": "Review-Zusammenfassung veröffentlichen",
      "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": "Template Overview (Advanced)",
      "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": "Sticky Note",
      "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
          }
        ]
      ]
    }
  }
}
Häufig gestellte Fragen

Wie verwende ich diesen Workflow?

Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.

Für welche Szenarien ist dieser Workflow geeignet?

Experte - Engineering, KI-Zusammenfassung

Ist es kostenpflichtig?

Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.

Workflow-Informationen
Schwierigkeitsgrad
Experte
Anzahl der Nodes16
Kategorie2
Node-Typen9
Schwierigkeitsbeschreibung

Für fortgeschrittene Benutzer, komplexe Workflows mit 16+ Nodes

Externe Links
Auf n8n.io ansehen

Diesen Workflow teilen

Kategorien

Kategorien: 34