我的工作流18
高级
这是一个Market Research领域的自动化工作流,包含 18 个节点。主要使用 Code, Wait, Merge, HttpRequest, GoogleSheets 等节点。 使用 Google SERP、Serper API 和 Google Sheets 追踪每周关键词排名
前置要求
- •可能需要目标 API 的认证凭证
- •Google Sheets API 凭证
分类
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "HPsY2j0Wk84xZipZ",
"meta": {
"instanceId": "ffd5dda69b118004d427fd517c0493454f38d8834199f20f132d1135940c285f"
},
"name": "我的工作流18",
"tags": [],
"nodes": [
{
"id": "30bf61f8-a164-4a3e-b2b4-554a1cd3cd3d",
"name": "遍历项目",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1248,
752
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "dead8ec9-9186-4d66-ac87-bc6a8878b05c",
"name": "获取目标关键词",
"type": "n8n-nodes-base.googleSheets",
"position": [
912,
752
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1820594268,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dXoeWqh7a3HO9cy8Z7-W90ZG8wTimm5mDogMgBMTugs/edit#gid=1820594268",
"cachedResultName": "Sheet2"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1dXoeWqh7a3HO9cy8Z7-W90ZG8wTimm5mDogMgBMTugs",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dXoeWqh7a3HO9cy8Z7-W90ZG8wTimm5mDogMgBMTugs/edit?usp=drivesdk",
"cachedResultName": "Zuno - Weekly Keyword Ranking Tracker"
},
"authentication": "serviceAccount"
},
"retryOnFail": true,
"typeVersion": 4.6,
"alwaysOutputData": true
},
{
"id": "ab647825-d72d-44eb-b6e3-14ec81807f86",
"name": "在Google上搜索关键词",
"type": "n8n-nodes-base.httpRequest",
"position": [
1856,
592
],
"parameters": {
"url": "=https://google.serper.dev/search",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"bodyParameters": {
"parameters": [
{
"name": "q",
"value": "={{ $json.Keyword }}"
},
{
"name": "gl",
"value": "in"
},
{
"name": "num",
"value": "100"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "X-API-KEY",
"value": "={{$credentials.serperApiKey}}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"retryOnFail": false,
"typeVersion": 4.2,
"alwaysOutputData": true
},
{
"id": "52387416-4587-42ca-ac8a-4a36a62f2f7e",
"name": "提取排名和URL",
"type": "n8n-nodes-base.code",
"position": [
2144,
592
],
"parameters": {
"jsCode": "/**\n * n8n Code (Code v2)\n * Behavior:\n * - Looks for today's date (Asia/Kolkata). If any \"Date N\" already equals today, it updates that same N.\n * - Otherwise, it finds the first empty \"Date N\" and writes there.\n * - If domain not found in SERP → position = 100 and link = null.\n * - Prevents overwriting filled dates unless it's the same day (unless you enable OVERWRITE_IF_ALL_FILLED).\n *\n * Requires:\n * - A node named \"Get Targeted Keywords\" (or adapt the selector below) that returns the row with `row_number` (or `rowNumber`)\n * - Columns in the sheet:\n * Ranking Date 1..12, Ranking URL Date 1..12, Date 1..12\n */\n\nconst MAX_SLOTS = 12; // ✅ now 12\nconst OVERWRITE_IF_ALL_FILLED = false; // set true to overwrite the last slot if all are filled\n\n// ---- Target domain / URL detection ----\n// Option A: hardcode a domain (kept for compatibility)\nconst HARDCODED_DOMAIN = \"Update Your Domain\";\n\n// --- helpers ---\nfunction dateInIST(d = new Date()) {\n const istOffsetMin = 330; // +05:30\n return new Date(d.getTime() + (istOffsetMin - d.getTimezoneOffset()) * 60000);\n}\nfunction todayISTString() {\n return dateInIST().toISOString().split(\"T\")[0]; // YYYY-MM-DD\n}\nfunction safeTrim(v) {\n return (v ?? \"\").toString().trim();\n}\nfunction getDomainFromUrl(u) {\n try {\n const url = new URL(u);\n // normalize to scheme + host (like https://example.com/)\n return `${url.protocol}//${url.host}/`;\n } catch {\n return \"\";\n }\n}\n\n// --- get the sheet row (rename the node name if needed) ---\nconst row = $('Get Targeted Keywords').first().json || {};\nconst rowNumber = row.rowNumber ?? row.row_number;\nif (!rowNumber) {\n return [{ json: { error: \"Missing rowNumber/row_number from sheet row.\", debug: row } }];\n}\n\n// Try to use the exact page/target URL from sheet if present\nconst targetUrl = row[\"Target Page\"] || row[\"Page\"] || \"\";\nconst inferredDomain = getDomainFromUrl(targetUrl);\nconst targetDomain = inferredDomain || HARDCODED_DOMAIN;\n\n// --- parse SERP (expects this node input to have an 'organic' array with {link}) ---\nconst organicResults = $json.organic || [];\n\n// Defaults when NOT found\nlet foundDomain = false;\nlet foundExactUrl = false;\nlet position = 100;\nlet link = null;\n\nfor (let i = 0; i < organicResults.length; i++) {\n const currentLink = organicResults[i].link || \"\";\n if (!currentLink) continue;\n\n if (currentLink.includes(targetDomain)) {\n foundDomain = true;\n position = i + 1; // actual rank\n link = currentLink; // actual URL\n if (safeTrim(targetUrl) && currentLink === targetUrl) foundExactUrl = true;\n break;\n }\n}\n\n// --- choose the Date slot ---\nconst today = todayISTString();\n\n// 1) If any Date N already equals today, update that same N\nlet slot = null;\nfor (let i = 1; i <= MAX_SLOTS; i++) {\n const dateKey = `Date ${i}`;\n const val = safeTrim(row[dateKey]);\n if (val === today) {\n slot = i;\n break;\n }\n}\n\n// 2) Else pick the first empty Date N\nif (slot === null) {\n for (let i = 1; i <= MAX_SLOTS; i++) {\n const dateKey = `Date ${i}`;\n const val = safeTrim(row[dateKey]);\n if (val === \"\") {\n slot = i;\n break;\n }\n }\n}\n\n// 3) If all filled\nif (slot === null) {\n if (!OVERWRITE_IF_ALL_FILLED) {\n return [{\n json: {\n error: `All ${MAX_SLOTS} date slots are filled for row ${rowNumber}. Add more columns or enable OVERWRITE_IF_ALL_FILLED.`,\n rowNumber\n }\n }];\n } else {\n slot = MAX_SLOTS; // overwrite the last slot\n }\n}\n\n// Build dynamic keys for the chosen slot\nconst rankCol = `Ranking Date ${slot}`;\nconst urlCol = `Ranking URL Date ${slot}`;\nconst dateCol = `Date ${slot}`;\n\n// Minimal payload to update ONLY these three cells\nreturn [{\n json: {\n rowNumber,\n [rankCol]: position, // actual rank or 100 if not found\n [urlCol]: link, // actual URL or null if not found\n [dateCol]: today, // execution date (IST)\n _debug: { foundDomain, foundExactUrl, position, link, targetUrl, inferredDomain: targetDomain, slot, today }\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "e9fb2f80-f241-4c02-a966-7a1e4d4df014",
"name": "合并结果",
"type": "n8n-nodes-base.merge",
"position": [
2416,
752
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "1e544677-74ea-4d92-8677-31697f08e41b",
"name": "格式化输出",
"type": "n8n-nodes-base.code",
"position": [
2720,
976
],
"parameters": {
"jsCode": "/**\n * INPUTS (from a Merge node or two incoming connections):\n * A) update payload item (e.g. { rowNumber, \"Ranking Date 1\": 1, \"Ranking URL Date 1\": \"...\", \"Date 1\": \"YYYY-MM-DD\" })\n * B) sheet row item (e.g. { row_number: 2, Page, Keyword, \"Ranking Date 1\", \"Date 1\", ... })\n *\n * OUTPUT:\n * Single item with:\n * - rowNumber\n * - ALL existing columns from the sheet row\n * - overlaid updated fields (only the changed date/week keys)\n *\n * Notes:\n * - Works with either Week or Date column schemes.\n * - Keeps nulls as null (no coercion), so link can stay null when not found.\n */\n\nconst items = $input.all().map(i => i.json);\n\n// Detectors\nfunction looksLikeRow(obj) {\n return (('row_number' in obj) || ('rowNumber' in obj)) && ('Keyword' in obj || 'Page' in obj);\n}\nfunction looksLikeUpdate(obj) {\n const keys = Object.keys(obj);\n // date scheme\n const hasRankDate = keys.some(k => /^Ranking Date \\d+$/.test(k));\n const hasUrlDate = keys.some(k => /^Ranking URL Date \\d+$/.test(k));\n const hasDate = keys.some(k => /^Date \\d+$/.test(k));\n // week scheme (kept for backwards-compat)\n const hasRankWeek = keys.some(k => /^Ranking Week \\d+$/.test(k));\n const hasUrlWeek = keys.some(k => /^Ranking URL Week \\d+$/.test(k));\n return (hasRankDate || hasUrlDate || hasDate || hasRankWeek || hasUrlWeek);\n}\n\nconst row = items.find(looksLikeRow) || {};\nconst upd = items.find(looksLikeUpdate) || {};\n\nconst rowNumber = row.rowNumber ?? row.row_number ?? upd.rowNumber;\nif (!rowNumber) {\n return [{ json: { error: \"rowNumber missing. Ensure the sheet row and update payload reach this node.\", debug: items } }];\n}\n\n// Start with rowNumber\nconst payload = { rowNumber };\n\n// 1) copy ALL existing columns from the sheet row\nfor (const [k, v] of Object.entries(row)) {\n if (k === 'row_number' || k === 'rowIndex' || k === 'rowNumber') continue; // internal keys\n payload[k] = v;\n}\n\n// 2) overlay ONLY updated fields from the update item\nfor (const [k, v] of Object.entries(upd)) {\n if (k === 'row_number' || k === 'rowNumber' || k.startsWith('_')) continue; // skip internal/meta\n // leave nulls as null (so link can stay null when domain not found)\n payload[k] = v;\n}\n\nreturn [{ json: payload }];\n"
},
"typeVersion": 2
},
{
"id": "c3f4ebaa-9836-49b8-96ac-8dd4550771c5",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
288,
272
],
"parameters": {
"color": 6,
"width": 3312,
"height": 1104,
"content": "## 每周目标关键词排名(Google搜索结果页)"
},
"typeVersion": 1
},
{
"id": "259e8d37-9b70-42c6-bf5c-ac40a73626ee",
"name": "每周一运行",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
656,
752
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 0 * * MON"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "bff36e54-bf3a-4943-a558-3b4ba25a99b9",
"name": "更新排名和URL(Google表格)",
"type": "n8n-nodes-base.googleSheets",
"position": [
2960,
1072
],
"parameters": {
"columns": {
"value": {
"Page": "={{ $json.Page }}",
"Sr.no": "={{ $json[\"Sr.no\"] }}",
"Date 1": "={{ $json[\"Date 1\"] }}",
"Date 2": "={{ $json[\"Date 2\"] }}",
"Date 3": "={{ $json[\"Date 3\"] }}",
"Date 4": "={{ $json[\"Date 4\"] }}",
"Date 5": "={{ $json[\"Date 5\"] }}",
"Date 6": "={{ $json[\"Date 6\"] }}",
"Date 7": "={{ $json[\"Date 7\"] }}",
"Date 8": "={{ $json[\"Date 8\"] }}",
"Date 9": "={{ $json[\"Date 9\"] }}",
"Date 10": "={{ $json[\"Date 10\"] }}",
"Date 11": "={{ $json[\"Date 11\"] }}",
"Date 12": "={{ $json[\"Date 12\"] }}",
"Keyword": "={{ $json.Keyword }}",
"Ranking Date 1": "={{ $json[\"Ranking Date 1\"] }}",
"Ranking Date 2": "={{ $json[\"Ranking Date 2\"] }}",
"Ranking Date 3": "={{ $json[\"Ranking Date 3\"] }}",
"Ranking Date 4": "={{ $json[\"Ranking Date 4\"] }}",
"Ranking Date 5": "={{ $json[\"Ranking Date 5\"] }}",
"Ranking Date 6": "={{ $json[\"Ranking Date 6\"] }}",
"Ranking Date 7": "={{ $json[\"Ranking Date 7\"] }}",
"Ranking Date 8": "={{ $json[\"Ranking Date 8\"] }}",
"Ranking Date 9": "={{ $json[\"Ranking Date 9\"] }}",
"Ranking Date 10": "={{ $json[\"Ranking Date 10\"] }}",
"Ranking Date 11": "={{ $json[\"Ranking Date 11\"] }}",
"Ranking Date 12": "={{ $json[\"Ranking Date 12\"] }}",
"Ranking URL Date 1": "={{ $json[\"Ranking URL Date 1\"] }}",
"Ranking URL Date 2": "={{ $json[\"Ranking URL Date 2\"] }}",
"Ranking URL Date 3": "={{ $json[\"Ranking URL Date 3\"] }}",
"Ranking URL Date 4": "={{ $json[\"Ranking URL Date 4\"] }}",
"Ranking URL Date 5": "={{ $json[\"Ranking URL Date 5\"] }}",
"Ranking URL Date 6": "={{ $json[\"Ranking URL Date 6\"] }}",
"Ranking URL Date 7": "={{ $json[\"Ranking URL Date 7\"] }}",
"Ranking URL Date 8": "={{ $json[\"Ranking URL Date 8\"] }}",
"Ranking URL Date 9": "={{ $json[\"Ranking URL Date 9\"] }}",
"Ranking URL Date 10": "={{ $json[\"Ranking URL Date 10\"] }}",
"Ranking URL Date 11": "={{ $json[\"Ranking URL Date 11\"] }}",
"Ranking URL Date 12": "={{ $json[\"Ranking URL Date 12\"] }}"
},
"schema": [
{
"id": "Sr.no",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Sr.no",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Page",
"type": "string",
"display": true,
"required": false,
"displayName": "Page",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Keyword",
"type": "string",
"display": true,
"required": false,
"displayName": "Keyword",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 1",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 1",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 1",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 2",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 2",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 2",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 3",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 3",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 3",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 4",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 4",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 4",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 5",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 5",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 5",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 5",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 5",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 5",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 6",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 6",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 6",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 6",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 6",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 6",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 7",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 7",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 7",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 7",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 7",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 7",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 8",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 8",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 8",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 8",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 8",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 8",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 9",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 9",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 9",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 9",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 9",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 9",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 10",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 10",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 10",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 10",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 10",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 10",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 11",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 11",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 11",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 11",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 11",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 11",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking Date 12",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking Date 12",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ranking URL Date 12",
"type": "string",
"display": true,
"required": false,
"displayName": "Ranking URL Date 12",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date 12",
"type": "string",
"display": true,
"required": false,
"displayName": "Date 12",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Sr.no"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "your-sheet-name",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dXoeWqh7a3HO9cy8Z7-W90ZG8wTimm5mDogMgBMTugs/edit#gid=1820594268",
"cachedResultName": "Sheet2"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "your-google-sheet-id",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dXoeWqh7a3HO9cy8Z7-W90ZG8wTimm5mDogMgBMTugs/edit?usp=drivesdk",
"cachedResultName": "Zuno - Weekly Keyword Ranking Tracker"
},
"authentication": "serviceAccount"
},
"typeVersion": 4.6
},
{
"id": "455b4dec-5fb5-4d2d-af45-505064b4701c",
"name": "便利贴(设置检查清单)",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-80
],
"parameters": {
"width": 656,
"height": 272,
"content": "## 设置检查清单"
},
"typeVersion": 1
},
{
"id": "142853d2-4686-4e07-9c8f-61fcb30c42e0",
"name": "便利贴(关键词)",
"type": "n8n-nodes-base.stickyNote",
"position": [
816,
912
],
"parameters": {
"width": 336,
"height": 272,
"content": "## Google表格设置(读取关键词)"
},
"typeVersion": 1
},
{
"id": "9d8b0355-9564-4a96-a3d7-eb4388e88949",
"name": "便利贴(Serper)",
"type": "n8n-nodes-base.stickyNote",
"position": [
1520,
368
],
"parameters": {
"width": 448,
"height": 208,
"content": "## Serper API设置"
},
"typeVersion": 1
},
{
"id": "f065a6fa-fa63-495c-ab77-4b38bb536f81",
"name": "便利贴(提取)",
"type": "n8n-nodes-base.stickyNote",
"position": [
2256,
416
],
"parameters": {
"width": 352,
"height": 208,
"content": "## 提取排名和URL"
},
"typeVersion": 1
},
{
"id": "5345af1a-3760-4600-917a-cb70b9599dd7",
"name": "便利贴(更新表格)",
"type": "n8n-nodes-base.stickyNote",
"position": [
3120,
1040
],
"parameters": {
"width": 400,
"height": 208,
"content": "## Google表格设置(写入排名)"
},
"typeVersion": 1
},
{
"id": "27118c11-77ea-4d07-bd58-fbe39d9ffa38",
"name": "便利贴(Cron)",
"type": "n8n-nodes-base.stickyNote",
"position": [
560,
576
],
"parameters": {
"width": 256,
"content": "## Cron触发器"
},
"typeVersion": 1
},
{
"id": "62a99293-63e0-4330-ac42-9fda4c79f1c1",
"name": "便利贴(格式化)",
"type": "n8n-nodes-base.stickyNote",
"position": [
2256,
976
],
"parameters": {
"width": 352,
"height": 192,
"content": "## 格式化输出"
},
"typeVersion": 1
},
{
"id": "72892fc6-105e-47e5-8f0e-0e04b31e8698",
"name": "当点击\"执行工作流\"时",
"type": "n8n-nodes-base.manualTrigger",
"position": [
448,
1008
],
"parameters": {},
"typeVersion": 1
},
{
"id": "d843cd8f-8720-4ce2-9bcb-2b967835c135",
"name": "关键词查询之间的延迟",
"type": "n8n-nodes-base.wait",
"position": [
1536,
768
],
"webhookId": "a50b0992-f2e9-425a-9bfa-2a8296f3a884",
"parameters": {
"amount": 10
},
"typeVersion": 1.1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "376ae7b0-def1-48a0-aeb7-9a8661a45a5e",
"connections": {
"Merging Result": {
"main": [
[
{
"node": "Formating output",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Delay Between Keyword Queries",
"type": "main",
"index": 0
}
]
]
},
"Formating output": {
"main": [
[
{
"node": "Update Rank and URLs (Google Sheet)",
"type": "main",
"index": 0
}
]
]
},
"Run Every Monday": {
"main": [
[
{
"node": "Get Targeted Keywords",
"type": "main",
"index": 0
}
]
]
},
"Get Targeted Keywords": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Extracting Ranking & URL": {
"main": [
[
{
"node": "Merging Result",
"type": "main",
"index": 0
}
]
]
},
"Keyword Searching on Google": {
"main": [
[
{
"node": "Extracting Ranking & URL",
"type": "main",
"index": 0
}
]
]
},
"Delay Between Keyword Queries": {
"main": [
[
{
"node": "Keyword Searching on Google",
"type": "main",
"index": 0
},
{
"node": "Merging Result",
"type": "main",
"index": 1
}
]
]
},
"Update Rank and URLs (Google Sheet)": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 市场调研
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
多站点产品价格监控:Claude-Sonnet、Google Sheets和Telegram提醒
使用Firecrawl、Claude-Sonnet AI和Telegram提醒的电商价格监控系统
Code
Wait
Merge
+10
19 节点Cheng Siong Chin
市场调研
Sitemap.xml 元数据导出至 Google Sheets(标题、元描述和 URL)
Sitemap.xml 元数据导出至 Google Sheets(标题、元描述和 URL)
Code
Wait
Merge
+5
12 节点Jemee
市场调研
潜在客户开发与邮件工作流
使用Google Maps、SendGrid和AI自动化B2B潜在客户开发与邮件营销
If
Set
Code
+21
141 节点Ezema Kingsley Chibuzo
潜在客户开发
Twitter品牌自动推广
使用Anthropic Claude AI和Google Sheets报告自动进行Twitter品牌推广
Set
Code
Wait
+10
26 节点Pavlo Hurhu
社交媒体
在可视化参考库中探索n8n节点
在可视化参考库中探索n8n节点
If
Ftp
Set
+93
113 节点I versus AI
其他
(Duc)深度研究市场模板
集成PerplexityAI研究和OpenAI内容的多层级WordPress博客生成器
If
Set
Xml
+28
132 节点Daniel Ng
人工智能
工作流信息
难度等级
高级
节点数量18
分类1
节点类型9
作者
Amuratech
@amuratechWith over 16+ years in the marketing sector, Amura has established itself as the fastest-growing AI-driven growth marketing agency in India. With a blend of creativity and a data-driven marketing approach, Amura offers various services across various industries.
外部链接
在 n8n.io 查看 →
分享此工作流