스프레드시트에서 빨간색 표시 수정을 포함한 코드 리뷰
고급
이것은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
사용된 노드 (16)
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 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)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
AI 필터를 통한 개인화된 학습 콘텐츠 모음기
GPT-4.1-mini와 Google Sheets를 사용하여 Reddit와 RSS에서 학습 내용을 필터링
Set
Code
Merge
+
Set
Code
Merge
18 노드higashiyama
시장 조사
RSS 피드 스마트 허브 및 매일 Slack 요약
Gemini AI를 사용한 RSS 피드 뉴스 인텔리전스 자동화, Notion 및 Slack으로 푸시
Set
Code
Sort
+
Set
Code
Sort
29 노드Takuya Ojima
시장 조사
이메일 스캔과 Google 스프레드시트 구매 주문 생성
Gemini AI를 사용하여 Gmail에서 구매 주문을 추출하고 Google 스프레드시트에 저장
If
Set
Code
+
If
Set
Code
15 노드Sayone Technologies
문서 추출
시각화 참조 라이브러리에서 n8n 노드를 탐색
可视化 참조 라이브러리에서 n8n 노드를 탐색
If
Ftp
Set
+
If
Ftp
Set
113 노드I versus AI
기타
뮤직 생성 워크플로우
Suno API, Flux, Runway 및 Creatomate를 사용하여 AI 노래 및 음악 비디오 생성
Set
Wait
Merge
+
Set
Wait
Merge
60 노드Joseph
기타
第一轮 Telegram 및 LinkedIn 快速通道 AI 招聘어시스턴트
AI候选人筛选流程:LinkedIn로Telegram,통합Gemini与Apify
If
Set
Code
+
If
Set
Code
55 노드Dean Pike
인사