スプレッドシートでの赤マーク修正を伴うコードレビュー
上級
これはEngineering, AI Summarization分野の自動化ワークフローで、16個のノードを含みます。主にSet, Slack, Function, GoogleSheets, Agentなどのノードを使用。 AI駆動のコードレビューで、コードチェック、Googleスプレッドシートの赤マーク修正、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 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": "Get row(s) in sheet in 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": "Aggregate Review Stats",
"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": "Post Review Summary",
"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
}
]
]
}
}
}よくある質問
このワークフローの使い方は?
上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。
このワークフローはどんな場面に適していますか?
上級 - エンジニアリング, AI要約
有料ですか?
このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。
関連ワークフロー
AI によるフィルタリングされた個別化学習コンテンツアggregator
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スプレッドシートによる購入オーダーの作成
Gmailから購入オーダーをGemini AIで抽出して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
人事