This workflow follows the Google Sheets → HTTP Request 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 →
{
"nodes": [
{
"parameters": {
"content": "## \u23f0 \u5b9a\u6642\u89f8\u767c\n\n\u6bcf\u5929\u65e9\u4e0a 6:00 \u57f7\u884c",
"height": 264,
"width": 220,
"color": 5
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-16,
0
],
"id": "4c18ee39-7a7c-473c-916f-7b8bbc93e158",
"name": "Sticky Note - Trigger"
},
{
"parameters": {
"content": "## \ud83d\udcca \u8b80\u53d6 Google Sheets\n\n\u7be9\u9078 sent=FALSE \u7684\u524d 10 \u7b46",
"height": 712,
"width": 280,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
224,
0
],
"id": "21b488f5-989f-4036-a787-fc54313fc42e",
"name": "Sticky Note - Read Sheets"
},
{
"parameters": {
"content": "## \ud83d\udcf1 \u767c\u9001 LINE\n\n\u7d44\u5408 Flex Message \u4e26\u767c\u9001\n\uff08\u542b\u6458\u8981\u7d71\u8a08 Bubble\uff09",
"height": 568,
"width": 400,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
704,
0
],
"id": "d8b3f009-f029-4b1b-8f9d-91ce7ca327dc",
"name": "Sticky Note - LINE"
},
{
"parameters": {
"content": "## \u2705 \u66f4\u65b0\u72c0\u614b\n\n\u5c07\u5df2\u767c\u9001\u7684\u6587\u7ae0\u6a19\u8a18\u70ba sent=TRUE",
"height": 568,
"width": 260,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1120,
0
],
"id": "02956191-b410-4553-995d-236f0df8dbb8",
"name": "Sticky Note - Update"
},
{
"parameters": {
"content": "## \ud83d\udd00 \u6aa2\u67e5\u662f\u5426\u6709\u6587\u7ae0\n\n\u6709\u6587\u7ae0 \u2192 \u767c\u9001\n\u7121\u6587\u7ae0 \u2192 \u8df3\u904e\u6216\u901a\u77e5",
"height": 264,
"width": 200,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
524,
0
],
"id": "sticky-check-articles",
"name": "Sticky Note - Check"
},
{
"parameters": {
"content": "## \u2699\ufe0f \u8a2d\u5b9a\u8aaa\u660e\n\n\u4f7f\u7528\u524d\u8acb\u5148\u8a2d\u5b9a\uff1a\n1. Google Sheets Credentials\n2. LINE Channel Access Token (Header Auth)\n3. \u66ff\u63db YOUR_LINE_USER_ID\n4. \u66ff\u63db Google Sheets \u6587\u4ef6 ID",
"height": 200,
"width": 300,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-16,
300
],
"id": "sticky-setup-guide",
"name": "Sticky Note - Setup"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 24
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
16,
112
],
"id": "e9dfe487-7395-4a3b-9b20-f80ef199aec8",
"name": "\u6bcf\u65e5 6:00 \u89f8\u767c"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "YOUR_GOOGLE_SHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "RSS_Feeds",
"mode": "name"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
288,
112
],
"id": "69721bfa-0fdd-4a4c-83e5-c87c67d4fd5c",
"name": "Read Google Sheets"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "filter-sent",
"leftValue": "={{ $json.sent }}",
"rightValue": "TRUE",
"operator": {
"type": "string",
"operation": "notEquals"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.filter",
"typeVersion": 2.2,
"position": [
288,
320
],
"id": "981ab90a-8329-4152-ac2d-2a6f77d0eae2",
"name": "Filter Unsent"
},
{
"parameters": {
"aggregate": "aggregateAllItemData",
"options": {}
},
"type": "n8n-nodes-base.aggregate",
"typeVersion": 1,
"position": [
464,
560
],
"id": "9aecc555-50e8-47e9-923b-0d728c9326a7",
"name": "Aggregate Items"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "check-has-items",
"leftValue": "={{ $json.data.length }}",
"rightValue": 0,
"operator": {
"type": "number",
"operation": "gt"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
560,
112
],
"id": "if-has-articles",
"name": "\u6709\u6587\u7ae0\uff1f"
},
{
"parameters": {
"jsCode": "const items = $input.first().json.data || [];\nconst today = new Date().toLocaleDateString('zh-TW', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n});\n\n// \u4f86\u6e90\u5c0d\u61c9 emoji\uff08\u53ef\u81ea\u884c\u64f4\u5145\uff09\nconst sourceEmoji = {\n 'DK': '\ud83d\udcdd',\n 'HN': '\ud83d\udd25',\n 'Steam': '\ud83c\udfae',\n 'LY Blog': '\ud83c\uddef\ud83c\uddf5'\n};\n\n// \u4f86\u6e90\u5c0d\u61c9\u984f\u8272\uff08\u53ef\u81ea\u884c\u64f4\u5145\uff09\nconst sourceColor = {\n 'DK': '#4A90A4',\n 'HN': '#FF6600',\n 'Steam': '#1B2838',\n 'LY Blog': '#00C300'\n};\n\n// ===== \u5efa\u7acb\u6458\u8981\u7d71\u8a08 Bubble =====\nconst sourceCounts = {};\nitems.forEach(item => {\n const src = item.source || 'Unknown';\n sourceCounts[src] = (sourceCounts[src] || 0) + 1;\n});\n\n// \u5efa\u7acb\u4f86\u6e90\u7d71\u8a08\u5217\u8868\nconst sourceStats = Object.entries(sourceCounts).map(([source, count]) => {\n const emoji = sourceEmoji[source] || '\ud83d\udcf0';\n return {\n \"type\": \"box\",\n \"layout\": \"horizontal\",\n \"contents\": [\n {\n \"type\": \"text\",\n \"text\": `${emoji} ${source}`,\n \"size\": \"sm\",\n \"color\": \"#555555\",\n \"flex\": 4\n },\n {\n \"type\": \"text\",\n \"text\": `${count} \u7bc7`,\n \"size\": \"sm\",\n \"color\": \"#111111\",\n \"align\": \"end\",\n \"flex\": 1\n }\n ]\n };\n});\n\n// \u6458\u8981 Bubble\nconst summaryBubble = {\n \"type\": \"bubble\",\n \"size\": \"kilo\",\n \"header\": {\n \"type\": \"box\",\n \"layout\": \"vertical\",\n \"contents\": [\n {\n \"type\": \"text\",\n \"text\": \"\ud83d\udcca \u4eca\u65e5\u6458\u8981\",\n \"weight\": \"bold\",\n \"size\": \"lg\",\n \"color\": \"#1DB446\"\n },\n {\n \"type\": \"text\",\n \"text\": today,\n \"size\": \"xs\",\n \"color\": \"#999999\",\n \"margin\": \"sm\"\n }\n ],\n \"paddingAll\": \"15px\",\n \"backgroundColor\": \"#F5F5F5\"\n },\n \"body\": {\n \"type\": \"box\",\n \"layout\": \"vertical\",\n \"contents\": [\n {\n \"type\": \"box\",\n \"layout\": \"horizontal\",\n \"contents\": [\n {\n \"type\": \"text\",\n \"text\": \"\u7e3d\u8a08\",\n \"size\": \"md\",\n \"color\": \"#555555\",\n \"weight\": \"bold\",\n \"flex\": 4\n },\n {\n \"type\": \"text\",\n \"text\": `${items.length} \u7bc7`,\n \"size\": \"md\",\n \"color\": \"#1DB446\",\n \"weight\": \"bold\",\n \"align\": \"end\",\n \"flex\": 1\n }\n ]\n },\n {\n \"type\": \"separator\",\n \"margin\": \"lg\"\n },\n {\n \"type\": \"box\",\n \"layout\": \"vertical\",\n \"contents\": sourceStats,\n \"margin\": \"lg\",\n \"spacing\": \"sm\"\n }\n ],\n \"paddingAll\": \"15px\"\n }\n};\n\n// ===== \u5efa\u7acb\u6bcf\u7bc7\u6587\u7ae0\u7684 bubble =====\nconst articleBubbles = items.map((item, index) => {\n const emoji = sourceEmoji[item.source] || '\ud83d\udcf0';\n const color = sourceColor[item.source] || '#666666';\n \n const title = item.title || item.col_1 || item.link || '\u7121\u6a19\u984c';\n const summary = item.summary || '\u7121\u6458\u8981\u5167\u5bb9';\n const link = item.link || 'https://example.com';\n \n return {\n \"type\": \"bubble\",\n \"size\": \"kilo\",\n \"header\": {\n \"type\": \"box\",\n \"layout\": \"horizontal\",\n \"contents\": [\n {\n \"type\": \"text\",\n \"text\": emoji,\n \"size\": \"sm\",\n \"flex\": 0\n },\n {\n \"type\": \"text\",\n \"text\": item.source || 'Unknown',\n \"size\": \"sm\",\n \"color\": color,\n \"weight\": \"bold\",\n \"margin\": \"sm\"\n }\n ],\n \"paddingAll\": \"12px\",\n \"backgroundColor\": \"#F5F5F5\"\n },\n \"body\": {\n \"type\": \"box\",\n \"layout\": \"vertical\",\n \"contents\": [\n {\n \"type\": \"text\",\n \"text\": title,\n \"weight\": \"bold\",\n \"size\": \"md\",\n \"wrap\": true,\n \"maxLines\": 2\n },\n {\n \"type\": \"text\",\n \"text\": summary,\n \"size\": \"sm\",\n \"color\": \"#666666\",\n \"wrap\": true,\n \"margin\": \"md\",\n \"maxLines\": 5\n }\n ],\n \"paddingAll\": \"12px\"\n },\n \"footer\": {\n \"type\": \"box\",\n \"layout\": \"vertical\",\n \"contents\": [\n {\n \"type\": \"button\",\n \"action\": {\n \"type\": \"uri\",\n \"label\": \"\u95b1\u8b80\u539f\u6587\",\n \"uri\": link\n },\n \"style\": \"primary\",\n \"color\": color,\n \"height\": \"sm\"\n }\n ],\n \"paddingAll\": \"12px\"\n }\n };\n});\n\n// \u7d44\u5408\uff1a\u6458\u8981 + \u6587\u7ae0\u5011\nconst allBubbles = [summaryBubble, ...articleBubbles];\n\n// \u7d44\u5408\u6210 carousel\nconst flexMessage = {\n \"type\": \"flex\",\n \"altText\": `\ud83d\udcf0 \u6bcf\u65e5\u8cc7\u8a0a\u6458\u8981 - ${today} (${items.length}\u7bc7)`,\n \"contents\": {\n \"type\": \"carousel\",\n \"contents\": allBubbles\n }\n};\n\n// \u56de\u50b3 Flex Message \u548c\u539f\u59cb items (\u4f9b\u5f8c\u7e8c\u66f4\u65b0\u7528)\nreturn {\n json: {\n flexMessage,\n items,\n rowNumbers: items.map((item, idx) => item.row_number)\n }\n};"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
752,
112
],
"id": "c326027c-5dac-453b-b8eb-b834856f5685",
"name": "Build Flex Message"
},
{
"parameters": {
"method": "POST",
"url": "https://api.line.me/v2/bot/message/push",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"to\": \"YOUR_LINE_USER_ID\",\n \"messages\": [\n {{ JSON.stringify($json.flexMessage) }}\n ]\n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
944,
112
],
"id": "fddc401e-32e0-4e9d-9521-aa437009f78f",
"name": "LINE Push Message"
},
{
"parameters": {
"jsCode": "// \u53d6\u5f97\u8981\u66f4\u65b0\u7684 items\nconst items = $('Build Flex Message').first().json.items;\n\n// \u70ba\u6bcf\u500b item \u5efa\u7acb\u66f4\u65b0\u8cc7\u6599\nreturn items.map(item => ({\n json: {\n title: item.title,\n link: item.link,\n summary: item.summary,\n source: item.source,\n created_at: item.created_at,\n sent: 'TRUE'\n }\n}));\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1168,
112
],
"id": "70cdc265-82b5-4067-9519-4b7e653953b8",
"name": "Prepare Update Data"
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "YOUR_GOOGLE_SHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "RSS_Feeds",
"mode": "name"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"sent": "={{ $json.sent }}",
"row_number": 0,
"link": "={{ $json.link }}"
},
"matchingColumns": [
"link"
],
"schema": [
{
"id": "link",
"displayName": "link",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "summary",
"displayName": "summary",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "source",
"displayName": "source",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "created_at",
"displayName": "created_at",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "sent",
"displayName": "sent",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"cellFormat": "USER_ENTERED"
}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
1168,
352
],
"id": "65af66ad-73e0-49d6-b397-88751d0a6da9",
"name": "Update sent=TRUE"
},
{
"parameters": {
"maxItems": 10
},
"type": "n8n-nodes-base.limit",
"typeVersion": 1,
"position": [
304,
560
],
"id": "1f7c99de-ab8e-4459-b48b-ded2bd1944eb",
"name": "Limit 10"
},
{
"parameters": {},
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
752,
320
],
"id": "no-op-skip",
"name": "\u7121\u6587\u7ae0 - \u8df3\u904e"
}
],
"connections": {
"\u6bcf\u65e5 6:00 \u89f8\u767c": {
"main": [
[
{
"node": "Read Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Read Google Sheets": {
"main": [
[
{
"node": "Filter Unsent",
"type": "main",
"index": 0
}
]
]
},
"Filter Unsent": {
"main": [
[
{
"node": "Limit 10",
"type": "main",
"index": 0
}
]
]
},
"Limit 10": {
"main": [
[
{
"node": "Aggregate Items",
"type": "main",
"index": 0
}
]
]
},
"Aggregate Items": {
"main": [
[
{
"node": "\u6709\u6587\u7ae0\uff1f",
"type": "main",
"index": 0
}
]
]
},
"\u6709\u6587\u7ae0\uff1f": {
"main": [
[
{
"node": "Build Flex Message",
"type": "main",
"index": 0
}
],
[
{
"node": "\u7121\u6587\u7ae0 - \u8df3\u904e",
"type": "main",
"index": 0
}
]
]
},
"Build Flex Message": {
"main": [
[
{
"node": "LINE Push Message",
"type": "main",
"index": 0
}
]
]
},
"LINE Push Message": {
"main": [
[
{
"node": "Prepare Update Data",
"type": "main",
"index": 0
}
]
]
},
"Prepare Update Data": {
"main": [
[
{
"node": "Update sent=TRUE",
"type": "main",
"index": 0
}
]
]
}
},
"meta": {
"templateCredsSetupCompleted": true
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
N8N Dailyline Sender. Uses googleSheets, httpRequest. Scheduled trigger; 17 nodes.
Source: https://gist.github.com/kkdai/1fa447799a498be089ad56fe95e80a3a — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow automates video distribution to 9 social platforms simultaneously using Blotato's API. It includes both a scheduled publisher (checks Google Sheets for videos marked "Ready") and a subwo
YogiAI. Uses googleSheets, googleSheetsTool, httpRequest, stopAndError. Scheduled trigger; 61 nodes.
This workflow monitors Google Calendar for events indicating that a customer will visit the company today or the next day, retrieves the required details, and sends reminder notifications to the relev
ofn hook v0.24.0 beta. Uses start, httpRequest, functionItem, itemLists. Scheduled trigger; 42 nodes.
Security teams, DevOps engineers, vulnerability analysts, and automation builders who want to eliminate repetitive Nessus scan parsing, AI-based risk triage, and manual reporting. Designed for orgs fo