Google评论情感分析工作流
高级
这是一个AI Summarization, Multimodal AI领域的自动化工作流,包含 25 个节点。主要使用 Set, Code, Slack, Filter, Agent 等节点。 分析Google商家评论并使用Gemini将情绪报告发送到Slack
前置要求
- •Slack Bot Token 或 Webhook URL
- •Google Gemini API Key
使用的节点 (25)
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "peemlQQi9udHOyNH",
"meta": {
"instanceId": "bbc3fa3cd7d64d8ff0c4877d98dee68ce7dadacc5e089546680c915b3e5a212b",
"templateCredsSetupCompleted": true
},
"name": "Google 评论情感分析工作流",
"tags": [],
"nodes": [
{
"id": "3f44e182-92ad-4e47-9eab-4ffc6c9a3dfa",
"name": "获取多条评论",
"type": "n8n-nodes-base.googleBusinessProfile",
"position": [
-272,
-80
],
"parameters": {
"limit": 1000,
"account": {
"__rl": true,
"mode": "name",
"value": "="
},
"location": {
"__rl": true,
"mode": "name",
"value": "="
},
"resource": "review",
"operation": "getAll",
"requestOptions": {}
},
"typeVersion": 1
},
{
"id": "29592644-4922-4095-a608-fc369882a249",
"name": "情感分析",
"type": "@n8n/n8n-nodes-langchain.sentimentAnalysis",
"position": [
368,
-96
],
"parameters": {
"options": {
"batching": {
"batchSize": 20,
"delayBetweenBatches": 60000
},
"categories": "Positive, Neutral, Negative",
"enableAutoFixing": true,
"systemPromptTemplate": "=You are a highly intelligent and accurate sentiment analyzer. \n\nYou will receive multiple JSON objects, each containing: \n- Comment: \"{{ $json.Comment }}\" \n- Rating: \"{{ $json.Raiting }}\" \n- Date: \"{{ $json.Date }}\" \n\nRules for analysis: \n- If Comment = \"no comment\", ignore the comment and analyze sentiment only from the rating. \n- If Comment has text, analyze sentiment based on both the comment and rating together. \n- Use the Date field to group sentiments by month and identify trends. \n\nYour tasks: \n1. Classify the overall sentiment trends into one of the following categories: {categories}. \n2. Group the results by month (based on the Date field) and provide the sentiment distribution for each month. \n3. For each month, give a short explanation of why the sentiment appears that way (e.g., common themes in comments, tone, or rating alignment). \n4. Provide a consolidated summary of sentiment across the entire dataset, including the key reasons driving the results. ",
"includeDetailedResults": true
},
"inputText": "={{ $json.Comment }}{{ $json.Raiting }}{{ $json.Date }}"
},
"typeVersion": 1.1
},
{
"id": "692ed10b-947e-4386-9707-0c2ce1e307f9",
"name": "Google Gemini 聊天模型",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
1056,
-224
],
"parameters": {
"options": {
"maxOutputTokens": 5000
},
"modelName": "models/gemini-2.0-flash"
},
"typeVersion": 1
},
{
"id": "713c6715-380d-4adf-a681-092765116409",
"name": "计划触发器",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-688,
-80
],
"parameters": {
"rule": {
"interval": [
{
"field": "months"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "20e79d80-cdce-4cae-ab1f-6ff44565731b",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1040,
-432
],
"parameters": {
"text": "=You are an AI assistant that consolidates customer feedback consisting of comments, ratings, and sentiment analysis metadata. \n\nINPUT DATA:\n{{ $json.feedback }}\n\nTASK:\n1. Review all feedback entries together.\n - Ignore entries where \"Comment\" = \"no comment\".\n - Convert \"Raiting\" into numeric stars (FIVE = 5, FOUR = 4, etc.).\n - Use \"sentimentAnalysis\" to confirm tone and consistency.\n - Consider \"Date\" to identify any trends or changes over time.\n\n2. Produce ONE single consolidated report in **valid JSON format** with the following structure:\n\n{\n \"overallSentiment\": \"string\", // e.g. \"Positive\", \"Negative\", \"Mixed\"\n \"averageRating\": number, // average numeric rating\n \"highlights\": [ \"string\", ... ], // list of positive aspects\n \"weaknessesConcerns\": [ \"string\", ... ], // list of concerns/issues\n \"timeTrend\": \"string\", // description of sentiment or rating trend over time\n \"finalSummary\": \"string\" // concise conclusion\n}",
"options": {},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "97dce654-beb7-46f3-9d4c-9f4768b72324",
"name": "AI Agent1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1040,
-128
],
"parameters": {
"text": "=You are an AI assistant that consolidates customer feedback consisting of comments, ratings, and sentiment analysis metadata. \n\nINPUT DATA:\n{{ $json.feedback }}\n\nTASK:\n1. Review all feedback entries together.\n - Ignore entries where \"Comment\" = \"no comment\".\n - Convert \"Raiting\" into numeric stars (FIVE = 5, FOUR = 4, etc.).\n - Use \"sentimentAnalysis\" to confirm tone and consistency.\n - Consider \"Date\" to identify any trends or changes over time.\n\n2. Produce ONE single consolidated report in **valid JSON format** with the following structure:\n\n{\n \"overallSentiment\": \"string\", // e.g. \"Positive\", \"Negative\", \"Mixed\"\n \"averageRating\": number, // average numeric rating\n \"highlights\": [ \"string\", ... ], // list of positive aspects\n \"weaknessesConcerns\": [ \"string\", ... ], // list of concerns/issues\n \"timeTrend\": \"string\", // description of sentiment or rating trend over time\n \"finalSummary\": \"string\" // concise conclusion\n}",
"options": {},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "bfc5447b-fd82-4c44-af66-0d2b60f75280",
"name": "AI 代理2",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1056,
112
],
"parameters": {
"text": "=You are an AI assistant that consolidates customer feedback consisting of comments, ratings, and sentiment analysis metadata. \n\nINPUT DATA:\n{{ $json.feedback }}\n\nTASK:\n1. Review all feedback entries together.\n - Ignore entries where \"Comment\" = \"no comment\".\n - Convert \"Raiting\" into numeric stars (FIVE = 5, FOUR = 4, etc.).\n - Use \"sentimentAnalysis\" to confirm tone and consistency.\n - Consider \"Date\" to identify any trends or changes over time.\n\n2. Produce ONE single consolidated report in **valid JSON format** with the following structure:\n\n{\n \"overallSentiment\": \"string\", // e.g. \"Positive\", \"Negative\", \"Mixed\"\n \"averageRating\": number, // average numeric rating\n \"highlights\": [ \"string\", ... ], // list of positive aspects\n \"weaknessesConcerns\": [ \"string\", ... ], // list of concerns/issues\n \"timeTrend\": \"string\", // description of sentiment or rating trend over time\n \"finalSummary\": \"string\" // concise conclusion\n}",
"options": {},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "f95e4642-38b6-48ea-bf53-5de3175a7846",
"name": "Google Gemini 聊天模型1",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
368,
112
],
"parameters": {
"options": {
"maxOutputTokens": 5000
},
"modelName": "models/gemini-2.0-flash"
},
"credentials": {
"googlePalmApi": {
"id": "WGFHFP25iuAU2TH9",
"name": "Google Gemini(PaLM) Api account 2"
}
},
"typeVersion": 1
},
{
"id": "8606a252-49af-472d-a47c-559be628fe60",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-512,
-288
],
"parameters": {
"width": 752,
"height": 432,
"content": "## 读取 Google 评论"
},
"typeVersion": 1
},
{
"id": "eb49d865-7578-4969-b505-b643caa3f29d",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
288,
-288
],
"parameters": {
"width": 400,
"height": 544,
"content": "## 对 Google 评论运行情感分析"
},
"typeVersion": 1
},
{
"id": "17a9299c-5c99-466e-ae6a-895c29b25106",
"name": "便签2",
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
-624
],
"parameters": {
"width": 640,
"height": 896,
"content": "## 使用 AI 模型总结情感分析报告"
},
"typeVersion": 1
},
{
"id": "4b087a3b-d891-4f9a-97d1-be57259afb19",
"name": "便签3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1392,
-656
],
"parameters": {
"width": 448,
"height": 928,
"content": "## 发送通知到 Slack 频道"
},
"typeVersion": 1
},
{
"id": "091e5606-4e04-4fe3-b2df-0625f32d6beb",
"name": "便签5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-816,
-816
],
"parameters": {
"width": 512,
"height": 448,
"content": ""
},
"typeVersion": 1
},
{
"id": "b4506c66-8619-4eef-aed0-f4a9363af457",
"name": "Set time period",
"type": "n8n-nodes-base.set",
"position": [
-480,
-80
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6acde8ee-5eeb-451c-a491-ed4a19c7b765",
"name": "period",
"type": "string",
"value": "year"
},
{
"id": "f5212cc6-8ed1-45de-ac3b-ff839822bed2",
"name": "time",
"type": "string",
"value": "3"
}
]
}
},
"executeOnce": true,
"typeVersion": 3.4
},
{
"id": "f284db6b-8852-427a-be86-e30961871f97",
"name": "Filter review based on the time period",
"type": "n8n-nodes-base.filter",
"position": [
-96,
-80
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2dd5772a-efc9-46ac-9054-c5a7de0abdc9",
"operator": {
"type": "dateTime",
"operation": "after"
},
"leftValue": "={{ $json.updateTime }}",
"rightValue": "={{ $today.minus({ [ $('Set time period').item.json.period ]: $('Set time period').item.json.time }).toISO() }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "c775ac9e-4367-463d-b3d0-45e3d7bc648f",
"name": "Map the comment and rating",
"type": "n8n-nodes-base.set",
"position": [
112,
-80
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "4ad19e64-07ad-4351-a696-d2d0026aaa31",
"name": "Comment",
"type": "string",
"value": "={{ $json.comment ?? \"no comment\" }}"
},
{
"id": "ac2932fb-6a62-4179-98d3-5d66a9738ee8",
"name": "Raiting",
"type": "string",
"value": "={{ $json.starRating ?? \"0\" }}"
},
{
"id": "fcadfd58-3d78-44e3-9e95-a24cbdaec614",
"name": "Date",
"type": "string",
"value": "={{ $json.updateTime }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "719cdaa0-f962-45da-91a4-34492f92119e",
"name": "Convert to json string",
"type": "n8n-nodes-base.code",
"position": [
816,
-336
],
"parameters": {
"jsCode": "return [\n {\n json: {\n feedback: JSON.stringify($input.all().map(item => item.json), null, 2)\n }\n }\n];"
},
"executeOnce": true,
"typeVersion": 2
},
{
"id": "68f2cf3c-4b21-4004-b8d4-3399d8c1bafa",
"name": "Convert to json string1",
"type": "n8n-nodes-base.code",
"position": [
816,
-96
],
"parameters": {
"jsCode": "return [\n {\n json: {\n feedback: JSON.stringify($input.all().map(item => item.json), null, 2)\n }\n }\n];"
},
"executeOnce": true,
"typeVersion": 2
},
{
"id": "046f17c6-c024-4b62-b16f-6d6ccdfeaad2",
"name": "Convert to json string2",
"type": "n8n-nodes-base.code",
"position": [
816,
112
],
"parameters": {
"jsCode": "return [\n {\n json: {\n feedback: JSON.stringify($input.all().map(item => item.json), null, 2)\n }\n }\n];"
},
"executeOnce": true,
"typeVersion": 2
},
{
"id": "cad3406f-e05d-4c9c-ae13-aa9d877286e3",
"name": "Restructure the sentiment positive data to slack block",
"type": "n8n-nodes-base.code",
"position": [
1456,
-432
],
"parameters": {
"jsCode": "// Extract JSON string from $json.output (remove ```json ... ```)\nlet raw = $json.output.replace(/```json|```/g, \"\").trim();\n\n// Parse JSON\nlet data;\ntry {\n data = JSON.parse(raw);\n} catch (e) {\n throw new Error(\"Invalid JSON format in output: \" + e.message);\n}\n\n// Slack blocks array\nconst blocks = [\n {\n type: \"header\",\n text: {\n type: \"plain_text\",\n text: \"📊 Customer Feedback Report\",\n emoji: true\n }\n }\n];\n\n// Overall Sentiment\nif (data.overallSentiment) {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Overall Sentiment:* ${data.overallSentiment}` }\n });\n}\n\n// Average Rating\nif (data.averageRating) {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Average Rating:* ${data.averageRating} ⭐` }\n });\n}\n\n// Highlights\nif (data.highlights && data.highlights.length > 0) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: \"*Highlights:*\" }\n });\n\n data.highlights.forEach(h => {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `• ${h}` }\n });\n });\n}\n\n// Weaknesses/Concerns\nif (data.weaknessesConcerns && data.weaknessesConcerns.length > 0) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: \"*Weaknesses / Concerns:*\" }\n });\n\n data.weaknessesConcerns.forEach(w => {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `• ${w}` }\n });\n });\n}\n\n// Time Trend\nif (data.timeTrend) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Time Trend:* ${data.timeTrend}` }\n });\n}\n\n// Final Summary\nif (data.finalSummary) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Final Summary:* ${data.finalSummary}` }\n });\n}\n\n// Return Slack-ready JSON\nreturn [\n {\n json: {\n blocks\n }\n }\n];\n"
},
"executeOnce": true,
"typeVersion": 2
},
{
"id": "e734a3e0-5b2e-4930-a61a-c81a9263d34a",
"name": "Restructure the sentiment neutral data to slack block",
"type": "n8n-nodes-base.code",
"position": [
1440,
-128
],
"parameters": {
"jsCode": "// Extract JSON string from $json.output (remove ```json ... ```)\nlet raw = $json.output.replace(/```json|```/g, \"\").trim();\n\n// Parse JSON\nlet data;\ntry {\n data = JSON.parse(raw);\n} catch (e) {\n throw new Error(\"Invalid JSON format in output: \" + e.message);\n}\n\n// Slack blocks array\nconst blocks = [\n {\n type: \"header\",\n text: {\n type: \"plain_text\",\n text: \"📊 Customer Feedback Report\",\n emoji: true\n }\n }\n];\n\n// Overall Sentiment\nif (data.overallSentiment) {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Overall Sentiment:* ${data.overallSentiment}` }\n });\n}\n\n// Average Rating\nif (data.averageRating) {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Average Rating:* ${data.averageRating} ⭐` }\n });\n}\n\n// Highlights\nif (data.highlights && data.highlights.length > 0) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: \"*Highlights:*\" }\n });\n\n data.highlights.forEach(h => {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `• ${h}` }\n });\n });\n}\n\n// Weaknesses/Concerns\nif (data.weaknessesConcerns && data.weaknessesConcerns.length > 0) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: \"*Weaknesses / Concerns:*\" }\n });\n\n data.weaknessesConcerns.forEach(w => {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `• ${w}` }\n });\n });\n}\n\n// Time Trend\nif (data.timeTrend) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Time Trend:* ${data.timeTrend}` }\n });\n}\n\n// Final Summary\nif (data.finalSummary) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Final Summary:* ${data.finalSummary}` }\n });\n}\n\n// Return Slack-ready JSON\nreturn [\n {\n json: {\n blocks\n }\n }\n];\n"
},
"executeOnce": true,
"typeVersion": 2
},
{
"id": "bf8ebac2-b4f9-43ea-8ec0-ab2a018760c2",
"name": "Restructure the sentiment negative data to slack block",
"type": "n8n-nodes-base.code",
"position": [
1456,
112
],
"parameters": {
"jsCode": "// Extract JSON string from $json.output (remove ```json ... ```)\nlet raw = $json.output.replace(/```json|```/g, \"\").trim();\n\n// Parse JSON\nlet data;\ntry {\n data = JSON.parse(raw);\n} catch (e) {\n throw new Error(\"Invalid JSON format in output: \" + e.message);\n}\n\n// Slack blocks array\nconst blocks = [\n {\n type: \"header\",\n text: {\n type: \"plain_text\",\n text: \"📊 Customer Feedback Report\",\n emoji: true\n }\n }\n];\n\n// Overall Sentiment\nif (data.overallSentiment) {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Overall Sentiment:* ${data.overallSentiment}` }\n });\n}\n\n// Average Rating\nif (data.averageRating) {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Average Rating:* ${data.averageRating} ⭐` }\n });\n}\n\n// Highlights\nif (data.highlights && data.highlights.length > 0) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: \"*Highlights:*\" }\n });\n\n data.highlights.forEach(h => {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `• ${h}` }\n });\n });\n}\n\n// Weaknesses/Concerns\nif (data.weaknessesConcerns && data.weaknessesConcerns.length > 0) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: \"*Weaknesses / Concerns:*\" }\n });\n\n data.weaknessesConcerns.forEach(w => {\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `• ${w}` }\n });\n });\n}\n\n// Time Trend\nif (data.timeTrend) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Time Trend:* ${data.timeTrend}` }\n });\n}\n\n// Final Summary\nif (data.finalSummary) {\n blocks.push({ type: \"divider\" });\n blocks.push({\n type: \"section\",\n text: { type: \"mrkdwn\", text: `*Final Summary:* ${data.finalSummary}` }\n });\n}\n\n// Return Slack-ready JSON\nreturn [\n {\n json: {\n blocks\n }\n }\n];\n"
},
"executeOnce": true,
"retryOnFail": false,
"typeVersion": 2
},
{
"id": "8e8b11a1-1531-4f0d-90f6-5025e04a173e",
"name": "Send message to slack channel if the analysis is positive",
"type": "n8n-nodes-base.slack",
"position": [
1664,
-432
],
"webhookId": "e3c8bfca-cc86-4c09-923a-0e40bf18d3e5",
"parameters": {
"select": "channel",
"blocksUi": "={{ '{ \"blocks\": ' + JSON.stringify($json.blocks) + ' }' }}",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09DQ7EJ57A",
"cachedResultName": "sentiment-analysis-report"
},
"messageType": "block",
"otherOptions": {
"includeLinkToWorkflow": false
},
"authentication": "oAuth2"
},
"typeVersion": 2.3
},
{
"id": "58b3519a-3484-4d0a-bf16-69fcd3c3cb9f",
"name": "Send message to slack channel if the analysis is neutral",
"type": "n8n-nodes-base.slack",
"position": [
1680,
-128
],
"webhookId": "e3c8bfca-cc86-4c09-923a-0e40bf18d3e5",
"parameters": {
"select": "channel",
"blocksUi": "={{ '{ \"blocks\": ' + JSON.stringify($json.blocks) + ' }' }}",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09DQ7EJ57A",
"cachedResultName": "sentiment-analysis-report"
},
"messageType": "block",
"otherOptions": {
"includeLinkToWorkflow": false
},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"id": "27RfzQEAlPHYU6tj",
"name": "Slack account"
}
},
"typeVersion": 2.3
},
{
"id": "6b05d854-689d-473b-a02d-631293ff3817",
"name": "Send message to slack channel if the analysis is negative",
"type": "n8n-nodes-base.slack",
"position": [
1680,
112
],
"webhookId": "e3c8bfca-cc86-4c09-923a-0e40bf18d3e5",
"parameters": {
"select": "channel",
"blocksUi": "={{ '{ \"blocks\": ' + JSON.stringify($json.blocks) + ' }' }}",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09DQ7EJ57A",
"cachedResultName": "sentiment-analysis-report"
},
"messageType": "block",
"otherOptions": {
"includeLinkToWorkflow": false
},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"id": "27RfzQEAlPHYU6tj",
"name": "Slack account"
}
},
"typeVersion": 2.3
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "9d0aab67-a72b-43f9-a8c3-e7b8c7aa7be3",
"connections": {
"AI Agent": {
"main": [
[
{
"node": "Restructure the sentiment positive data to slack block",
"type": "main",
"index": 0
}
]
]
},
"AI Agent1": {
"main": [
[
{
"node": "Restructure the sentiment neutral data to slack block",
"type": "main",
"index": 0
}
]
]
},
"AI Agent2": {
"main": [
[
{
"node": "Restructure the sentiment negative data to slack block",
"type": "main",
"index": 0
}
]
]
},
"Set time period": {
"main": [
[
{
"node": "Get many reviews",
"type": "main",
"index": 0
}
]
]
},
"Get many reviews": {
"main": [
[
{
"node": "Filter review based on the time period",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Set time period",
"type": "main",
"index": 0
}
]
]
},
"Sentiment Analysis": {
"main": [
[
{
"node": "Convert to json string",
"type": "main",
"index": 0
}
],
[
{
"node": "Convert to json string1",
"type": "main",
"index": 0
}
],
[
{
"node": "Convert to json string2",
"type": "main",
"index": 0
}
]
]
},
"Convert to json string": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Convert to json string1": {
"main": [
[
{
"node": "AI Agent1",
"type": "main",
"index": 0
}
]
]
},
"Convert to json string2": {
"main": [
[
{
"node": "AI Agent2",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
},
{
"node": "AI Agent1",
"type": "ai_languageModel",
"index": 0
},
{
"node": "AI Agent2",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Google Gemini Chat Model1": {
"ai_languageModel": [
[
{
"node": "Sentiment Analysis",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Map the comment and rating": {
"main": [
[
{
"node": "Sentiment Analysis",
"type": "main",
"index": 0
}
]
]
},
"Filter review based on the time period": {
"main": [
[
{
"node": "Map the comment and rating",
"type": "main",
"index": 0
}
]
]
},
"Restructure the sentiment neutral data to slack block": {
"main": [
[
{
"node": "Send message to slack channel if the analysis is neutral",
"type": "main",
"index": 0
}
]
]
},
"Restructure the sentiment negative data to slack block": {
"main": [
[
{
"node": "Send message to slack channel if the analysis is negative",
"type": "main",
"index": 0
}
]
]
},
"Restructure the sentiment positive data to slack block": {
"main": [
[
{
"node": "Send message to slack channel if the analysis is positive",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - AI 摘要总结, 多模态 AI
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
会议记录通知
使用Gemini AI和Slack通知自动化会议笔记摘要
Set
Code
Slack
+9
16 节点Sayone Technologies
AI 摘要总结
使用Gemini AI和Google Workspace将每日邮件和日历摘要发送到Slack
使用Gemini AI和Google Workspace将每日邮件和日历摘要发送到Slack
Code
Cron
Gmail
+7
20 节点Sayone Technologies
杂项
基于AI的会议研究与每日议程(Google日历、Attio CRM和Slack)
基于AI的会议研究与每日议程:使用Google日历、Attio CRM和Slack
If
Set
Code
+15
30 节点Harry Siggins
AI 摘要总结
自动化会议准备
使用 GPT-5 和 Gemini 研究从日历到 Slack 通过 Attio CRM 自动准备会议
If
Set
Code
+16
39 节点Harry Siggins
AI 摘要总结
使用Gemini、Slack和Notion从新闻简报创建AI情报摘要
使用Gemini、Slack和Notion从新闻简报创建AI情报摘要
Set
Code
Gmail
+12
19 节点Harry Siggins
杂项
电子邮件扫描和Google表格采购订单创建
使用Gemini AI从Gmail提取采购订单并保存至Google表格
If
Set
Code
+8
15 节点Sayone Technologies
文档提取
工作流信息
难度等级
高级
节点数量25
分类2
节点类型10
作者
Sayone Technologies
@sayonetechSayOne Technologies is a digital transformation and IT services company headquartered in India, with a strong focus on web, mobile, and AI-driven solutions for the retail tech space. With over a decade of experience, SayOne partners with global businesses to build scalable applications, optimize inventory and operations using next-gen AI, and deliver customer-centric digital products.
外部链接
在 n8n.io 查看 →
分享此工作流