8
n8n 中文网amn8n.com

使用 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)可能需要您自行付费。

工作流信息
难度等级
中级
节点数量7
分类1
节点类型6
难度说明

适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流

作者
WeblineIndia

WeblineIndia

@weblineindia

A Leading Software Engineering, Consulting & Outsourcing Services Company in USA & India serving Clients Globally since 1999.

外部链接
在 n8n.io 查看

分享此工作流