使用 OpenWeather API、Google Sheets 和 Gmail 的每日天气报告
中级
这是一个Personal Productivity领域的自动化工作流,包含 7 个节点。主要使用 Html, Gmail, HttpRequest, GoogleSheets, ScheduleTrigger 等节点。 每日天气报告:OpenWeather API、Google Sheets 和 Gmail
前置要求
- •Google 账号和 Gmail API 凭证
- •可能需要目标 API 的认证凭证
- •Google Sheets API 凭证
分类
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "ONGqVR4QHDYAI40u",
"meta": {
"instanceId": "14e4c77104722ab186539dfea5182e419aecc83d85963fe13f6de862c875ebfa",
"templateCredsSetupCompleted": true
},
"name": "使用 OpenWeather API、Google Sheets 和 Gmail 的每日天气报告",
"tags": [],
"nodes": [
{
"id": "5d9003c3-5608-4dc5-8b0b-ba712c0799d4",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
340,
40
],
"parameters": {
"width": 1220,
"height": 260,
"content": "## 使用 OpenWeather API、Google Sheets 和 Gmail 的每日天气报告"
},
"typeVersion": 1
},
{
"id": "0842de03-5376-4161-9581-25982d90467c",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
340,
320
],
"parameters": {
"width": 1220,
"height": 400,
"content": "## 节点分解与描述:"
},
"typeVersion": 1
},
{
"id": "babd8c14-906e-498d-a35c-5637e1378ce0",
"name": "从 OpenWeather 获取天气",
"type": "n8n-nodes-base.httpRequest",
"notes": "Fetching the weather data",
"position": [
660,
120
],
"parameters": {
"url": "https://api.openweathermap.org/data/2.5/weather?",
"options": {},
"sendQuery": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpQueryAuth",
"queryParameters": {
"parameters": [
{
"name": "lon",
"value": ""
},
{
"name": "lat",
"value": ""
}
]
}
},
"credentials": {
"httpQueryAuth": {
"id": "h1tx2g2jKOEWOqIr",
"name": "Query Auth account 3"
}
},
"notesInFlow": true,
"typeVersion": 4.2
},
{
"id": "fdddcafa-d579-4d13-b624-80c66d02d78c",
"name": "将天气数据追加到 Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
880,
120
],
"parameters": {
"columns": {
"value": {
"Country": "={{ $json.sys.country }}",
"Location": "={{ $json.coord }}",
"Humidity (%)": "={{ $json.main.humidity }}",
"Sunset (UTC)": "={{ $json.sys.sunset }}",
"Sunrise (UTC)": "={{ $json.sys.sunrise }}",
"Cloudiness (%)": "={{ $json.clouds.all }}",
"Max Temp (°C)": "={{ $json.main.temp_max }}",
"Min Temp (°C)": "={{ $json.main.temp_min }}",
"Pressure (hPa)": "={{ $json.main.pressure }}",
"Visibility (m)": "={{ $json.visibility }}",
"Date Time (UTC)": "={{ $json.dt }}",
"Sea Level (hPa)": "={{ $json.main.sea_level }}",
"Wind Gust (m/s)": "={{ $json.wind.gust }}",
"Feels Like (°C)": "={{ $json.main.feels_like }}",
"Wind Speed (m/s)": "={{ $json.wind.speed }}",
"Temperature (°C)": "={{ $json.main.temp }}",
"Ground Level (hPa)": "={{ $json.main.grnd_level }}",
"Wind Direction (°)": "={{ $json.wind.deg }}"
},
"schema": [
{
"id": "Location",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Location",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Country",
"type": "string",
"display": true,
"required": false,
"displayName": "Country",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Temperature (°C)",
"type": "string",
"display": true,
"required": false,
"displayName": "Temperature (°C)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Feels Like (°C)",
"type": "string",
"display": true,
"required": false,
"displayName": "Feels Like (°C)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Min Temp (°C)",
"type": "string",
"display": true,
"required": false,
"displayName": "Min Temp (°C)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Max Temp (°C)",
"type": "string",
"display": true,
"required": false,
"displayName": "Max Temp (°C)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Humidity (%)",
"type": "string",
"display": true,
"required": false,
"displayName": "Humidity (%)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Pressure (hPa)",
"type": "string",
"display": true,
"required": false,
"displayName": "Pressure (hPa)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sea Level (hPa)",
"type": "string",
"display": true,
"required": false,
"displayName": "Sea Level (hPa)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ground Level (hPa)",
"type": "string",
"display": true,
"required": false,
"displayName": "Ground Level (hPa)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Visibility (m)",
"type": "string",
"display": true,
"required": false,
"displayName": "Visibility (m)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Wind Speed (m/s)",
"type": "string",
"display": true,
"required": false,
"displayName": "Wind Speed (m/s)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Wind Direction (°)",
"type": "string",
"display": true,
"required": false,
"displayName": "Wind Direction (°)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Wind Gust (m/s)",
"type": "string",
"display": true,
"required": false,
"displayName": "Wind Gust (m/s)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Cloudiness (%)",
"type": "string",
"display": true,
"required": false,
"displayName": "Cloudiness (%)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sunrise (UTC)",
"type": "string",
"display": true,
"required": false,
"displayName": "Sunrise (UTC)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sunset (UTC)",
"type": "string",
"display": true,
"required": false,
"displayName": "Sunset (UTC)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date Time (UTC)",
"type": "string",
"display": true,
"required": false,
"displayName": "Date Time (UTC)",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Location"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 380635808,
"cachedResultUrl": "",
"cachedResultName": "weather_data"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1cQ-TBf3-dqo7njDYzYpxpASYFvEp8lIzH7vpIqTLcwc",
"cachedResultUrl": "",
"cachedResultName": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "zkQXt1viHat7vaB3",
"name": "Google Sheets account 6"
}
},
"typeVersion": 4.6
},
{
"id": "d9eb272f-4c1e-42dc-a297-05d0a0848358",
"name": "生成天气邮件 HTML",
"type": "n8n-nodes-base.html",
"position": [
1120,
120
],
"parameters": {
"html": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\" />\n <title>Daily Weather Report</title>\n <style>\n .container {\n background-color: #ffffff;\n text-align: center;\n padding: 24px;\n border-radius: 12px;\n font-family: Arial, sans-serif;\n max-width: 650px;\n margin: auto;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n h1 {\n color: #ff6d5a;\n font-size: 24px;\n font-weight: bold;\n padding: 8px;\n margin-bottom: 0;\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n margin-top: 20px;\n }\n\n td {\n padding: 10px;\n text-align: left;\n border-bottom: 1px solid #eee;\n }\n\n td:first-child {\n font-weight: bold;\n color: #555;\n width: 40%;\n }\n\n p.footer {\n font-size: 13px;\n color: #999;\n margin-top: 24px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>🌤️ Weather Report</h1>\n\n <table>\n <tr>\n <td>📌 Coordinates</td>\n <td>Lat: {{ $json[\"Location\"]?.lat }}, Lon: {{ $json[\"Location\"]?.lon }}</td>\n </tr>\n <tr>\n <td>🌡️ Temperature</td>\n <td>{{ $json[\"Temperature (°C)\"] }} °C (Feels like {{ $json[\"Feels Like (°C)\"] }} °C)</td>\n </tr>\n <tr>\n <td>📉 Min / Max Temp</td>\n <td>{{ $json[\"Min Temp (°C)\"] }} °C / {{ $json[\"Max Temp (°C)\"] }} °C</td>\n </tr>\n <tr>\n <td>💧 Humidity</td>\n <td>{{ $json[\"Humidity (%)\"] }}%</td>\n </tr>\n <tr>\n <td>📈 Pressure</td>\n <td>{{ $json[\"Pressure (hPa)\"] }} hPa (Sea: {{ $json[\"Sea Level (hPa)\"] }} hPa, Ground: {{ $json[\"Ground Level (hPa)\"] }} hPa)</td>\n </tr>\n <tr>\n <td>👁️ Visibility</td>\n <td>{{ $json[\"Visibility (m)\"] }} meters</td>\n </tr>\n <tr>\n <td>🧭 Wind</td>\n <td>\n Speed: {{ $json[\"Wind Speed (m/s)\"] }} m/s<br/>\n Direction: {{ $json[\"Wind Direction (°)\"] }}°<br/>\n Gust: {{ $json[\"Wind Gust (m/s)\"] }} m/s\n </td>\n </tr>\n <tr>\n <td>☁️ Cloudiness</td>\n <td>{{ $json[\"Cloudiness (%)\"] }}%</td>\n </tr>\n <tr>\n <td>🌅 Sunrise (UTC)</td>\n <td>{{ new Date($json[\"Sunrise (UTC)\"] * 1000).toUTCString() }}</td>\n </tr>\n <tr>\n <td>🌇 Sunset (UTC)</td>\n <td>{{ new Date($json[\"Sunset (UTC)\"] * 1000).toUTCString() }}</td>\n </tr>\n <tr>\n <td>📆 Report Time (UTC)</td>\n <td>{{ new Date($json[\"Date Time (UTC)\"] * 1000).toUTCString() }}</td>\n </tr>\n </table>\n\n <p class=\"footer\">⛅ Auto-generated by n8n | {{ new Date().toUTCString() }}</p>\n </div>\n</body>\n</html>\n"
},
"typeVersion": 1.2
},
{
"id": "cced121e-190b-4026-aeea-54e32907af0d",
"name": "发送天气更新邮件",
"type": "n8n-nodes-base.gmail",
"position": [
1360,
120
],
"webhookId": "1336d632-94ba-4231-bd2c-48dc8e118f75",
"parameters": {
"sendTo": "",
"message": "={{ $json.html }}",
"options": {},
"subject": "Daily Weather Update"
},
"credentials": {
"gmailOAuth2": {
"id": "YqeBbKp4FvFiADc0",
"name": "Gmail account 7"
}
},
"typeVersion": 2.1
},
{
"id": "7e0b458d-540e-479b-acd0-708cb9a888ec",
"name": "每日上午 10 点触发",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
440,
120
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.2
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "74976aa3-0dba-4e9a-a442-cf715fc38807",
"connections": {
"Trigger Daily at 10 AM": {
"main": [
[
{
"node": "Fetch Weather from OpenWeather",
"type": "main",
"index": 0
}
]
]
},
"Append Weather to Sheet": {
"main": [
[
{
"node": "Generate Weather Email HTML",
"type": "main",
"index": 0
}
]
]
},
"Generate Weather Email HTML": {
"main": [
[
{
"node": "Send Weather Update Email",
"type": "main",
"index": 0
}
]
]
},
"Fetch Weather from OpenWeather": {
"main": [
[
{
"node": "Append Weather to Sheet",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
中级 - 个人效率
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
使用 HTTP Last-Modified 检查从 Google Sheets 获取职位发布过期和刷新提醒
通过 Google Sheets、HTTP 检查和 Gmail 实现职位发布过期提醒的自动化
If
Set
Code
+6
19 节点WeblineIndia
人力资源
使用 Mistral AI、LinkedIn 和 Google Sheets 自动化职位搜索与简历定制
使用 Mistral AI、LinkedIn 和 Google Sheets 自动化职位搜索与简历定制
Set
Code
Html
+18
46 节点Jordan Hoyle
个人效率
太阳能发电监测预警工作流
监控太阳能发电并通过Gmail、Google表格和Slack发送警报
If
Code
Gmail
+5
9 节点WeblineIndia
工程
n8n IPA 大小跟踪工作流
使用 Google Sheets 和 Gmail 通知跟踪 iOS 应用大小及趋势警报
If
Set
Code
+5
11 节点WeblineIndia
自动化SEO健康监控与报告
网站SEO健康分析(Google Sheets、PDF报告和Gmail告警)
If
Set
Code
+8
16 节点WeblineIndia
市场调研
发送定时n8n发布说明通知到Gmail
基于AI的n8n发布说明摘要通知(通过Gmail与GPT-5-Mini)
Set
Code
Html
+7
16 节点Jeff Huera
个人效率
工作流信息
难度等级
中级
节点数量7
分类1
节点类型6
作者
WeblineIndia
@weblineindiaA Leading Software Engineering, Consulting & Outsourcing Services Company in USA & India serving Clients Globally since 1999.
外部链接
在 n8n.io 查看 →
分享此工作流