OpenAI를 사용하여 Google Sheets에서 고객 피드백을 자동으로 표시하고 분석
고급
이것은Market Research, AI Summarization분야의자동화 워크플로우로, 24개의 노드를 포함합니다.주로 Set, Code, Merge, GoogleSheets, ManualTrigger 등의 노드를 사용하며. Google Sheets에서 배치로 고객 피드백 처리, 감정과 감정 분석
사전 요구사항
- •Google Sheets API 인증 정보
- •OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "vt26lV2qI3OlOvin",
"meta": {
"instanceId": "a970479b9b937d4c4802e373a8116e0d4e6c86989709fbee9c5a38c7f63fd033"
},
"name": "Auto-tag and analyze customer feedback in Google Sheets with OpenAI",
"tags": [
{
"id": "GCoQbohMyJ7ZU01a",
"name": "Customer Support",
"createdAt": "2025-10-18T17:05:33.588Z",
"updatedAt": "2025-10-18T17:05:33.588Z"
},
{
"id": "nNjwOWFKi8QHbVYy",
"name": "User Experience",
"createdAt": "2025-10-18T17:05:19.693Z",
"updatedAt": "2025-10-18T17:05:19.693Z"
}
],
"nodes": [
{
"id": "20d919c3-088c-4748-bf11-31a8f1490c24",
"name": "'워크플로 실행' 클릭 시",
"type": "n8n-nodes-base.manualTrigger",
"position": [
1616,
288
],
"parameters": {},
"typeVersion": 1
},
{
"id": "d9064168-bf99-4066-89a7-0dbe19c8f3ae",
"name": "허용 태그 가져오기",
"type": "n8n-nodes-base.googleSheets",
"position": [
2464,
272
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Tags"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "=GOOGLE_SHEETS_URL"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "YOUR_CREDENTIAL_ID",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "7f0ee6a9-cfd1-449d-96c7-5dcd180fc152",
"name": "새 피드백 가져오기",
"type": "n8n-nodes-base.googleSheets",
"position": [
2464,
1152
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupColumn": "Status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Feedbacks"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "=GOOGLE_SHEETS_URL"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "YOUR_CREDENTIAL_ID",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "dcf3888e-b2f4-4d35-acc2-48798368aee2",
"name": "태그 및 피드백 병합",
"type": "n8n-nodes-base.merge",
"position": [
3136,
720
],
"parameters": {
"mode": "chooseBranch"
},
"typeVersion": 2.1
},
{
"id": "086461e1-dc56-412a-a073-740af265b83e",
"name": "태그 배열 첨부",
"type": "n8n-nodes-base.set",
"position": [
3552,
736
],
"parameters": {
"values": {
"string": [
{
"name": "tags",
"value": "={{ $items('Fetch Allowed Tags').map(i => i.json['Tags']) }}"
}
]
},
"options": {}
},
"typeVersion": 2
},
{
"id": "bce8aee5-89f5-423c-89f9-b6b0705a3d50",
"name": "AI로 피드백 태깅",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
4784,
880
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {},
"messages": {
"values": [
{
"role": "system",
"content": "=You are a tagging, sentiment, and emotion analysis assistant. \n\nInput format:\n- You will receive multiple feedbacks in an array under `feedbacks`.\n- Each feedback item has: `row_number` and `text`.\n- Feedback text may be multilingual (e.g., Persian/Farsi). Analyze natively.\n- You will also receive an `allowed_tags` array (may be empty).\n\nGeneral rules:\n- Analyze each feedback independently.\n- Detect and describe emotional tone naturally.\n- Identify one **primary emotion** that captures the dominant feeling.\n- Optionally include up to two **secondary emotions** that reflect additional nuances.\n- Output must be a **valid JSON array** only, with **no extra text** before or after.\n- Maintain the original input order.\n\n⚠️ CRITICAL TAGGING RULES (2-tier system with STRONG preference for allowed_tags):\n\n**TIER 1: ALWAYS TRY ALLOWED TAGS FIRST (Your Primary Responsibility)**\n- If `allowed_tags` is provided, you MUST thoroughly examine it for matches.\n- **Be creative and flexible in matching:**\n - Look for direct matches (e.g., \"Bug\" for bug reports)\n - Look for semantic matches (e.g., \"Payment\" tag for \"billing issue\" feedback)\n - Look for category matches (e.g., \"Performance\" for \"slow\", \"lag\", \"loading\")\n - Look for broader themes (e.g., \"User Experience\" for usability complaints)\n- **Think broadly:** A tag doesn't need to be a perfect word-for-word match.\n- Consider the **intent and topic** of the feedback, not just exact keywords.\n- Return up to **3** most relevant tags from `allowed_tags` (sorted by relevance).\n- **Only proceed to Tier 2 if you genuinely cannot find ANY relevant match** after careful analysis.\n\n**TIER 2: AI-Generated Tags (ONLY as a last resort)**\n- Use this ONLY when:\n - `allowed_tags` is completely empty, OR\n - After thorough analysis, absolutely NO tag in `allowed_tags` relates to the feedback topic\n- Generate up to **2 custom, descriptive tags** (short labels like \"UI Bug\", \"Pricing Question\").\n- Put these in `ai_tag_1` and `ai_tag_2`.\n- Use \"\" for empty AI tag fields.\n\n**Decision Flow:**\n1. Read the feedback carefully\n2. Review ALL allowed_tags thoroughly\n3. Can you match any tag semantically or thematically? → YES = Use allowed tags, set ai_tag_1=\"\", ai_tag_2=\"\"\n4. Still no match after careful review? → Use AI tags as fallback\n\nSentiment scale (choose one):\n[\"Very Negative\", \"Negative\", \"Neutral\", \"Positive\", \"Very Positive\"].\n\nEmotions:\n- primary_emotion: one clear emotional label (e.g., \"anger\", \"hope\", \"disappointment\", \"relief\", \"satisfaction\", \"gratitude\").\n- secondary_emotion: optional supporting emotional state (e.g., \"frustration\", \"trust\", \"curiosity\", \"anxiety\"). Use \"\" if none applies.\n\nResponse JSON schema (use exactly these keys):\n[\n {\n \"row_number\": <row_number from input>,\n \"tags\": [\"tag_from_allowed_list_1\", \"tag_from_allowed_list_2\"],\n \"ai_tag_1\": \"\",\n \"ai_tag_2\": \"\",\n \"sentiment\": \"Positive\",\n \"primary_emotion\": \"Gratitude\",\n \"secondary_emotion\": \"Relief\"\n }\n]\n\nExamples of GOOD matching behavior:\n✅ Feedback: \"The app crashes constantly\" + allowed_tags: [\"Bug\", \"Stability\", \"Feature\"] → tags: [\"Bug\", \"Stability\"]\n✅ Feedback: \"Can't complete checkout\" + allowed_tags: [\"Payment\", \"Technical Issue\", \"UI\"] → tags: [\"Payment\", \"Technical Issue\"]\n✅ Feedback: \"Love the new design!\" + allowed_tags: [\"Design\", \"Positive Feedback\", \"UI\"] → tags: [\"Design\", \"Positive Feedback\"]\n✅ Feedback: \"Too expensive for what it offers\" + allowed_tags: [\"Pricing\", \"Value\", \"Feature Request\"] → tags: [\"Pricing\", \"Value\"]\n\nExamples of when to use AI tags:\n❌ Feedback: \"Bug in login\" + allowed_tags: [] → tags: [], ai_tag_1: \"Authentication Bug\", ai_tag_2: \"Login\"\n❌ Feedback: \"Need dark mode\" + allowed_tags: [\"Pricing\", \"Support\", \"Payment\"] → tags: [], ai_tag_1: \"Feature Request\", ai_tag_2: \"UI Customization\"\n\nConstraints:\n- **STRONGLY PREFER allowed_tags** - exhaust all matching possibilities first\n- Do **not** invent tags in the `tags` array — only use exact names from `allowed_tags`\n- Generate creative tags for `ai_tag_1` and `ai_tag_2` ONLY when truly necessary\n- Use ASCII keys exactly as shown. Values must be strings or arrays of strings\n- Do not include reasoning, markdown, or comments — **JSON array only**"
},
{
"content": "={{ JSON.stringify({\n allowed_tags: $json.tags,\n feedbacks: $json.feedbackBatch\n}) }}"
}
]
}
},
"credentials": {
"openAiApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "OpenAi account"
}
},
"typeVersion": 1.8
},
{
"id": "ac43582f-ba7e-4941-91d1-e48ecb7e1944",
"name": "Google 시트 업데이트 (태깅됨)",
"type": "n8n-nodes-base.googleSheets",
"position": [
5760,
1024
],
"parameters": {
"columns": {
"value": {
"Tag 1": "={{ $json.tags[0] || ''}}",
"Tag 2": "={{ $json.tags[1] || ''}}",
"Tag 3": "={{ $json.tags[2] || ''}}",
"Status": "={{ $json.tags && $json.tags.length > 0 ? 'Updated' : 'Needs Review' }}",
"AI Tag 1": "={{ $json.ai_tag_1 }}",
"AI Tag 2": "={{ $json.ai_tag_2 }}",
"Sentiment": "={{ $json.sentiment }}",
"row_number": "={{ $json.row_number }}",
"Primary Emotion": "={{ $json.primary_emotion }}",
"Secondary Emotion": "={{ $json.secondary_emotion }}",
"Updated Date (N8N)": "={{ new Date().toISOString().split('T')[0] }}"
},
"schema": [
{
"id": "Sentiment",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Sentiment",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Feedbacks",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Feedbacks",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tag 1",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Tag 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tag 2",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Tag 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tag 3",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Tag 3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Tag 1",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "AI Tag 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Tag 2",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "AI Tag 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Primary Emotion",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Primary Emotion",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Secondary Emotion",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Secondary Emotion",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Updated Date (N8N)",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Updated Date (N8N)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "=Feedbacks"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "=GOOGLE_SHEETS_URL"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "YOUR_CREDENTIAL_ID",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "1234a97c-f663-454c-abd7-9e64b3098ef4",
"name": "피드백 일괄 처리",
"type": "n8n-nodes-base.splitInBatches",
"position": [
3936,
848
],
"parameters": {
"options": {},
"batchSize": "=10"
},
"typeVersion": 3
},
{
"id": "12824491-a5d8-42ba-b602-5ad577d0108c",
"name": "배치 항목 집계",
"type": "n8n-nodes-base.code",
"position": [
4352,
864
],
"parameters": {
"jsCode": "// Aggregate all items in the current batch into a single item\nconst feedbackBatch = $input.all().map((item, index) => ({\n id: index,\n row_number: item.json.row_number,\n text: item.json.Feedbacks\n}));\n\nconst tags = $input.first().json.tags;\n\nreturn {\n json: {\n feedbackBatch,\n tags\n }\n};"
},
"typeVersion": 2
},
{
"id": "54ebf56d-27ec-411d-9973-10a717921e47",
"name": "배치 결과 분할",
"type": "n8n-nodes-base.code",
"position": [
5312,
864
],
"parameters": {
"jsCode": "// Parse the OpenAI response and split it back into individual items\nconst response = JSON.parse($input.first().json.message.content);\n\n// Handle both array format and object with results property\nconst results = Array.isArray(response) ? response : response.results || [];\n\nreturn results.map(result => ({\n json: {\n row_number: result.row_number,\n tags: result.tags || [],\n sentiment: result.sentiment || \"\",\n ai_tag_1: result.ai_tag_1 || \"\",\n ai_tag_2: result.ai_tag_2 || \"\",\n primary_emotion: result.primary_emotion || \"\",\n secondary_emotion: result.secondary_emotion || \"\"\n }\n}));"
},
"typeVersion": 2
},
{
"id": "3240b804-444e-42ce-b594-166a7f41db4f",
"name": "스티키 노트",
"type": "n8n-nodes-base.stickyNote",
"position": [
640,
16
],
"parameters": {
"width": 768,
"height": 976,
"content": "## 💬 **Auto-tag customer feedback in Google Sheets with OpenAI sentiment analysis**\n\nThis workflow automatically tags user feedback stored in Google Sheets using OpenAI with sentiment and emotion analysis. \nIt reads new feedback, analyzes them in **batches** with a single AI call, and returns relevant tags with detailed insights.\n\n---\n\n### 🧠 What It Does\n- Fetches **allowed tags** from a Tags Sheet \n- Reads **new feedback** (Status = empty) from a Feedbacks Sheet \n- **Sends entire batches (e.g., 10 items) to OpenAI as a single request** 🚀\n- Returns up to **3 most relevant tags** from allowed list (or AI-generated tags as fallback)\n- Analyzes **sentiment** (Very Negative to Very Positive)\n- Detects **emotions** (primary & secondary feelings)\n- Writes all results back to Google Sheets (tags, sentiment, emotions, status, timestamp)\n\n---\n\n### 🚀 How to Set Up \n1. Duplicate the provided [Google Sheet template](https://docs.google.com/spreadsheets/d/1y7B3u5vgQLDidf-NdfPgAiBuQxP9Qa7RvdgsTPG14Fs/edit?usp=sharing).\n2. Connect your **Google Sheets** and **OpenAI** credentials in n8n. \n3. Update the Sheet URLs in the **Fetch Allowed Tags**, **Fetch New Feedbacks**, and **Update Google Sheet** nodes. \n4. Run manually with the **Manual Trigger** or enable the **Schedule Trigger** (runs every 60 minutes). \n\n---\n\n### 🎨 How to Customize \n- Adjust the **System Prompt** in the \"Tag Feedbacks with AI\" node to change tagging rules. \n- Edit the **batch size** (default: 10) in the \"Process Feedbacks in Batches\" node for performance optimization. \n- Change the **schedule interval** in the \"Schedule Trigger\" node (default: 60 minutes). \n- Extend the workflow to send results to Notion, Slack, or Airtable for real-time reporting.\n\n---\n\n#### 💡 Example Use Case\nIdeal for product and research teams who collect customer feedback and want to categorize it automatically into clear, actionable topics with sentiment and emotional insights."
},
"typeVersion": 1
},
{
"id": "22e35300-b79f-4b21-b2fb-47ee274141e2",
"name": "일정 트리거",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
1600,
832
],
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 60
}
]
}
},
"typeVersion": 1.2
},
{
"id": "beb9af83-71d0-4cf1-8c33-3d891564d0ba",
"name": "스티키 노트2",
"type": "n8n-nodes-base.stickyNote",
"position": [
2240,
80
],
"parameters": {
"color": 4,
"width": 560,
"height": 352,
"content": "### 🏷️ **Fetch Allowed Tags**\n\nReads the list of available tag names from your **Tags Sheet**. \nEach tag is stored in an array and later passed to OpenAI as `allowed_tags`.\n\n✅ Make sure your Tags sheet has a single column named `Tags`."
},
"typeVersion": 1
},
{
"id": "cc4985d4-7dfd-4efb-965c-125f3ed881c9",
"name": "스티키 노트3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2256,
672
],
"parameters": {
"color": 4,
"width": 560,
"height": 656,
"content": "## 💬 **Fetch New Feedbacks**\n\nReads feedback entries from **Feedbacks Sheet** where `Status` is empty.\n\n### Expected Columns\n- **Feedbacks:** The feedback text\n- **Status:** Empty = new | \"Updated\" = tagged | \"Needs Review\" = no tags found\n- **Tag 1, Tag 2, Tag 3:** Up to 3 tags from allowed list\n- **AI Tag 1, AI Tag 2:** Fallback tags when no allowed tags match\n- **Sentiment:** Very Negative to Very Positive\n- **Primary Emotion:** Dominant feeling (e.g., frustration, gratitude)\n- **Secondary Emotion:** Optional secondary feeling\n- **Updated Date (N8N):** Processing timestamp\n\n✅ All columns must exist with exact names."
},
"typeVersion": 1
},
{
"id": "f91dc3c9-4fc3-4f78-8cc2-f0e4a777d2e5",
"name": "스티키 노트4",
"type": "n8n-nodes-base.stickyNote",
"position": [
4656,
544
],
"parameters": {
"color": 6,
"width": 448,
"height": 480,
"content": "## 🤖 **Tag Feedbacks with OpenAI**\n\nSends entire batch (10 items) as ONE OpenAI request. 🚀\n\n**Output per feedback:**\n- Up to 3 tags from allowed_tags (preferred)\n- Up to 2 AI-generated tags (fallback only)\n- Sentiment: Very Negative to Very Positive\n- Primary & secondary emotions\n- Multilingual support (including Persian/Farsi)\n\n✅ Returns valid JSON array."
},
"typeVersion": 1
},
{
"id": "a8f0f7a3-2c1a-4e8f-a2f0-295cf7332b24",
"name": "스티키 노트5",
"type": "n8n-nodes-base.stickyNote",
"position": [
5648,
656
],
"parameters": {
"color": 4,
"width": 336,
"height": 576,
"content": "## 📊 **Update Google Sheet (Tagged)**\n\nUpdates **Feedbacks Sheet** with:\n- `Tag 1-3` (from allowed list)\n- `AI Tag 1-2` (fallback tags)\n- `Sentiment`\n- `Primary Emotion` & `Secondary Emotion`\n- `Status` (\"Updated\" or \"Needs Review\")\n- `Updated Date (N8N)`\n\n✅ Ensure columns exist with exact names."
},
"typeVersion": 1
},
{
"id": "1a484a39-d4ad-4bb5-8a91-81aea0b218f1",
"name": "스티키 노트6",
"type": "n8n-nodes-base.stickyNote",
"position": [
3840,
544
],
"parameters": {
"color": 7,
"width": 320,
"height": 480,
"content": "## 🔁 **Split In Batches**\n\nBreaks large feedback lists into smaller batches to avoid API rate limits. \nAfter each batch is processed, the loop continues automatically until all rows are tagged.\n\n💡 Default batch size = 10 (you can adjust in config sheet)."
},
"typeVersion": 1
},
{
"id": "e97af0f1-1446-4c9a-9363-cb2674a1d211",
"name": "스티키 노트7",
"type": "n8n-nodes-base.stickyNote",
"position": [
3040,
368
],
"parameters": {
"color": 7,
"width": 320,
"height": 512,
"content": "## 🔗 **Merge Tags & Feedbacks**\n\nThis node combines two input streams:\n- **Input 1:** Feedback items fetched from the Feedbacks Sheet \n- **Input 2:** Allowed tag list fetched from the Tags Sheet \n\nMode: `Choose Branch` \nOutput: Keeps Feedback data (Input 1) while waiting for Tags (Input 2) to arrive. \nEnsures each feedback item can access the full tag list before analysis."
},
"typeVersion": 1
},
{
"id": "20a6d6be-273c-48db-9a53-6dab6a0d6318",
"name": "스티키 노트8",
"type": "n8n-nodes-base.stickyNote",
"position": [
3440,
544
],
"parameters": {
"color": 7,
"width": 320,
"height": 336,
"content": "## 🧩 **Attach Tags Array**\n\nAdds the list of tags from the Tags Sheet to each feedback item. \nThe result includes a field named `tags`, used by OpenAI for tagging."
},
"typeVersion": 1
},
{
"id": "640e7cd5-b2a8-4b5e-9b38-4b0e6f7f583a",
"name": "스티키 노트9",
"type": "n8n-nodes-base.stickyNote",
"position": [
1488,
80
],
"parameters": {
"color": 7,
"width": 352,
"height": 368,
"content": "## 🖱️ **Manual Trigger**\n\nRuns the workflow manually when you click **\"Execute Workflow\"** inside n8n. \nUse this for quick testing or when setting up new credentials and connections.\n\n💡 Best for testing small batches before enabling the automatic schedule."
},
"typeVersion": 1
},
{
"id": "d9ac75a8-f4e1-463b-83ce-2c41519f38c3",
"name": "스티키 노트10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1488,
656
],
"parameters": {
"color": 7,
"width": 352,
"height": 336,
"content": "## ⏰ **Schedule Trigger**\n\nRuns every **60 minutes** automatically.\n\nProcesses all feedback where Status = empty/blank."
},
"typeVersion": 1
},
{
"id": "9a24cb7c-fd3b-4e74-ab5c-95457d2658c3",
"name": "스티키 노트11",
"type": "n8n-nodes-base.stickyNote",
"position": [
6032,
1152
],
"parameters": {
"width": 336,
"height": 80,
"content": "**Created by:** [Parhum Khoshbakht](https://www.linkedin.com/in/parhumm/)\nProduct Manager & Leadership Coach"
},
"typeVersion": 1
},
{
"id": "fe170993-5489-4cbf-9489-bd622ca646a3",
"name": "스티키 노트12",
"type": "n8n-nodes-base.stickyNote",
"position": [
4224,
544
],
"parameters": {
"color": 7,
"width": 336,
"height": 480,
"content": "## 📦 **Aggregate Batch Items**\n\n**Collects all feedback items in the current batch and combines them into a single item.**\n\nThis allows us to send all 10 feedbacks (or configured batch size) as ONE request to OpenAI instead of 10 separate requests.\n\n💰 **Cost savings:** ~90% reduction in API calls!"
},
"typeVersion": 1
},
{
"id": "0ba2d396-07e4-45b5-aebd-7b2b23758630",
"name": "스티키 노트13",
"type": "n8n-nodes-base.stickyNote",
"position": [
5200,
560
],
"parameters": {
"color": 7,
"width": 336,
"height": 448,
"content": "## 🔀 **Split Batch Results**\n\n**Parses the OpenAI response and splits it back into individual feedback items.**\n\nEach item contains:\n- `row_number`: To match with the original Google Sheet row\n- `tags`: Array of tag names (up to 3)\n- `sentiment`: Sentiment classification\n\nThese items are then sent to the Google Sheet update node one by one."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "4213cde2-0655-4e7a-ad52-47b312aacb8c",
"connections": {
"22e35300-b79f-4b21-b2fb-47ee274141e2": {
"main": [
[
{
"node": "d9064168-bf99-4066-89a7-0dbe19c8f3ae",
"type": "main",
"index": 0
},
{
"node": "7f0ee6a9-cfd1-449d-96c7-5dcd180fc152",
"type": "main",
"index": 0
}
]
]
},
"086461e1-dc56-412a-a073-740af265b83e": {
"main": [
[
{
"node": "1234a97c-f663-454c-abd7-9e64b3098ef4",
"type": "main",
"index": 0
}
]
]
},
"d9064168-bf99-4066-89a7-0dbe19c8f3ae": {
"main": [
[
{
"node": "dcf3888e-b2f4-4d35-acc2-48798368aee2",
"type": "main",
"index": 1
}
]
]
},
"7f0ee6a9-cfd1-449d-96c7-5dcd180fc152": {
"main": [
[
{
"node": "dcf3888e-b2f4-4d35-acc2-48798368aee2",
"type": "main",
"index": 0
}
]
]
},
"54ebf56d-27ec-411d-9973-10a717921e47": {
"main": [
[
{
"node": "ac43582f-ba7e-4941-91d1-e48ecb7e1944",
"type": "main",
"index": 0
}
]
]
},
"12824491-a5d8-42ba-b602-5ad577d0108c": {
"main": [
[
{
"node": "bce8aee5-89f5-423c-89f9-b6b0705a3d50",
"type": "main",
"index": 0
}
]
]
},
"bce8aee5-89f5-423c-89f9-b6b0705a3d50": {
"main": [
[
{
"node": "54ebf56d-27ec-411d-9973-10a717921e47",
"type": "main",
"index": 0
}
]
]
},
"dcf3888e-b2f4-4d35-acc2-48798368aee2": {
"main": [
[
{
"node": "086461e1-dc56-412a-a073-740af265b83e",
"type": "main",
"index": 0
}
]
]
},
"1234a97c-f663-454c-abd7-9e64b3098ef4": {
"main": [
[],
[
{
"node": "12824491-a5d8-42ba-b602-5ad577d0108c",
"type": "main",
"index": 0
}
]
]
},
"ac43582f-ba7e-4941-91d1-e48ecb7e1944": {
"main": [
[
{
"node": "1234a97c-f663-454c-abd7-9e64b3098ef4",
"type": "main",
"index": 0
}
]
]
},
"20d919c3-088c-4748-bf11-31a8f1490c24": {
"main": [
[
{
"node": "d9064168-bf99-4066-89a7-0dbe19c8f3ae",
"type": "main",
"index": 0
},
{
"node": "7f0ee6a9-cfd1-449d-96c7-5dcd180fc152",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 시장 조사, AI 요약
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
광고 분석
GPT-4와 Gemini AI를 비교한 Meta 광고 효과 분석
If
Set
Code
+
If
Set
Code
25 노드Kirill Khatkevich
시장 조사
리드 생성 및 이메일 워크플로
Google 지도, SendGrid 및 AI를 사용한 B2B 잠재 고객 개발 및 이메일 마케팅 자동화
If
Set
Code
+
If
Set
Code
141 노드Ezema Kingsley Chibuzo
리드 생성
매일 WhatsApp 그룹 지능형 분석: GPT-4.1 분석 및 음성 메시지 변환
매일 WhatsApp 그룹 지능 분석: GPT-4.1 분석 및 음성 메시지 트랜스크립션
If
Set
Code
+
If
Set
Code
52 노드Daniel Lianes
기타
회사 이메일 찾기 도구 새 버전
Serp.dev와 AnyMailFinder를 사용하여 B2B 의사결정자 이메일을 찾고 잠재 고객 데이터베이스를 구축합니다.
If
Set
Code
+
If
Set
Code
33 노드Alexandra Spalato
AI 요약
01 AI 미디어 바이어를 사용한 Facebook 광고 성과 분석 및 Google Sheets로 인사이트 전송
Gemini AI를 사용한 Facebook 광고 분석 및 Google Sheets로 인사이트 전송
If
Set
Code
+
If
Set
Code
34 노드JJ Tham
시장 조사
Google 크롤링, Bright Data 및 Gemini AI를 사용한 키워드 검색 의도 분석
구글 크롤링, Bright Data 및 Gemini AI를 사용하여 키워드 검색 의도 분석
Set
Merge
Split Out
+
Set
Merge
Split Out
24 노드Zacharia Kimotho
시장 조사