Thep Excel

Expression.Evaluateประเมินผลนิพจน์ M แบบไดนามิก

Expression.Evaluate ใช้สำหรับประเมินผลนิพจน์ M ที่เก็บไว้เป็นข้อความ โดยสามารถระบุตัวแปรและฟังก์ชันที่ใช้ได้ในสภาพแวดล้อม ทำให้สามารถเขียนโค้ด M แบบไดนามิก

fx
=Expression.Evaluate(document, [environment]) as any

ความนิยม4/10
ความยาก9/10
ประโยชน์6/10

อัปเดต 12 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
document text นิพจน์ M ที่เก็บไว้เป็นข้อความสตริง ต้องเป็นโค้ด M ที่ถูกต้องตามไวยากรณ์
[environment]ไม่บังคับ record null record ที่ประกอบด้วยตัวแปรและฟังก์ชันที่ต้องการให้เข้าถึงได้ในนิพจน์ (เช่น [x = 5, y = 10] หรือ #shared สำหรับสภาพแวดล้อมทั่วโลก)

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

Expression.Evaluate ใช้สำหรับประเมินผลนิพจน์ M ที่เก็บไว้เป็นข้อความ โดยสามารถระบุตัวแปรและฟังก์ชันที่ใช้ได้ในสภาพแวดล้อม ทำให้สามารถเขียนโค้ด M แบบไดนามิก

ที่เจ๋งคือ Expression.Evaluate ให้เราสร้างนิพจน์ M แบบไดนามิก แล้วประเมินผลในขั้นตอน Query ได้ ซึ่งมีประโยชน์มากเมื่อต้องสร้างฟิลเตอร์ หรือโค้ด M ที่เปลี่ยนแปลงตามเงื่อนไข

ส่วนตัวผม เห็นว่า Expression.Evaluate มีประโยชน์ที่สุดเมื่อต้องเรียกใช้ฟังก์ชัน Power Query ที่เก็บไว้ในไฟล์อื่น หรือสร้างนิพจน์ที่ซับซ้อนแบบโปรแกรมแนว (programmatic) ได้ แต่ต้องระวังเรื่องประสิทธิภาพเพราะ dynamic evaluation อาจช้ากว่าโค้ด static ที่เขียนตรงๆ

Examples

ตัวอย่างที่ 1: การคำนวณแบบง่ายExpression.Evaluate("1 + 1")

ประเมินผลการบวกแบบง่าย โดยไม่ต้องมีสภาพแวดล้อม ผลลัพธ์คือเลข 2

fx
= Expression.Evaluate("1 + 1")

ผลลัพธ์2
ตัวอย่างที่ 2: ใช้ตัวแปรจาก environmentExpression.Evaluate("x + y", [x = 17, y = 25])

ส่งตัวแปร x และ y ผ่าน environment record เพื่อใช้ในนิพจน์ ผลลัพธ์คือ 42

fx
= Expression.Evaluate("x + y", [x = 17, y = 25])

ผลลัพธ์42
ตัวอย่างที่ 3: เรียกใช้ฟังก์ชัน List.SumExpression.Evaluate("List.Sum({1, 2, 3})", [List.Sum = List.Sum])

ถ้าไม่ส่ง List.Sum ในสภาพแวดล้อม จะเกิดข้อผิดพลาด 'List.Sum' doesn't exist ต้องใส่ [List.Sum = List.Sum] เพื่อให้ฟังก์ชันสามารถใช้ได้

fx
= Expression.Evaluate("List.Sum({1, 2, 3})", [List.Sum = List.Sum])

ผลลัพธ์6
ตัวอย่างที่ 4: ใช้ #shared สำหรับสภาพแวดล้อมทั่วโลกExpression.Evaluate("List.Sum({5, 10, 15})", #shared)

#shared ให้เข้าถึงฟังก์ชัน Power Query ทั้งหมด (global environment) ทำให้ไม่ต้องเขียน [List.Sum = List.Sum] ซ้ำ

fx
= Expression.Evaluate("List.Sum({5, 10, 15})", #shared)

ผลลัพธ์30
ตัวอย่างที่ 5: let expression แบบไดนามิกExpression.Evaluate("let a=3, b=4, c=a*b in c")

ประเมินผล let…in expression ที่เก็บไว้เป็นข้อความ ผลลัพธ์คือ 12 (3 * 4) ทำให้สามารถสร้างโค้ด M ที่มีการประกาศตัวแปรแบบไดนามิก

fx
= Expression.Evaluate("let a=3, b=4, c=a*b in c")

ผลลัพธ์12
ตัวอย่างที่ 6: สตริงต่อเนื่องกันExpression.Evaluate( Expression.Constant("abc") & " & " & Expression.Identifier("x"), [x = "def"] )

ใช้ Expression.Constant() เพื่อแปลงค่าเป็นโค้ด M และ Expression.Identifier() สำหรับตัวแปร จากนั้นต่อเข้าด้วยกัน ผลลัพธ์คือสตริง "abcdef"

fx
= Expression.Evaluate(
Expression.Constant("abc") & " & " & Expression.Identifier("x"),
[x = "def"]
)

ผลลัพธ์"abcdef"

FAQs

Expression.Evaluate ต้องใช้ environment parameter เสมอหรือ+

ไม่จำเป็น ถ้านิพจน์ไม่มีการอ้างอิงตัวแปรหรือฟังก์ชันใดๆ สามารถไม่ส่ง environment ได้ เช่น Expression.Evaluate("1 + 1") ใช้ได้เลย แต่ถ้ามีการอ้างอิงฟังก์ชัน เช่น List.Sum ต้องใส่ในสภาพแวดล้อมหรือใช้ #shared

#shared และ record ที่ส่งเป็น environment ต่างกันอย่างไร+

#shared ให้เข้าถึงฟังก์ชันและตัวแปรทั่วโลกของ Power Query ส่วน record ที่ส่งเป็น environment มีแต่สิ่งที่ระบุเท่านั้น ถ้าต้องใช้ฟังก์ชัน List.Sum ด้วย ต้องใส่ [List.Sum = List.Sum] ในการส่ง record

สามารถใช้ Expression.Evaluate ในแต่ละแถวของตาราง (row context) ได้หรือ+

ได้ แต่ต้องระวังเรื่องประสิทธิภาพ การประเมินผลนิพจน์แต่ละแถวจะช้ากว่าการใช้โค้ด M ที่เขียนตรงๆ ใช้เมื่อจำเป็นจริงๆ เท่านั้น

ถ้า document มีไวยากรณ์ผิด จะเกิดอะไร+

จะได้ข้อผิดพลาด (error) ที่บอกตำแหน่งและประเภทของข้อผิดพลาด ต้องตรวจสอบนิพจน์ที่ส่งให้เป็นโค้ด M ที่ถูกต้อง

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ Expression.Evaluate จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้Expression.EvaluateExpression functions
Expression functions (2)
Expression.Constant

Expression.Constant แปลงค่าใด ๆ ให้เป็นข้อความโค้ด M ที่ถูกต้องทางไวยากรณ์ ใช้เมื่อต้องสร้างโค้ด M แบบไดนามิก

Expression.Identifier

Expression.Identifier แปลงชื่อตัวแปรเป็นรูปแบบ M source code ที่ถูกต้อง โดยจัดการกับช่องว่างและอักษรพิเศษอัตโนมัติ

Function values (2)
Function.From

Function.From ใช้เพื่อแปลงฟังก์ชันที่รับเฉพาะลิสต์เดียว (unary function) ให้กลายเป็นฟังก์ชันที่รับพารามิเตอร์แยกกัน

Function.Invoke

Function.Invoke เรียกใช้ฟังก์ชันโดยส่งรายการอาร์กิวเมนต์เป็นพารามิเตอร์ ใช้สำหรับการเรียกฟังก์ชันแบบไดนามิก

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่