n8n เป็นเครื่องมือ Automation ที่ช่วยให้การสร้าง Workflow ที่เชื่อมต่อระบบและบริการต่าง ๆ ได้เป็นเรื่องง่ายขึ้น แต่สิ่งหนึ่งที่มักจะท้าทายสำหรับผู้ใช้คือการจัดการกับข้อมูลภายใน Workflow เนื่องจากข้อมูลที่ไหลเข้ามาอาจอยู่ในรูปแบบที่หลากหลาย หรือมาจากแหล่งที่แตกต่างกัน การจะดึงข้อมูลมาใช้งาน จัดการ แปลง หรือวิเคราะห์ให้ถูกต้องนั้นไม่ใช่เรื่องง่าย และนี่คือที่มาของการทำความเข้าใจเรื่อง “การจัดการข้อมูล” (Data Management) ใน n8n
EP นี้จะพาคุณไปสำรวจเทคนิคและเครื่องมือที่มีอยู่ใน n8n สำหรับการจัดการข้อมูลตั้งแต่ขั้นพื้นฐาน ไม่ว่าจะเป็นการดึงข้อมูลจากแหล่งต่าง ๆ การแปลงข้อมูลให้ตรงตามที่ต้องการ หรือแม้กระทั่งการสรุปข้อมูลและการสร้างสูตรคำนวณที่ซับซ้อน คุณจะได้เรียนรู้วิธีจัดการข้อมูลในหลากหลายรูปแบบ ไม่ว่าจะเป็นการแก้ไขค่าข้อมูล การกรองเฉพาะข้อมูลที่ต้องการ หรือการรวมข้อมูลเพื่อนำไปใช้งานในขั้นตอนถัดไป
บทความนี้เหมาะสำหรับทั้งผู้ที่เริ่มต้นใช้งาน n8n และผู้ที่ต้องการเพิ่มความสามารถในการจัดการข้อมูลให้ล้ำลึกมากขึ้น ด้วยการใช้ Node กลุ่ม Data Transformation ซึ่งจะทำให้ Workflow ของคุณมีความยืดหยุ่นและทรงพลังยิ่งขึ้น พร้อมกันหรือยังครับ? ถ้าพร้อมแล้ว เรามาเริ่มต้นกันเลย!
สารบัญ
โครงสร้างของข้อมูลใน n8n
ข้อมูลที่ถูกส่งผ่านระหว่าง Node ใน n8n จะถูกจัดเก็บในรูปแบบของ Array of Objects ซึ่งเดี๋ยวผมจะขออธิบายให้แบบละเอียดเลย
Array ใน n8n สำหรับคนที่คุ้นเคยกับ Excel
ใน Excel เราจะคุ้นเคยกับการทำงานกับข้อมูลในลักษณะของ ตาราง ซึ่งประกอบไปด้วย แถว (Row) และ คอลัมน์ (Column) โดยข้อมูลในแต่ละแถวจะถูกจัดเรียงในรูปแบบของรายการต่างๆ ที่สอดคล้องกับคอลัมน์นั้นๆ เช่น ผลไม้ (รายการสินค้า) , สี, ราคา เป็นต้น
Array ใน n8n ก็มีแนวคิดคล้ายๆ กับการจัดเก็บข้อมูลในแถวเหล่านั้นของ Excel เพียงแต่มันจะเก็บข้อมูลในลักษณะของ ลิสต์ของวัตถุ (List of Objects) ที่ผสมผสานกับ ข้อมูล Key กับ Value ที่คู่กัน
สำหรับ ลิสต์ของวัตถุ (List of Objects) นั้นมีโครงสร้างดังนี้
=[item1,item2,item3]
หรือเขียนแบบขึ้นบรรทัดใหม่
=[
item1,
item2,
item3
]
- ใน Python เรียกว่า List
- ใน Power Query ของ Excel จะเรียกว่า List (แต่ใช้อีกสัญลักษณ์นึง)
ซึ่งข้อมูลแต่ละรายการ (item ของ List) มักจะถูกเก็บไว้ในรูปแบบของ ข้อมูลที่คู่กัน ระหว่าง คีย์ (Key) กับ ค่า (Value)
{
key1: value1,
key2: value2,
key3: value3
}
- ใน Python เรียกว่า Dictionary
- ใน Power Query ของ Excel จะเรียกว่า Record (แต่ใช้อีกสัญลักษณ์นึง)
ความแตกต่างหลักระหว่าง Array ใน n8n กับตาราง Excel ทั่วไป
Array สามารถซ้อนข้อมูลมากกว่าหนึ่งอันในหนึ่งรายการ (Nested Data)
ปกติแล้ว… ใน Excel ข้อมูลมักจะถูกเก็บในเซลล์อย่างเรียบง่าย แต่ใน n8n ข้อมูลหนึ่งรายการใน Array สามารถมีข้อมูลซับซ้อนได้ ซึ่งสามารถเปรียบเทียบกับว่าในช่อง Excel มี “ก้อนข้อมูล” ซ้อนอยู่ข้างใน แทนที่จะเป็นค่าเดียว
ตัวอย่างเช่น
[
{
"fruit": "apple",
"color": "red",
"price": 10
},
{
"fruit": "banana",
"color": "yellow",
"price": 5
}
]
ถ้าเปรียบเทียบกับ Excel:
- ให้คิดว่า แต่ละแถว ใน Excel คือ แต่ละ item ของ List ของ n8n
- ชื่อแต่ละคอลัมน์ ใน Excel ก็จะคล้ายกับ คีย์ ในแต่ละออบเจ็กต์ เช่น
fruit
,color
,price
- ส่วน ค่าของเซลล์ ก็คือ ค่า (Value) ของคีย์เหล่านั้น เช่น “apple”, “red”, 10
(ถ้าเป็นข้อความก็จะครอบด้วยเครื่องหมายคำพูด)
แบบนี้คือเป็น List ที่มี 2 item โดยแต่ละ item คือ record ที่มี 3 คอลัมน์ (key) ซึ่งหน้าตาก็จะสามารถเข้าใจได้ว่าคล้ายๆ ตาราง Excel ที่ผมให้ดูตั้งแต่แรกนั่นแหละ
แต่ถ้าจะให้เห็นแบบชัดๆ จริงๆ ใน Excel ต้องไปดูใน Power Query จึงจะสามารถ Get Data from JSON เพื่ออ่านข้อมูลแบบนี้ให้เห็นภาพได้
ตอนแรกข้อมูล JSON เมื่อกี๊ ถือเป็น List ที่มี 2 item อยู่ข้างใน ซึ่งแต่ละ item คือ record ที่มี 3 key-value คู่กัน (โดยผม preview ให้ดูด้านล่าง)
Array ที่มาใน n8n
ทีนี้ข้อมูลที่มาจริงๆ ใน n8n มันก็อาจมีทั้งมาจากในรูปแบบของตาราง (แบบ Spreadsheet) ยกตัวอย่างเช่น ถ้าผมลองดึงข้อมูลจาก Google Sheets ต้นฉบับแบบนี้
โดยที่เราจะใช้ Node Google Sheets เพื่อ Get Rows in Sheets
แล้วเราอย่าลืมไป Enable API ของ Google Sheets บน Google Cloud Console ด้วยนะ
แล้วก็เอา Client ID กับ Client Secret อันเดิมที่เคยทำในตอนที่แล้ว มากรอกได้เลย ไม่ต้องสร้างใหม่แล้ว
จากนั้นเลือกข้อมูลจาก Sheet ที่ต้องการ มันจะเห็นแบบนี้ ซึ่งถ้าใน Output เราดูในมุมมองของ Table มันก็จะเห็นเป็นตารางเหมือนใน Google Sheets นั่นแหละ (แต่มี Row Number โผล่มาด้วย โดยที่แถวแรกสุดกลายเป็นหัวตารางไป)
แต่ถ้าดูในมุมมของ JSON จะเห็นแบบนี้ ซึ่งจะเห็นว่าหัวตารางก็คือ Key และ Data คือส่วนของ Value ของ Record นั่นเอง
และถ้าดูแบบ Schema (โครงสร้างข้อมูลอธิบายข้อมูลในตารางว่ามี field อะไรบ้าง) จะเห็นแบบนี้
ทั้งหมด มันคือ List ที่มี Record เดียว (ที่มีหลาย key-value)
ซึ่งข้อมูลที่ถูกส่งออกมาจาก Node Google Sheets นี้ ตอนนี้ถือว่ามี 6 items
เราต้องเข้าใจก่อนว่า การที่มันส่งออกไป 6 items แบบนี้ ถ้าเราทำอะไรบางอย่างต่อไปใน Workflow มันก็จะเหมือนไล่ทำทีละ item จนครบ 6 items
เช่น ถ้าผมต่อ Line Notify ออกไป มันจะยิงไป 6 ครั้งเลย
นี่ให้ดู มันยิง 6 ครั้งจริงๆ
ซึ่งถ้าเราอยากทำการแก้ไขข้อมูล หรือ คัดเลือกข้อมูล เราก็ต้องใช้พวก Node ในกลุ่ม Data Transformation
Node กลุ่ม Data Transformation เพื่อแก้ไขข้อมูล
การแก้ไข/เพิ่มข้อมูลด้วย Edit Fields
เมื่อเราต้องการแก้ไขข้อมูลที่ได้รับเข้ามาใน Workflow เราสามารถใช้ Node ในกลุ่ม Data Transformation เช่น Edit Fields เพื่อเพิ่มหรือแก้ไขข้อมูลได้ตามต้องการ
ยกตัวอย่างเช่น การเปลี่ยนชื่อสินค้าทั้งหมดให้เป็นตัวพิมพ์ใหญ่ เราสามารถใช้ Node Edit Fields พร้อม Expression เพื่อจัดการได้ โดยการใช้ฟังก์ชัน toUpperCase()
Tips : ผมใช้วิธีเติม . ต่อท้ายชื่อ field ปกติ แล้วเลือก choice ของ method ที่ชื่อว่า toUpperCase() มันก็จะสามารถแปลงค่าใน field product ให้เป็นพิมพ์ใหญ่ได้ง่ายๆ
แต่ถ้าทำแค่นี้ Field อื่นๆ ก็จะหายไปเลย ทำให้ไม่สามารถส่งต่อไปที่ Line ได้ตามที่ตั้งไว้ใน Node เดิม
แม้ว่าจริงๆ เราจะแก้การดึงข้อมูลที่จะส่ง Line ให้ไปเอาจาก Node Google Sheets ได้ (ฝั่ง Input ตัวที่ 2) แต่ผมว่าเราใช้วิธีกลับไปเลือก Include Other Input Fields ในโหนด Edit Fields ดีกว่าครับ
นอกจากนี้ ใน Edit Fields เราก็สามารถเพิ่ม Field ใหม่ได้ด้วย เช่น เราสามารถกด Add Field แล้วตั้งชื่อ Field แล้วใส่ข้อมูล (fixed) หรือ สูตร (expression) ได้เลย
ในที่นี้ผมเขียนสูตรคำนวณยอดขาย สมมติว่าผลไม้ราคาชิ้นละ 50 บาทง่ายๆ ก็คำนวณได้ดังนี้
- วิธี คือ ลาก Quantity ลงมา จะได้ {{ $json.quantity }}
- จากนั้นเราแก้สูตรในส่วนของ {{ … }} นะครับ เพราะว่าทุกอย่างใน {{ … }} จะมองว่าเป็นภาษา JavaScript
- ใช้สูตรลักษณะแบบนี้เพื่อคำนวณได้เลย
{{ $json.quantity *50}}
ผลลัพธ์ที่ Output ออกมาจาก Node ก็จะมีคอลัมน์ใหม่ด้วย และเราก็สามารถเอาไปส่ง Line ต่อใน Step ต่อไปได้เลย
ตัวอย่าง Output JSON ที่ได้
[
{
"row_number": 2,
"orderid": 123,
"customer": "A",
"product": "APPLE",
"quantity": 3,
"SalesAmt": 150
},
{
"row_number": 3,
"orderid": 123,
"customer": "A",
"product": "BANANA",
"quantity": 2,
"SalesAmt": 100
},
{
"row_number": 4,
"orderid": 124,
"customer": "B",
"product": "ORANGE",
"quantity": 5,
"SalesAmt": 250
},
{
"row_number": 5,
"orderid": 124,
"customer": "B",
"product": "MANGO",
"quantity": 1,
"SalesAmt": 50
},
{
"row_number": 6,
"orderid": 124,
"customer": "B",
"product": "GRAPE",
"quantity": 4,
"SalesAmt": 200
},
{
"row_number": 7,
"orderid": 125,
"customer": "A",
"product": "PEAR",
"quantity": 6,
"SalesAmt": 300
}
]
การสรุปข้อมูล ด้วย Summarize
การสรุปข้อมูลใน n8n สามารถทำได้ง่าย เช่น การสรุปยอดขายต่อ Order ID ซึ่งคล้ายกับการใช้ Pivot Table ใน Excel หรือการ Group By ใน Power Query ทำให้ชาว Excel เข้าใจได้ไม่ยาก
สมมติผมอยากจะทำการสรุปข้อมูลจากหลายๆ Item เข้าด้วยกัน ตาม OrderId กับ ลูกค้า แล้วอยากจะสรุปว่าทำยอดขายได้กี่บาท และ มีการซื้อสินค้ากี่ประเภท ผมทำได้ดังนี้
ตัวอย่าง Output JSON ที่ได้
[
{
"customer": "A",
"orderid": "123",
"sum_SalesAmt": 250,
"unique_count_product": 2
},
{
"customer": "A",
"orderid": "125",
"sum_SalesAmt": 300,
"unique_count_product": 1
},
{
"customer": "B",
"orderid": "124",
"sum_SalesAmt": 500,
"unique_count_product": 3
}
]
การคัดเลือกข้อมูลด้วย Filter
หากเราต้องการคัดเลือกข้อมูลเฉพาะรายการที่ตรงตามเงื่อนไข เช่น ยอดขายเกิน 300 บาท สามารถใช้ Node Filter ได้ ซึ่งจะทำให้ Workflow สามารถเลือกเฉพาะข้อมูลที่เราต้องการไปใช้ในขั้นตอนถัดไป
จำนวน item ที่เหลือรอดไปก็ (อาจ) จะน้อยลง นี่คือ Concept ของการ Filter
ตัวอย่าง Output JSON ที่ได้
[
{
"customer": "A",
"orderid": "125",
"sum_SalesAmt": 300,
"unique_count_product": 1
},
{
"customer": "B",
"orderid": "124",
"sum_SalesAmt": 500,
"unique_count_product": 3
}
]
รวบข้อมูลด้วย Aggregate
สุดท้ายหากต้องการรวบข้อมูลทุกแถวเข้าด้วยกันเพื่อส่งออกเป็นข้อความเพียงข้อความเดียว เราสามารถใช้ Node Aggregate เพื่อช่วยในการรวบข้อมูลได้ ซึ่งเป็นวิธีที่ทำให้ Workflow ของเรามีความสะดวกและเรียบง่ายมากขึ้น
สมมติผมอยากจะรวบข้อมูลส่ง Line แค่ Message เดียวเลย ผมก็อาจจะใช้โหนด Aggregate มาช่วยก็ได้
ซึ่งสามารถ Aggregate Data ทั้งหมดทุกแถว ทุก Field เข้าเป็น List เดียว (ชื่อ data)เลยแบบนี้ก็ได้
ถ้าใช้ all item data หน้าตา json จะเป็นแบบนี้
[
{
"data": [
{
"customer": "A",
"orderid": "125",
"sum_SalesAmt": 300,
"unique_count_product": 1
},
{
"customer": "B",
"orderid": "124",
"sum_SalesAmt": 500,
"unique_count_product": 3
}
]
}
]
หรือจะ Aggregate แยก Field แบบนี้ก็ได้ (เลือกทีละ Field ได้เลย)
ถ้าใช้ individual field หน้าตา json จะเป็นแบบนี้
[
{
"customer": [
"A",
"B"
],
"orderid": [
"125",
"124"
],
"sum_SalesAmt": [
300,
500
],
"unique_count_product": [
1,
3
]
}
]
เดี๋ยวผมลองใช้การ Aggregate แบบ all item data นะครับ เพราะผมคิดว่าน่าจะสะดวกกับหลายๆ เคสเลยถ้าเราใช้มันได้
เรื่องของเรื่องคือ มันน่าจะต้องเขียนสูตร JavaScript ซึ่งผมเขียนไม่เป็น 😆
แต่ไม่เป็นไร ผมสามารถไปถาม น้อง AI Chatbot เช่น ChatGPT ว่าจะต้องเขียนสูตรใน expression ของ n8n ยังไง ถึงจะทำให้รับ Input ที่ผมมี แต่สามารถส่ง output ออกมาสวยงามอ่านง่าย (ChatGPT ของผมชื่อว่าน้องฟ้า)
น้อง AI เค้าแนะนำเขียน Expression แบบนี้
ข้อมูลมีดังนี้
{{ $json.data.map(item =>
`Customer: ${item.customer}, Order ID: ${item.orderid}, Sales Amount: ${item.sum_SalesAmt}, Unique Products: ${item.unique_count_product}`).join('\n') }}
สุดท้ายออกมาแบบนี้ครับ สวยงาม
ตอนต่อไป
หลังจากที่เราได้เรียนรู้วิธีการจัดการข้อมูลใน Workflow ด้วย n8n กันแล้ว ในตอนต่อไป เราจะเจาะลึกยิ่งขึ้นไปอีก กับการควบคุมการไหลของข้อมูล (Control Flow) ที่เป็นหัวใจสำคัญในการสร้าง Workflow ที่ซับซ้อนขึ้น เช่น การใช้ If Node เพื่อสร้างเงื่อนไขต่าง ๆ หรือการใช้ Switch Node เพื่อแตกสายการทำงานออกไปในหลายทิศทาง นอกจากนี้ เรายังจะได้สำรวจการวน Loop เพื่อจัดการกับข้อมูลจำนวนมากได้อย่างอัตโนมัติและมีประสิทธิภาพ
ถ้าคุณอยากจะพัฒนา Workflow ของคุณให้ทำงานได้อย่างลื่นไหลและยืดหยุ่นมากขึ้น ห้ามพลาดตอนต่อไป! เราจะมาเรียนรู้เทคนิคสำคัญที่จะช่วยให้คุณสามารถจัดการกับการควบคุมข้อมูลอย่างชาญฉลาด เตรียมพบกับความท้าทายใหม่ ๆ ที่จะช่วยยกระดับการทำงานของ n8n ไปอีกขั้น แล้วเจอกันใน EP ถัดไปครับ!
Leave a Reply