8
n8n 한국어amn8n.com

스프레드시트에서 빨간색 표시 수정을 포함한 코드 리뷰

고급

이것은Engineering, AI Summarization분야의자동화 워크플로우로, 16개의 노드를 포함합니다.주로 Set, Slack, Function, GoogleSheets, Agent 등의 노드를 사용하며. AI 기반 코드 리뷰로, 코드 검사, Google Sheets 빨간색 표시 수정 및 Slack 알림을 포함합니다.

사전 요구사항
  • Slack Bot Token 또는 Webhook URL
  • Google Sheets API 인증 정보
  • Google Gemini API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 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": "코드 입력 시트 모니터링",
      "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": "리뷰 결과 정형화",
      "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": "리뷰 결과 쓰기",
      "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": "AI 에이전트",
      "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 채팅 모델",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -176,
        224
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "a4fd65ae-4f56-4b3a-be8c-29d2a0b171f8",
      "name": "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": "시트 트리거 노트",
      "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 리뷰 노트",
      "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": "포맷팅 노트",
      "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": "출력 쓰기 노트",
      "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": "린트 검사",
      "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": "리뷰 출력 포맷팅",
      "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": "리뷰 통계 집계",
      "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": "리뷰 요약 게시",
      "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": "템플릿 개요 (고급)",
      "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": "스티커 노트",
      "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
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

이 워크플로우를 어떻게 사용하나요?

위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.

이 워크플로우는 어떤 시나리오에 적합한가요?

고급 - 엔지니어링, AI 요약

유료인가요?

이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
고급
노드 수16
카테고리2
노드 유형9
난이도 설명

고급 사용자를 위한 16+개 노드의 복잡한 워크플로우

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34