OpenAI와 Google Sheets를 사용하여 트랜스크립션 텍스트에서 스프린트 리뷰 요약을 생성
중급
이것은Project Management, AI Summarization분야의자동화 워크플로우로, 13개의 노드를 포함합니다.주로 Code, Form, FormTrigger, GoogleSheets, Agent 등의 노드를 사용하며. OpenAI와 Google Sheets를 사용하여 트랙션 텍스트에서 스프린트 리뷰 요약 생성
사전 요구사항
- •Google Sheets API 인증 정보
- •OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"meta": {
"instanceId": "51c6a64ef13fda2e6aa96576c25d72519ca4bc44cea9da20af60a642b594d835",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "155c6cd6-3c71-4399-9f1a-3f6c52c3a384",
"name": "스프린트 리뷰 입력 수집",
"type": "n8n-nodes-base.formTrigger",
"position": [
-320,
-64
],
"webhookId": "610911dc-0778-4270-a571-9aa90143f00a",
"parameters": {
"options": {
"buttonLabel": "Create Summary"
},
"formTitle": "Sprint Review Summary",
"formFields": {
"values": [
{
"fieldType": "file",
"fieldLabel": "Transcript file",
"multipleFiles": false
},
{
"fieldLabel": "Sprint name"
},
{
"fieldType": "dropdown",
"fieldLabel": "Domain",
"fieldOptions": {
"values": [
{
"option": "Team 1"
},
{
"option": "Team 2"
},
{
"option": "Team 3"
}
]
}
}
]
}
},
"typeVersion": 2.2
},
{
"id": "7f8b7ce6-d1d9-4961-93b6-22edb0e3c31a",
"name": "트랜스크립트 파싱",
"type": "n8n-nodes-base.code",
"position": [
-16,
-64
],
"parameters": {
"jsCode": "const binaryKey = Object.keys(items[0].binary || {})[0];\nif (!binaryKey) {\n throw new Error('No binary data found. Please upload a transcript file.');\n}\nconst binaryData = items[0].binary[binaryKey];\nconst txtContent = Buffer.from(binaryData.data, 'base64').toString('utf-8');\nconst lines = txtContent.split('\\n');\nlet transcriptWithTimestamps = [];\nif (txtContent.startsWith('WEBVTT')) {\n let currentTimestamp = null;\n let currentText = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n const ts = line.match(/^(\\d{2}:\\d{2}:\\d{2}\\.\\d{3}) --> (\\d{2}:\\d{2}:\\d{2}\\.\\d{3})$/);\n if (ts) {\n if (currentTimestamp && currentText.length) {\n transcriptWithTimestamps.push(`[${currentTimestamp}] Unknown: ${currentText.join(' ').trim()}`);\n }\n currentTimestamp = ts[1];\n currentText = [];\n } else if (line !== '' && !line.startsWith('WEBVTT')) {\n currentText.push(line);\n }\n }\n if (currentTimestamp && currentText.length) {\n transcriptWithTimestamps.push(`[${currentTimestamp}] Unknown: ${currentText.join(' ').trim()}`);\n }\n} else {\n let currentSpeaker = null;\n let currentTimestamp = null;\n let currentText = [];\n for (let i = 0; i < lines.length; i++) {\n const m = lines[i].match(/^\\[([^\\]]+)\\]\\s+(\\d{2}:\\d{2}:\\d{2})(.*)$/);\n if (m) {\n if (currentSpeaker && currentTimestamp && currentText.length) {\n transcriptWithTimestamps.push(`[${currentTimestamp}] ${currentSpeaker}: ${currentText.join(' ').trim()}`);\n }\n currentSpeaker = m[1];\n currentTimestamp = m[2];\n currentText = m[3] ? [m[3].trim()] : [];\n } else if (lines[i].trim() !== '') {\n currentText.push(lines[i].trim());\n }\n }\n if (currentSpeaker && currentTimestamp && currentText.length) {\n transcriptWithTimestamps.push(`[${currentTimestamp}] ${currentSpeaker}: ${currentText.join(' ').trim()}`);\n }\n}\nitems[0].json.transcriptWithTimestamps = transcriptWithTimestamps.join('\\n');\nreturn items;"
},
"typeVersion": 2
},
{
"id": "86aa481e-f7aa-40f1-8f45-1d2ffea43d5a",
"name": "요약 생성",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
272,
-64
],
"parameters": {
"text": "=You are an expert Agile coach. Summarize the following Sprint Review transcript related to the domain: {{ $json.Domain }} and sprint: {{ $json['Sprint name'] }}.\n\nRequirements:\n- Output strictly in Markdown.\n- add header title\n- Start with concise summary\n- Then a brief executive summary (3–5 bullets).\n- Then a **Presentation recap** table with columns: Timestamp | Presenter | Topics.\n- Finish with **Action items** as a checklist with owners if recognizable.\n- keep format clean with headers for each sections\n\nTranscript:\n{{ $json.transcriptWithTimestamps }}\n\n\n\n",
"options": {},
"promptType": "define"
},
"typeVersion": 2.1
},
{
"id": "1fb90118-9077-4488-9ab1-efbfffc23736",
"name": "요약 미리보기",
"type": "n8n-nodes-base.form",
"position": [
816,
-144
],
"webhookId": "c9b09c5d-a618-4ee0-a494-552f853306be",
"parameters": {
"options": {
"customCss": ".card {\n\tposition: relative;\n\tmax-width: 500px;\n\tmargin: 20px auto;\n\tpadding: 20px;\n\tbackground: #fefefe !important;\n\tborder-radius: 12px;\n\tbox-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n\tfont-family: 'Courier New', monospace;\n\tcolor: #1f2937;\n\tfont-size: 16px;\n\tline-height: 1.6;\n\twhite-space: pre-wrap;\n}\n\n.header p { text-align: left; }\n\n@media (max-width: 768px) {\n\t.card { margin: 10px !important; padding: 15px !important; font-size: 14px; }\n}\n"
},
"operation": "completion",
"completionTitle": "Summary",
"completionMessage": "={{ $json.output }}"
},
"typeVersion": 1
},
{
"id": "70b492a1-5674-4a79-9ae1-6a773b494ec9",
"name": "OpenAI LLM",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
272,
160
],
"parameters": {
"model": {
"mode": "list",
"value": "gpt-5-mini-2025-08-07"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "7CgAvVK5FzY7W0vB",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "adb94eee-700f-48af-b4c5-3298e87bfeb4",
"name": "Google Sheets에 저장",
"type": "n8n-nodes-base.googleSheets",
"position": [
816,
48
],
"parameters": {
"columns": {
"value": {
"Date": "={{ $('Parse Transcript').item.json.submittedAt }}",
"Domain": "={{ $('Parse Transcript').item.json.Domain }}",
"Content": "={{ $json.output }}",
"VTT file": "={{ $('Parse Transcript').item.json['Transcript file'].filename }}",
"Transcript": "={{ $('Parse Transcript').item.json.transcriptWithTimestamps }}",
"Sprint name": "={{ $('Parse Transcript').item.json['Sprint name'] }}"
},
"schema": [
{
"id": "Date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Domain",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Domain",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sprint name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Sprint name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Content",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Content",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "VTT file",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "VTT file",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Transcript",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Transcript",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "output",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "output",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Date"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/your sheetlink",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1rNGViGRvVgIol0mJzsShXF7h21TC6L3eKt4R8i21AG4",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rNGViGRvVgIol0mJzsShXF7h21TC6L3eKt4R8i21AG4/edit?usp=drivesdk",
"cachedResultName": "Sprint Review Summary"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "2wOj5Yn1ya1ZE298",
"name": "Google Sheets Personal"
}
},
"typeVersion": 4.6
},
{
"id": "d884f161-0977-46a2-8b0b-f59c9a97b942",
"name": "스티커: 개요1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-464,
-336
],
"parameters": {
"width": 256,
"height": 240,
"content": "## Overview\nSprint Review Transcript → AI Markdown Summary → Google Sheets\nInputs: File (VTT/text), Sprint name, Domain.\nOutputs: Preview in UI + archived row in Sheet."
},
"typeVersion": 1
},
{
"id": "2886f243-599a-4328-a889-cf57d1b171b7",
"name": "스티커: 입력 양식1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-464,
112
],
"parameters": {
"content": "## Input Form\nCollects transcript file + sprint + domain."
},
"typeVersion": 1
},
{
"id": "d201c8f4-cbf7-475e-80ce-329d020862eb",
"name": "스티커: 파서1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
-336
],
"parameters": {
"height": 192,
"content": "## Transcript Parser\nNormalizes to `[HH:MM:SS] Speaker: text`.\nSupports VTT and simple speaker/timestamp lines."
},
"typeVersion": 1
},
{
"id": "1f1c40ee-cd8f-4899-b0eb-9bef6e59e1e3",
"name": "스티커: AI 요약1",
"type": "n8n-nodes-base.stickyNote",
"position": [
256,
-320
],
"parameters": {
"content": "## AI Summary\nCreates executive bullets, recap table, and action items in Markdown."
},
"typeVersion": 1
},
{
"id": "946883d1-348d-4f49-9caa-ffad446422d2",
"name": "스티커: 미리보기1",
"type": "n8n-nodes-base.stickyNote",
"position": [
784,
-272
],
"parameters": {
"height": 256,
"content": "## Preview\nShows the generated Markdown with custom CSS."
},
"typeVersion": 1
},
{
"id": "147f0d86-0272-41a7-a447-9cb8d1a9c0f4",
"name": "스티커: Sheets1",
"type": "n8n-nodes-base.stickyNote",
"position": [
784,
224
],
"parameters": {
"content": "## Archive to Sheets\nSaves summary + transcript + metadata (date/domain/sprint/file)."
},
"typeVersion": 1
},
{
"id": "e38cebcc-793b-48cb-a1ee-3ae85d8ac289",
"name": "스티커: LLM1",
"type": "n8n-nodes-base.stickyNote",
"position": [
192,
288
],
"parameters": {
"content": "## LLM Backend\nOpenAI Chat Model used by AI Agent."
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"70b492a1-5674-4a79-9ae1-6a773b494ec9": {
"ai_languageModel": [
[
{
"node": "86aa481e-f7aa-40f1-8f45-1d2ffea43d5a",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"86aa481e-f7aa-40f1-8f45-1d2ffea43d5a": {
"main": [
[
{
"node": "1fb90118-9077-4488-9ab1-efbfffc23736",
"type": "main",
"index": 0
},
{
"node": "adb94eee-700f-48af-b4c5-3298e87bfeb4",
"type": "main",
"index": 0
}
]
]
},
"7f8b7ce6-d1d9-4961-93b6-22edb0e3c31a": {
"main": [
[
{
"node": "86aa481e-f7aa-40f1-8f45-1d2ffea43d5a",
"type": "main",
"index": 0
}
]
]
},
"155c6cd6-3c71-4399-9f1a-3f6c52c3a384": {
"main": [
[
{
"node": "7f8b7ce6-d1d9-4961-93b6-22edb0e3c31a",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - 프로젝트 관리, AI 요약
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
[astro/nextjs] 글/게시물에 카테고리/태그 할당
OpenAI GPT-4, GitHub, Google Sheets로 Astro/Next.js 블로그 게시물 자동 분류
Code
Form
Merge
+
Code
Form
Merge
29 노드Piotr Sikora
콘텐츠 제작
转录 텍스트에서 회의 작업 추출하여 Trello와 동기화
AI를 사용하여 기록된 텍스트에서 회의 작업을 추출하고 Trello로 동기화합니다
Form
Trello Tool
Form Trigger
+
Form
Trello Tool
Form Trigger
18 노드Gabriel Santos
프로젝트 관리
HireMind – AI 기반 이력서 지능형 처리 워크플로우
HR AI 이력서 선별 및 평가: GPT-4 및 Google Workspace
If
Code
Slack
+
If
Code
Slack
26 노드Trung Tran
인사
Gemini와 Jina AI를 사용한 공급업체 실사 연구 자동화
Gemini 및 Jina AI를 사용한 공급업체 실사 조사 자동화
If
Set
Code
+
If
Set
Code
27 노드Adnan
문서 추출
TalentFlow AI - 배치 이력서 필터링 및 직업 설명 매칭
GPT-4를 사용하여 HR 팀의 대량 이력서 필터링 및 직위 설명 매칭
If
Code
Merge
+
If
Code
Merge
30 노드Trung Tran
인사
Bright Data MCP와 AIAgents를 사용하여 소셜 미디어 자료 검색 및 분석
AI를 사용하여 360도 소셜 미디어 보고서 - Bright Data MCP 생성
Set
Code
Form
+
Set
Code
Form
50 노드Romuald Członkowski
리드 생성