你是否曾經將心儀的商品加入購物車,卻總是錯過最佳的特價時機?或是需要手動追蹤多個商品的價格,感到既繁瑣又沒效率?
別擔心!本篇文章將帶您一步步利用 n8n 自動化工具,串接 Google Sheets 與 Discord,打造一個專屬於的「商品降價自動通知機器人」。從此以後,你再也不會錯過任何一次降價惹
準備 Google 試算表
欄位填上這些
| ProductID | ProductName | URL | LastPrice | 
|---|
表單的內容 ProductID 可以自己設定不會重複的 ID 來表示,剩下的填入自己想追蹤的商品網頁資料

來到儀表板,新增一個流程「Create Workflow」

初始節點選擇排程「On a schedule」

選擇每天跑一次

下個節點設定去讀取 Google Sheet 的資料,選擇「Get row(s) in sheet」

憑證的設定方式直接介紹過,這邊就不重複惹,底下選擇自己的工作表

下個節點選擇「Loop Over Items」去拆項執行

把「Replace Me」的節點換成「HTTP Request」

URL 填寫如下來讀取前面的網址
{
  {
    $json.URL;
  }
}
Send Headers 的選項打開,填寫:
Name: User-Agent
Value: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36

下個節點選擇「HTML」的「Extract HTML Content」

接著打開商品網頁,按右鍵的「檢查」觀察價格的元素內容,可以看到「o-prodPrice__price」這個類別

把相關資料填上去
Key:priceText
CSS Selector:.o-prodPrice__price

下個節點選擇「If」來做判斷

第一個欄位填寫如下,接著選擇「Numebr」的「is less than」
{
  {
    Number($json.priceText.replace(/[$,]/g, ""));
  }
}
第二個欄位填寫如下:
{
  {
    $("Google Sheets").item.json.LastPrice;
  }
}

接著在「true」路徑的下個節點選擇 Discord 的「Send a message」

「Connection Type」選擇「Webhook」,憑證的串接在之前的文章有撰寫過,這邊就不重複惹

Message 填入以下內容
**商品降價通知!** 🚀
**{{ $('Google Sheets').item.json.ProductName }}** 降價囉!
原價: ~${{ $('Google Sheets').item.json.LastPrice }}~
**新價格: ${{ $('HTML').item.json.priceText }}** 🔥
[點我立刻搶購!]({{ $('Google Sheets').item.json.URL }})
下個節點再選擇「Google Sheets」的「Update row in sheet」來更新價格

在「Column to match on」選擇「ProductID」作為用來判斷的資料行數

LastPrice 的內容填上來更新價格
{
  {
    Number($("HTML").item.json.priceText.replace(/[$,]/g, ""));
  }
}
ProductID 填上
{
  {
    $("Google Sheets").item.json.ProductID;
  }
}

再來記得到設定裡面調整時區

設定為台灣時區

而當流程跑到「False」的時候也應該要接回「Loop」才會繼續跑下筆資料,所以要把線拉回去連上去

記得到上方把流程切換為「Active」來啟用,然後點選正下方的「Execute workflow」來試跑看看

Discord 可以看到類似像這樣的訊息,代表成功囉

最後也附上這個流程的 JSON 內容
{
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [0, 130],
      "id": "445cc1d9-d9cb-4bc5-bbde-78543bbf4e0b",
      "name": "Schedule Trigger"
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEET_ID",
          "mode": "list",
          "cachedResultName": "PC24",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=YOUR_GID",
          "mode": "list",
          "cachedResultName": "products",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=YOUR_GID"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.6,
      "position": [220, 130],
      "id": "71925acd-fc55-4fa1-9776-745ae0bdbde0",
      "name": "Google Sheets",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "YOUR_GOOGLE_CREDENTIAL_ID",
          "name": "Google Sheets account"
        }
      }
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [440, 130],
      "id": "d0b4932c-250c-4f74-931a-0031199f6dce",
      "name": "Loop Over Items"
    },
    {
      "parameters": {
        "url": "={{ $json.URL }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "User-Agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [660, 140],
      "id": "af7a734c-6ad6-42f0-b89f-bd07a023c85a",
      "name": "HTTP Request"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "priceText",
              "cssSelector": ".o-prodPrice__price"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [880, 140],
      "id": "d570cfec-c06f-442f-854a-39835ea1aedf",
      "name": "HTML"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "6fe8d4eb-a606-4307-829b-a7860edde3d2",
              "leftValue": "={{ Number($json.priceText.replace(/[$,]/g, '')) }}",
              "rightValue": "={{ $('Google Sheets').item.json.LastPrice }}",
              "operator": {
                "type": "number",
                "operation": "lt"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [1100, 140],
      "id": "dc921942-f423-4603-a489-e5621bd99165",
      "name": "If"
    },
    {
      "parameters": {
        "authentication": "webhook",
        "content": "=**商品降價通知!** 🚀\n\n**{{ $('Google Sheets').item.json.ProductName }}** 降價囉!\n\n原價: ~${{ $('Google Sheets').item.json.LastPrice }}~\n**新價格: ${{ $('HTML').item.json.priceText }}** 🔥\n\n[點我立刻搶購!]({{ $('Google Sheets').item.json.URL }})",
        "options": {}
      },
      "type": "n8n-nodes-base.discord",
      "typeVersion": 2,
      "position": [1320, 140],
      "id": "6502963f-0b0f-4275-9abe-130898333d3e",
      "name": "Discord",
      "webhookId": "YOUR_DISCORD_WEBHOOK_ID",
      "credentials": {
        "discordWebhookApi": {
          "id": "YOUR_DISCORD_CREDENTIAL_ID",
          "name": "Discord Webhook account"
        }
      }
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEET_ID",
          "mode": "list",
          "cachedResultName": "PC24",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=YOUR_GID",
          "mode": "list",
          "cachedResultName": "products",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=YOUR_GID"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "LastPrice": "={{ Number($('HTML').item.json.priceText.replace(/[$,]/g, '')) }}",
            "ProductID": "={{ $('Google Sheets').item.json.ProductID }}"
          },
          "matchingColumns": ["ProductID"],
          "schema": [
            {
              "id": "ProductID",
              "displayName": "ProductID",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "ProductName",
              "displayName": "ProductName",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "URL",
              "displayName": "URL",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "LastPrice",
              "displayName": "LastPrice",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.6,
      "position": [1540, 200],
      "id": "03ef6113-9248-4087-988a-7d17c922da5f",
      "name": "Google Sheets Update",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "YOUR_GOOGLE_CREDENTIAL_ID",
          "name": "Google Sheets account"
        }
      }
    }
  ],
  "connections": {
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTML": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Discord",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Discord": {
      "main": [
        [
          {
            "node": "Google Sheets Update",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets Update": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "YOUR_N8N_INSTANCE_ID"
  }
}