Thiết kế Workflow n8n

Tổng quan Workflow

Workflow n8n sẽ tự động lấy nội dung từ Google Sheets, ảnh từ Google Drive và đăng lên nhiều Facebook Pages cùng một lúc. Workflow sẽ chạy theo lịch trình vào 9h sáng hàng ngày, chọn ngẫu nhiên một hàng từ Google Sheets, lấy nội dung và tên thư mục ảnh, tìm và lấy tất cả ảnh từ thư mục tương ứng trong Google Drive, đăng lên tất cả các Facebook Pages đã cấu hình, và cập nhật trạng thái và link bài đăng vào Google Sheets.

n8n Workflow Diagram

Cấu trúc Node trong n8n

1. Schedule Trigger

  • Loại node: Schedule
  • Cấu hình: Chạy hàng ngày vào 9h sáng
  • Mục đích: Kích hoạt workflow theo lịch trình

Node Schedule Trigger là điểm bắt đầu của workflow, nó sẽ kích hoạt workflow vào 9h sáng hàng ngày. Bạn có thể tùy chỉnh lịch trình theo nhu cầu, ví dụ như chạy vào các ngày cụ thể trong tuần hoặc vào các thời điểm khác nhau.

2. Google Sheets - Lấy dữ liệu

  • Loại node: Google Sheets
  • Operation: Read Rows
  • Cấu hình:
    • Spreadsheet ID: 11IZ1G-2ekIePE-hVcPXKu4uBnUczhLtdi3KwW7Lfc_o
    • Range: A:C
    • Has Header Row: Yes
  • Mục đích: Lấy tất cả dữ liệu từ Google Sheets

Node Google Sheets sẽ đọc dữ liệu từ bảng tính đã chỉ định. Nó sẽ lấy tất cả các hàng từ phạm vi A:C, bao gồm các cột STT, Nội dung bài đăng, và folderName. Node này sẽ trả về một mảng các hàng, mỗi hàng là một đối tượng với các thuộc tính tương ứng với tên cột.

3. Function - Chọn hàng ngẫu nhiên

  • Loại node: Function
  • Cấu hình: JavaScript code để chọn một hàng ngẫu nhiên từ dữ liệu Google Sheets
  • Mục đích: Tương đương với Random Number và Get Item trong Make

Node Function sẽ thực thi mã JavaScript để chọn một hàng ngẫu nhiên từ dữ liệu Google Sheets. Nó sẽ bỏ qua hàng tiêu đề và chọn một hàng ngẫu nhiên từ các hàng còn lại. Node này sẽ trả về một đối tượng chứa thông tin của hàng được chọn, bao gồm STT, nội dung bài đăng, và tên thư mục ảnh.

// Lấy dữ liệu từ Google Sheets
const rows = items[0].json.rows;

// Bỏ qua hàng tiêu đề
if (rows.length <= 1) {
  return [];
}

// Chọn một hàng ngẫu nhiên (trừ hàng tiêu đề)
const randomIndex = Math.floor(Math.random() * (rows.length - 1)) + 1;
const selectedRow = rows[randomIndex];

// Trả về dữ liệu của hàng được chọn
return [
  {
    json: {
      STT: selectedRow.STT,
      noidung: selectedRow["Nội dung bài đăng"],
      folderName: selectedRow.folderName,
      rowIndex: randomIndex + 1 // +1 vì Google Sheets bắt đầu từ 1, không phải 0
    }
  }
];

4. Google Drive - Tìm ảnh

  • Loại node: Google Drive
  • Operation: Search Files
  • Cấu hình:
    • Query: mimeType contains 'image/' and 'image/{{$node["Function"].json["folderName"]}}' in parents
    • Options: Sort by name, ascending
  • Mục đích: Tìm tất cả ảnh trong thư mục tương ứng với folderName

Node Google Drive Search sẽ tìm tất cả các file ảnh trong thư mục có tên tương ứng với giá trị folderName từ hàng được chọn. Nó sẽ trả về một mảng các file, mỗi file chứa thông tin như ID, tên, và đường dẫn.

5. Split In Batches - Xử lý nhiều ảnh

  • Loại node: Split In Batches
  • Cấu hình: Batch Size = 1
  • Mục đích: Xử lý từng ảnh một

Node Split In Batches sẽ chia mảng các file ảnh thành các batch nhỏ, mỗi batch chứa một file. Điều này cho phép workflow xử lý từng ảnh một cách riêng biệt. Mỗi lần thực thi, node này sẽ trả về một file ảnh để xử lý.

6. Google Drive - Tải ảnh

  • Loại node: Google Drive
  • Operation: Download
  • Cấu hình: File ID từ kết quả tìm kiếm
  • Mục đích: Tải ảnh từ Google Drive

Node Google Drive Download sẽ tải file ảnh từ Google Drive dựa trên ID file từ node Split In Batches. Nó sẽ trả về dữ liệu nhị phân của file ảnh, sẵn sàng để đăng lên Facebook.

7. SplitInBatches - Xử lý nhiều Facebook Pages

  • Loại node: SplitInBatches
  • Cấu hình: Danh sách các Facebook Page IDs
  • Mục đích: Xử lý từng Facebook Page một

Node SplitInBatches thứ hai này sẽ chia workflow thành nhiều nhánh, mỗi nhánh xử lý một Facebook Page. Nó chứa danh sách các Facebook Page IDs đã được cấu hình trước. Mỗi lần thực thi, node này sẽ trả về thông tin của một Facebook Page để xử lý.

8. Facebook Graph API - Đăng bài với ảnh

  • Loại node: Facebook Graph API
  • Operation: POST
  • Cấu hình:
    • Node: /{page-id}/photos
    • Parameters:
      • message: Nội dung bài đăng từ Function node
      • published: true
    • Binary Data: Ảnh đã tải từ Google Drive
  • Mục đích: Đăng bài với ảnh lên Facebook Page

Node Facebook Graph API sẽ đăng bài với ảnh lên Facebook Page dựa trên ID page từ node SplitInBatches. Nó sẽ sử dụng nội dung bài đăng từ Function node và dữ liệu ảnh từ Google Drive Download. Node này sẽ trả về thông tin của bài đăng đã tạo, bao gồm ID bài đăng.

9. Wait - Chờ đăng bài hoàn tất

  • Loại node: Wait
  • Cấu hình: Chờ 2 giây
  • Mục đích: Đảm bảo bài đăng đã được xử lý trước khi lấy thông tin

Node Wait sẽ tạm dừng workflow trong 2 giây để đảm bảo bài đăng đã được Facebook xử lý hoàn tất trước khi tiếp tục. Điều này giúp tránh các lỗi khi lấy thông tin bài đăng ngay sau khi đăng.

10. Facebook Graph API - Lấy thông tin bài đăng

  • Loại node: Facebook Graph API
  • Operation: GET
  • Cấu hình:
    • Node: /{post-id}
    • Fields: id,permalink_url
  • Mục đích: Lấy permalink của bài đăng

Node Facebook Graph API thứ hai này sẽ lấy thông tin chi tiết của bài đăng đã tạo, bao gồm permalink URL. Nó sẽ sử dụng ID bài đăng từ node Facebook Graph API trước đó. Node này sẽ trả về thông tin bài đăng, bao gồm permalink URL để cập nhật vào Google Sheets.

11. Function - Chuẩn bị dữ liệu cập nhật

  • Loại node: Function
  • Cấu hình: JavaScript code để chuẩn bị dữ liệu cập nhật vào Google Sheets
  • Mục đích: Tạo dữ liệu cập nhật với trạng thái và link bài đăng

Node Function thứ hai này sẽ chuẩn bị dữ liệu để cập nhật vào Google Sheets. Nó sẽ tạo một đối tượng chứa số hàng cần cập nhật và các giá trị cần cập nhật, bao gồm trạng thái "Đã đăng" và permalink URL của bài đăng.

// Lấy thông tin từ các node trước đó
const postInfo = items[0].json;
const selectedRow = $node["Function"].json;

// Chuẩn bị dữ liệu cập nhật
return [
  {
    json: {
      rowNumber: selectedRow.rowIndex,
      values: {
        "D": "Đã đăng",
        "E": postInfo.permalink_url
      },
      pageInfo: {
        pageId: $json.pageId,
        pageName: $json.pageName
      }
    }
  }
];

12. Google Sheets - Cập nhật trạng thái

  • Loại node: Google Sheets
  • Operation: Update Row
  • Cấu hình:
    • Spreadsheet ID: 11IZ1G-2ekIePE-hVcPXKu4uBnUczhLtdi3KwW7Lfc_o
    • Sheet Name: Trang tính1
    • Row Number: STT từ Function node
    • Values:
      • D: "Đã đăng"
      • E: Permalink URL từ Facebook Graph API
  • Mục đích: Cập nhật trạng thái và link bài đăng vào Google Sheets

Node Google Sheets Update sẽ cập nhật trạng thái và link bài đăng vào Google Sheets. Nó sẽ sử dụng số hàng và các giá trị từ Function node trước đó. Node này sẽ cập nhật cột D với giá trị "Đã đăng" và cột E với permalink URL của bài đăng.

Luồng dữ liệu

  1. Schedule Trigger kích hoạt workflow vào 9h sáng hàng ngày
  2. Google Sheets lấy tất cả dữ liệu từ bảng tính
  3. Function chọn một hàng ngẫu nhiên và trích xuất nội dung bài đăng và tên thư mục ảnh
  4. Google Drive Search tìm tất cả ảnh trong thư mục tương ứng
  5. Split In Batches xử lý từng ảnh một
  6. Google Drive Download tải ảnh từ Google Drive
  7. SplitInBatches xử lý từng Facebook Page một
  8. Facebook Graph API POST đăng bài với ảnh lên Facebook Page
  9. Wait chờ đăng bài hoàn tất
  10. Facebook Graph API GET lấy permalink của bài đăng
  11. Function chuẩn bị dữ liệu cập nhật
  12. Google Sheets Update cập nhật trạng thái và link bài đăng vào Google Sheets

Xử lý lỗi và trường hợp đặc biệt

Xử lý khi không tìm thấy ảnh

Thêm một node IF sau node Google Drive - Tìm ảnh để kiểm tra xem có tìm thấy ảnh không:

{
  "parameters": {
    "conditions": {
      "boolean": [
        {
          "value1": "={{$json.files.length}}",
          "operation": "larger",
          "value2": 0
        }
      ]
    }
  }
}
  • Nếu true: Tiếp tục workflow
  • Nếu false: Thêm node Function để cập nhật Google Sheets với trạng thái lỗi

Xử lý lỗi khi đăng bài

Thêm node Error Trigger để bắt lỗi từ node Facebook Graph API - Đăng bài với ảnh:

{
  "parameters": {
    "errorDescription": "Error when posting to Facebook",
    "continueOnFail": true
  }
}

Sau đó kết nối với một node Function để cập nhật Google Sheets với trạng thái lỗi.

Tiếp theo: Hướng dẫn triển khai