AutomationFlowsAI & RAG › Curate & Translate News From RSS Using Google Gemini, Sheets, and Slack

Curate & Translate News From RSS Using Google Gemini, Sheets, and Slack

Byueharayuuki @ueharayuuki1012 on n8n.io

Overview This workflow automates news monitoring by fetching RSS feeds, rewriting content using AI, translating it (EN/ZH/KO), and archiving it.

Cron / scheduled trigger★★★★☆ complexityAI-powered17 nodesGoogle Gemini ChatRSS Feed ReadAgentGoogle SheetsSlack
AI & RAG Trigger: Cron / scheduled Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #11301 — we link there as the canonical source.

This workflow follows the Agent → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "067f33a0-084d-40e1-9945-6c24e130373f",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        272,
        224
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 20
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "8f9bf5fb-4cb6-4eac-aeb5-17d614f3adef",
      "name": "Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        960,
        448
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5c2af69f-019d-4d3b-938d-d8360d79b6da",
      "name": "Gemini Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1392,
        448
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a96bc82a-e977-4ec5-8cda-a5b3584e522f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -256,
        64
      ],
      "parameters": {
        "width": 480,
        "height": 624,
        "content": "## \ud83e\udd16 Curate & Translate News (Gemini, Sheets, Slack)\n\n**Overview**\nThis workflow automates news monitoring by fetching RSS feeds, rewriting content using **Google Gemini**, translating it (EN/ZH/KO), and archiving it to **Google Sheets** and **Slack**.\n\n**Who is this for?**\nContent Curators, Localization Teams, and Travel Bloggers.\n\n**How it works**\n1. **Fetch & Filter:** Pulls NHK RSS and filters for keywords (e.g., \"Tokyo\") using `stringContains`.\n2. **AI Processing:** Google Gemini rewrites articles, extracts locations, and translates text.\n3. **Archive & Notify:** Saves structured data to Google Sheets and alerts Slack.\n\n**Output Example (JSON)**\nThe translation agent outputs data in this format:\n```json\n{\n  \"en\": \"Tokyo Tower is...\",\n  \"zh\": \"\u4e1c\u4eac\u5854\u662f...\",\n  \"ko\": \"\ub3c4\ucfc4 \ud0c0\uc6cc\ub294...\"\n}"
      },
      "typeVersion": 1
    },
    {
      "id": "947e125b-abd8-4f3d-b5ae-161bd58d1067",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        272,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 112,
        "content": "## 1. Fetch & Filter\nRuns on a schedule to fetch the latest RSS items. Filters articles based on specific keywords (e.g., \"Tokyo\" or \"Season\") before processing."
      },
      "typeVersion": 1
    },
    {
      "id": "607d6a03-d2ef-4365-914d-88472da668aa",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 912,
        "height": 112,
        "content": "## 2. AI Analysis & Parsing\nUses Google Gemini to rewrite the news, extract specific locations, and translate content. The Code node cleans the JSON output for the database."
      },
      "typeVersion": 1
    },
    {
      "id": "6e2663ca-e66a-411f-9609-a7c56d1082d2",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1792,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 112,
        "content": "## 3. Archive & Notify\nAppends the structured data to Google Sheets and sends a formatted notification to Slack (or alerts if an article was skipped)."
      },
      "typeVersion": 1
    },
    {
      "id": "79e42b18-6cd3-4027-99ec-f75d93134efd",
      "name": "Fetch RSS Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        416,
        224
      ],
      "parameters": {
        "url": "https://www.nhk.or.jp/rss/news/cat3.xml",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "e29aa0c3-120a-41db-ae56-683507df8865",
      "name": "Limit Items",
      "type": "n8n-nodes-base.limit",
      "position": [
        560,
        224
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "8b5532e5-2eeb-4227-a130-6d007ab2541e",
      "name": "Filter Keywords",
      "type": "n8n-nodes-base.if",
      "position": [
        704,
        224
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "44db82f2-d3e6-4dff-abd9-1354de619c92",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.title }}",
              "rightValue": "="
            },
            {
              "id": "da07218a-c947-4987-b997-1af4a0a4ea3c",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.title }}",
              "rightValue": "tokyo"
            },
            {
              "id": "b90223ef-e96d-477b-b6cf-3cc0f1e4dcfb",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.title }}",
              "rightValue": "season"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d3fc7b38-c89b-43eb-a9b9-b8ddfb6dcfd9",
      "name": "Rewrite Article",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        848,
        208
      ],
      "parameters": {
        "text": "={{ $json.content }}",
        "options": {
          "systemMessage": "=You are an experienced journalist. Understand the content...\n\u4ee5\u4e0b\u306e\u300c\u5143\u306e\u8a18\u4e8b\u300d\u306e\u5185\u5bb9\u3092\u6b63\u78ba\u306b\u7406\u89e3\u3057\u3001\u305d\u306e\u60c5\u5831\u3092\u5143\u306b\u3057\u3066\u3001\u6b21\u306e\u69cb\u6210\u306b\u5f93\u3063\u305f\u65b0\u3057\u3044\u89e3\u8aac\u8a18\u4e8b\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\u8a18\u4e8b\u5168\u4f53\u306e\u30c8\u30fc\u30f3\u306f\u3001\u4e2d\u7acb\u7684\u304b\u3064\u5ba2\u89b3\u7684\u3067\u3001\u5c02\u9580\u77e5\u8b58\u304c\u306a\u3044\u4eba\u306b\u3082\u5206\u304b\u308a\u3084\u3059\u3044\u8a00\u8449\u3067\u66f8\u3044\u3066\u304f\u3060\u3055\u3044\u3002\n\n# \u69cb\u6210\n\u30fb\u3010\u30bf\u30a4\u30c8\u30eb\u3011\u8a18\u4e8b\u306e\u5185\u5bb9\u304c\u3059\u3050\u306b\u5206\u304b\u308a\u3001\u8aad\u8005\u306e\u8208\u5473\u3092\u5f15\u304f\u3088\u3046\u306a\u30bf\u30a4\u30c8\u30eb\n\u30fb\u3010\u5c0e\u5165\u3011\u3053\u306e\u30cb\u30e5\u30fc\u30b9\u304c\u300c\u306a\u305c\u4eca\u3001\u91cd\u8981\u306a\u306e\u304b\u300d\u30921\u301c2\u6587\u3067\u7c21\u6f54\u306b\u8aac\u660e\n\u30fb\u3010\u8981\u70b9\u30b5\u30de\u30ea\u30fc\u3011\u5143\u306e\u8a18\u4e8b\u306e\u6700\u3082\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\u30923\u3064\u306e\u7b87\u6761\u66f8\u304d\u3067\u30ea\u30b9\u30c8\u30a2\u30c3\u30d7\n\u30fb\u3010\u80cc\u666f\u3068\u6df1\u6398\u308a\u89e3\u8aac\u3011\u3053\u306e\u51fa\u6765\u4e8b\u304c\u8d77\u304d\u305f\u80cc\u666f\u3084\u3001\u95a2\u9023\u3059\u308b\u91cd\u8981\u306a\u30ad\u30fc\u30ef\u30fc\u30c9\u306b\u3064\u3044\u3066\u3001\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u306b\u4e01\u5be7\u306b\u89e3\u8aac\n\u30fb\u3010\u4eca\u5f8c\u306e\u5c55\u671b\u3011\u3053\u306e\u30cb\u30e5\u30fc\u30b9\u304c\u3001\u4eca\u5f8c\u3069\u306e\u3088\u3046\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u3046\u308b\u304b\u3001\u8003\u3048\u3089\u308c\u308b\u3044\u304f\u3064\u304b\u306e\u53ef\u80fd\u6027\u3092\u63d0\u793a\n\u30fb\u3010\u307e\u3068\u3081\u3011\u8a18\u4e8b\u5168\u4f53\u306e\u7d50\u8ad6\u3068\u3001\u8aad\u8005\u3078\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\n\n\n"
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "097a85cb-590f-42d7-8e5f-a35815e8ece6",
      "name": "Extract Location",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1120,
        208
      ],
      "parameters": {
        "text": "={{ $('Limit Items').item.json.content }}\n\n\u6700\u3082\u91cd\u8981\u3060\u3068\u601d\u308f\u308c\u308b\u5730\u540d\u307e\u305f\u306f\u65bd\u8a2d\u540d\u3092\u4e00\u3064\u3060\u3051\u62bd\u51fa\u3057\u3001\u305d\u306e\u540d\u79f0\u306e\u307f\u3092\u51fa\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4f59\u8a08\u306a\u8aac\u660e\u306f\u4e00\u5207\u4e0d\u8981\u3067\u3059\u3002",
        "options": {
          "systemMessage": "From the text provided, extract only the single most important location name...\n\n\u4f8b\uff1a\u6e05\u6c34\u5bfa\u3001\u6771\u4eac\u30b9\u30ab\u30a4\u30c4\u30ea\u30fc\u3001\u9053\u9813\u5800"
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "4b7e11eb-4c2b-4d5f-842c-884209635f3d",
      "name": "Translate Content",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1392,
        208
      ],
      "parameters": {
        "text": "=={{ $('Rewrite Article').item.json.output }}",
        "options": {
          "systemMessage": "You are a professional translator. Translate the input Japanese article into English, Chinese, and Korean...\n\n1. \u82f1\u8a9e (English)\n2. \u4e2d\u56fd\u8a9e \u7c21\u4f53\u5b57 (Chinese Simplified)\n3. \u97d3\u56fd\u8a9e (Korean)\n\n\u91cd\u8981\uff1a\n\u5fc5\u305a\u4ee5\u4e0b\u306eJSON\u5f62\u5f0f\u306e\u30c7\u30fc\u30bf\u306e\u307f\u3092\u51fa\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4f59\u8a08\u306a\u6328\u62f6\u3084Markdown\u8a18\u53f7\uff08```json\u306a\u3069\uff09\u306f\u4e00\u5207\u66f8\u304b\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002\n\n{\n  \"en\": \"\u3053\u3053\u306b\u82f1\u8a9e\u306e\u7ffb\u8a33\",\n  \"zh\": \"\u3053\u3053\u306b\u4e2d\u56fd\u8a9e\u306e\u7ffb\u8a33\",\n  \"ko\": \"\u3053\u3053\u306b\u97d3\u56fd\u8a9e\u306e\u7ffb\u8a33\"\n}"
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "36bf6334-2cff-4c58-bb5f-6f84a5b90a3c",
      "name": "Format Data",
      "type": "n8n-nodes-base.code",
      "position": [
        1664,
        208
      ],
      "parameters": {
        "jsCode": "// -------------------------------------------------------\n// \u3010\u8a2d\u5b9a\u30fb\u6e96\u5099\u3011\n// -------------------------------------------------------\n// \u524d\u6bb5\u306e\u30ce\u30fc\u30c9\u304b\u3089\u30c7\u30fc\u30bf\u3092\u4e00\u62ec\u53d6\u5f97\u3057\u307e\u3059\u3002\n// \u2605\u91cd\u8981\uff1a\u5143\u30c7\u30fc\u30bf\u3068\u3057\u3066\u300cLimit Items\u300d\u3067\u306f\u306a\u304f\u300cFilter Keywords\u300d\u3092\u4f7f\u3044\u307e\u3059\u3002\n// \u3053\u308c\u306b\u3088\u308a\u3001\u9664\u5916\u3055\u308c\u305f\u8a18\u4e8b\u306b\u3088\u308b\u9806\u5e8f\u30ba\u30ec\uff08Index Misalignment\uff09\u3092\u5b8c\u5168\u306b\u9632\u3052\u307e\u3059\u3002\nconst filteredItems = $('Filter Keywords').all();   // \u30d5\u30a3\u30eb\u30bf\u901a\u904e\u6e08\u307f\u306e\u5143\u8a18\u4e8b\u30c7\u30fc\u30bf\nconst aiAgentItems  = $('Rewrite Article').all();   // AI: \u8a18\u4e8b\u66f8\u304d\u63db\u3048\u306e\u7d50\u679c\nconst locationItems = $('Extract Location').all();  // AI: \u5834\u6240\u62bd\u51fa\u306e\u7d50\u679c\n\n// -------------------------------------------------------\n// \u3010\u30e1\u30a4\u30f3\u51e6\u7406\u3011\n// \u73fe\u5728\u306e\u5165\u529b\uff08Translate Content\uff09\u3092\u30eb\u30fc\u30d7\u51e6\u7406\u3057\u307e\u3059\n// -------------------------------------------------------\nreturn $input.all().map((item, index) => {\n  try {\n    // 1. \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4f7f\u3063\u305f\u5b89\u5168\u306a\u30c7\u30fc\u30bf\u306e\u7d10\u4ed8\u3051\n    // ---------------------------------------------------\n    // \u3059\u3079\u3066\u306e\u51e6\u7406\u306f\u300cFilter Keywords\u300d\u3092\u901a\u904e\u3057\u305f\u30ea\u30b9\u30c8\u306b\u5bfe\u3057\u3066\u9806\u306b\u884c\u308f\u308c\u3066\u3044\u308b\u305f\u3081\u3001\n    // index\u756a\u53f7\u306f\u5b8c\u5168\u306b\u4e00\u81f4\u3057\u307e\u3059\u3002\n    const originalData = filteredItems[index].json;\n    \n    // AI\u62bd\u51fa\u30c7\u30fc\u30bf\u304c\u306a\u3044\u5834\u5408\u306e\u30d5\u30a9\u30fc\u30eb\u30d0\u30c3\u30af\uff08\u5ff5\u306e\u305f\u3081\uff09\n    const locationName = locationItems[index]?.json?.output || \"N/A\";\n    const rewriteTextRaw = aiAgentItems[index]?.json?.output || \"\";\n\n\n    // 2. \u7ffb\u8a33\u30c7\u30fc\u30bf\uff08JSON\uff09\u306e\u30d1\u30fc\u30b9\u51e6\u7406\n    // ---------------------------------------------------\n    // Translate Content\u30ce\u30fc\u30c9\u304b\u3089\u306e\u51fa\u529b\uff08\u7ffb\u8a33JSON\uff09\u3092\u53d6\u5f97\n    const translationRaw = item.json.output || \"{}\";\n    \n    // \u30c7\u30d5\u30a9\u30eb\u30c8\u5024\u306e\u8a2d\u5b9a\n    let translations = { en: \"Translation Error\", zh: \"Translation Error\", ko: \"Translation Error\" };\n    \n    try {\n      // \u751f\u6210AI\u304c Markdown\u8a18\u53f7\uff08```json ... ```\uff09\u3092\u4ed8\u3051\u3066\u304f\u308b\u3053\u3068\u304c\u3042\u308b\u305f\u3081\u524a\u9664\u3057\u307e\u3059\n      const cleanJsonStr = translationRaw.replace(/```json|```/g, '').trim();\n      translations = JSON.parse(cleanJsonStr);\n    } catch (e) {\n      console.log(\"Translation JSON Parse Error: \", e);\n      // \u30a8\u30e9\u30fc\u6642\u306f\u305d\u306e\u307e\u307e\u30c6\u30ad\u30b9\u30c8\u3092\u5165\u308c\u308b\u306a\u3069\u3001\u67d4\u8edf\u306b\u5bfe\u5fdc\u53ef\u80fd\u3067\u3059\n    }\n\n\n    // 3. \u8a18\u4e8b\u672c\u6587\u306e\u6574\u5f62\uff08Markdown\u8a18\u53f7\u306e\u524a\u9664\uff09\n    // ---------------------------------------------------\n    // Google Sheets\u3084Slack\u3067\u898b\u3084\u3059\u304f\u3059\u308b\u305f\u3081\u3001Markdown\u306e\u898b\u51fa\u3057(#)\u3084\u5f37\u8abf(*)\u3092\u524a\u9664\n    const cleanBody = rewriteTextRaw\n      .replace(/[#*]/g, '')     // # \u3068 * \u3092\u524a\u9664\n      .replace(/\\n{3,}/g, '\\n\\n') // 3\u3064\u4ee5\u4e0a\u306e\u9023\u7d9a\u6539\u884c\u30922\u3064\u306b\u8a70\u3081\u308b\n      .trim();\n\n\n    // 4. \u8981\u7d04\uff08\u30b5\u30de\u30ea\u30fc\uff09\u306e\u62bd\u51fa\n    // ---------------------------------------------------\n    // \u300cRewrite Article\u300d\u304c\u751f\u6210\u3057\u305f\u3010\u8981\u70b9\u30b5\u30de\u30ea\u30fc\u3011\u306e\u90e8\u5206\u3060\u3051\u3092\u629c\u304d\u51fa\u3057\u307e\u3059\n    let summary = \"\";\n    const summaryMatch = rewriteTextRaw.match(/(?:\u3010\u8981\u70b9\u30b5\u30de\u30ea\u30fc\u3011|\u3010Key Points Summary\u3011|\u3010Summary\u3011)([\\s\\S]*?)(?=\u3010|$)/);\n    \n    if (summaryMatch && summaryMatch[1]) {\n      // \u7b87\u6761\u66f8\u304d\u8a18\u53f7\u3084\u4f59\u8a08\u306a\u6539\u884c\u3092\u6574\u7406\u3057\u3066\u30011\u884c\u306e\u6587\u7ae0\u306b\u3057\u307e\u3059\n      summary = summaryMatch[1]\n        .replace(/[\u30fb-]/g, '')\n        .replace(/\\n/g, ' ')\n        .trim();\n    } else {\n      // \u4e07\u304c\u4e00\u62bd\u51fa\u3067\u304d\u306a\u3044\u5834\u5408\u306f\u3001\u8a18\u4e8b\u306e\u5192\u982d120\u6587\u5b57\u3092\u4f7f\u7528\n      summary = cleanBody.substring(0, 120) + \"...\";\n    }\n\n\n    // 5. \u30c7\u30fc\u30bf\u306e\u7d50\u5408\u3068\u51fa\u529b\n    // ---------------------------------------------------\n    // \u6271\u3044\u3084\u3059\u30441\u3064\u306eJSON\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u307e\u3068\u3081\u307e\u3059\n    return {\n      json: {\n        title:          originalData.title,    // \u5143\u8a18\u4e8b\u306e\u30bf\u30a4\u30c8\u30eb (RSS\u7531\u6765)\n        url:            originalData.link,     // \u5143\u8a18\u4e8b\u306eURL (RSS\u7531\u6765)\n        location:       locationName,          // \u62bd\u51fa\u3057\u305f\u5834\u6240\n        short_summary:  summary,               // \u751f\u6210\u3057\u305f\u77ed\u3044\u8981\u7d04\n        original_clean: cleanBody,             // \u8aad\u307f\u3084\u3059\u304f\u6574\u5f62\u3057\u305f\u65e5\u672c\u8a9e\u8a18\u4e8b\u5168\u6587\n        \n        // \u7ffb\u8a33\u30c7\u30fc\u30bf\u3092\u5c55\u958b\n        en: translations.en,\n        zh: translations.zh,\n        ko: translations.ko\n      },\n      // \u30ce\u30fc\u30c9\u5b9f\u884c\u306e\u30da\u30a2\u30ea\u30f3\u30b0\u60c5\u5831\u3092\u7dad\u6301\n      pairedItem: item.pairedItem\n    };\n\n  } catch (error) {\n    // \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0: \u4f55\u304b\u5931\u6557\u3057\u3066\u3082\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u6b62\u3081\u305a\u30a8\u30e9\u30fc\u3092\u51fa\u529b\n    return {\n      json: {\n        error: \"Data Formatting Failed\",\n        message: error.message,\n        original_title: filteredItems[index]?.json?.title || \"Unknown\"\n      }\n    };\n  }\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "7c29f7c5-cced-4c96-99e8-f41d85bc5747",
      "name": "Save to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1808,
        208
      ],
      "parameters": {
        "columns": {
          "value": {
            "en": "={{ $('Format Data').item.json.en }}",
            "ko": "={{ $('Format Data').item.json.ko }}",
            "zh": "={{ $('Format Data').item.json.zh }}",
            "url": "={{ $json.url }}",
            "title": "={{ $json.title }}",
            "summary": "={{ $json.short_summary }}",
            "location": "={{ $('Extract Location').item.json.output }}"
          },
          "schema": [
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "summary",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "location",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "en",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "en",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "zh",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "zh",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ko",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "ko",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "url"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.YOUR_AWS_SECRET_KEY_HERE_DXvPVxXHbrbD834kNpg8-s/edit#gid=0",
          "cachedResultName": "\u30b7\u30fc\u30c81"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1Kud0dU9SAOjmwfFiU4MH_DXvPVxXHbrbD834kNpg8-s",
          "cachedResultUrl": "https://docs.google.YOUR_AWS_SECRET_KEY_HERE_DXvPVxXHbrbD834kNpg8-s/edit?usp=drivesdk",
          "cachedResultName": "\u30cb\u30e5\u30fc\u30b9\u81ea\u52d5\u7ffb\u8a33\u30ed\u30b0"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "c39053d2-33c8-4712-8a9a-bca8d7e45c54",
      "name": "Notify Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        1984,
        208
      ],
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09RFVAC7FD",
          "cachedResultName": "all-yuki"
        },
        "attachments": [
          {
            "text": "={{ $('Translate Content').item.json.output }}",
            "title": "={{ $('Extract Location').item.json.output }}",
            "footer": "=Original Article: {{ $('Limit Items').item.json.link }}",
            "title_link": "={{ $('Limit Items').item.json.link }}"
          },
          {
            "text": "=*English:* {{ $('Format Data').item.json.en }}  *Chinese:* {{ $('Format Data').item.json.zh }}  *Korean:* {{ $('Format Data').item.json.ko }}"
          }
        ],
        "messageType": "attachment",
        "otherOptions": {
          "includeLinkToWorkflow": false
        },
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "7a81257e-d854-41a6-ac57-e4b20a5d599a",
      "name": "Notify Skipped",
      "type": "n8n-nodes-base.slack",
      "position": [
        704,
        448
      ],
      "parameters": {
        "text": "==[Skipped Notification]\nThe article \"{{ $json.title }}\" did not match the keywords (Tokyo or Season), so summarization was skipped.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09RFVAC7FD",
          "cachedResultName": "all-yuki"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        },
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    }
  ],
  "connections": {
    "Format Data": {
      "main": [
        [
          {
            "node": "Save to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Limit Items": {
      "main": [
        [
          {
            "node": "Filter Keywords",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch RSS Feed": {
      "main": [
        [
          {
            "node": "Limit Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Keywords": {
      "main": [
        [
          {
            "node": "Rewrite Article",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Skipped",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rewrite Article": {
      "main": [
        [
          {
            "node": "Extract Location",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Location": {
      "main": [
        [
          {
            "node": "Translate Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Fetch RSS Feed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Rewrite Article",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Extract Location",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Translate Content": {
      "main": [
        [
          {
            "node": "Format Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Translate Content",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Save to Google Sheets": {
      "main": [
        [
          {
            "node": "Notify Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Overview This workflow automates news monitoring by fetching RSS feeds, rewriting content using AI, translating it (EN/ZH/KO), and archiving it.

Source: https://n8n.io/workflows/11301/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Who’s it for

RSS Feed Read, Agent, Google Sheets +3
AI & RAG

This project is an automated news publisher for LinkedIn. It uses RSS feeds to fetch news, processes the content with the Gemini API to generate precise summaries, and automatically publishes to Linke

Agent, Google Gemini Chat, RSS Feed Read +4
AI & RAG

This workflow is the AI analysis and alerting engine for a complete social media monitoring system. It's designed to work with data scraped from X (formerly Twitter) using a tool like the Apify Tweet

Google Sheets, Google Gemini Chat, Google Sheets Tool +4
AI & RAG

Categories Content Creation AI Automation Publishing Social Media

Google Docs, HTTP Request, Slack +7
AI & RAG

This workflow is designed for Japanese-speaking professionals, and learners who want to efficiently stay up to date with practical productivity, lifehack, and efficiency-related insights from Japanese

RSS Feed Read, Chain Llm, Google Gemini Chat +7