Revisión de código con correcciones marcadas en rojo en hojas de cálculo

Avanzado

Este es unEngineering, AI Summarizationflujo de automatización del dominio deautomatización que contiene 16 nodos.Utiliza principalmente nodos como Set, Slack, Function, GoogleSheets, Agent. Revisión de código impulsada por IA, incluyendo verificación de código, correcciones marcadas en rojo en Google Sheets y notificaciones en Slack

Requisitos previos
  • Bot Token de Slack o URL de Webhook
  • Credenciales de API de Google Sheets
  • Clave de API de Google Gemini
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "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": "Monitoreo de hoja de entrada de código",
      "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": "Formateo de resultados de revisión",
      "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": "Escritura de resultados de revisión",
      "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": "Agente de 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": "Obtener fila(s) en hoja en 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": "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": "Agregar estadísticas de revisión",
      "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": "Publicar resumen de revisión",
      "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": "Descripción general de plantilla (Avanzado)",
      "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
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Avanzado - Ingeniería, Resumen de IA

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Información del flujo de trabajo
Nivel de dificultad
Avanzado
Número de nodos16
Categoría2
Tipos de nodos9
Descripción de la dificultad

Adecuado para usuarios avanzados, flujos de trabajo complejos con 16+ nodos

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34