Value.ReplaceType แทนที่ประเภทข้อมูล (type) ของค่าด้วยประเภทใหม่ที่กำหนด โดยไม่เปลี่ยนข้อมูลจริง
= Value.ReplaceType(value as any, type as type) as any
= Value.ReplaceType(value as any, type as type) as any
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| value | any | Yes | ค่าที่ต้องการแทนที่ประเภท เช่น เรคคอร์ด, ตาราง, หรือค่าอื่นๆ | |
| type | type | Yes | ประเภทใหม่ที่ต้องการกำหนดให้กับค่า |
let Source = [Column1 = 123, Column2 = "text"], TypedRecord = Value.ReplaceType( Source, type [Column1 = number, Column2 = text] ) in TypedRecordlet
Source = [Column1 = 123, Column2 = "text"],
TypedRecord = Value.ReplaceType(
Source,
type [Column1 = number, Column2 = text]
)
in
TypedRecord
[Column1 = 123, Column2 = "text"]
let Source = [Amount = 500], TypedRecord = Value.ReplaceType(Source, type [Amount = number]), RecordFields = Type.RecordFields(Value.Type(TypedRecord)) in Recor…let
Source = [Amount = 500],
TypedRecord = Value.ReplaceType(Source, type [Amount = number]),
RecordFields = Type.RecordFields(Value.Type(TypedRecord))
in
RecordFields[Amount][Type]
type number
let SourceTable = Table.FromRows( {{1, "Alice"}, {2, "Bob"}}, {"ID", "Name"} ), TypedTable = Value.ReplaceType( SourceTable, type table [ID = number, Name = tex…let
SourceTable = Table.FromRows(
{{1, "Alice"}, {2, "Bob"}},
{"ID", "Name"}
),
TypedTable = Value.ReplaceType(
SourceTable,
type table [ID = number, Name = text]
)
in
TypedTable
ตารางที่มีโครงสร้างประเภท ID = number, Name = text
let Source = {{1, "Alice"}, {2, "Bob"}, {3, "Carol"}}, ToRecords = List.Transform(Source, each [ID = _{0}, Name = _{1}]), RecordType = type [ID = number, Name =…let
Source = {{1, "Alice"}, {2, "Bob"}, {3, "Carol"}},
ToRecords = List.Transform(Source, each [ID = _{0}, Name = _{1}]),
RecordType = type [ID = number, Name = text],
TypedRecords = List.Transform(ToRecords, each Value.ReplaceType(_, RecordType))
in
TypedRecords
{[ID = 1, Name = "Alice"], [ID = 2, Name = "Bob"], [ID = 3, Name = "Carol"]}
let Source = [Name = "John", Age = 30], RecordType = type [Name = text, optional Age = number], TypedRecord = Value.ReplaceType(Source, RecordType), Fields = Ty…let
Source = [Name = "John", Age = 30],
RecordType = type [Name = text, optional Age = number],
TypedRecord = Value.ReplaceType(Source, RecordType),
Fields = Type.RecordFields(Value.Type(TypedRecord))
in
Fields[Age][Optional]
true
เจอคำถามนี้บ่อยครับ 😅 Value.ReplaceType แทนที่ ‘ประเภท’ ของข้อมูล (type definition) ส่วน Value.ReplaceMetadata แทนที่ ‘ตัวอักษร’ (metadata) เช่น ชื่อแสดงผล, รูปแบบวันที่ ข้อมูลจริงไม่เปลี่ยน Type ก็ไม่เปลี่ยนเหมือนกัน
ไม่เลยครับ เฉพาะ Type Tag ที่บอก Power Query ว่า “ค่า 123 นี้คือ number” เท่านั้น ค่า 123 ยังคงเป็น 123 เหมือนเดิม ไม่มีการแปลงค่า
ได้ห้อยครับ ใช้ได้กับ table, record, list หรือค่าใดๆ ก็ได้ แค่ต้องมี Type ที่ตรงกับโครงสร้างจริง
เมื่อต้องรวม (merge) ข้อมูลจากหลายแหล่ง หรือสร้าง Custom Function ที่ต้องการให้ Type ชัดเจน ลองไม่ใช้แล้ว debug Type Error บ่อยเหว่ 😭 ใช้ Value.ReplaceType แล้วมันจะจับปัญหาเร็ว
คนส่วนใหญ่งง เรื่องนี้ครับ Value.ReplaceType แค่บอก Type ไม่เปลี่ยนค่า ส่วน Type Conversion (เช่น Number.FromText(“123”)) เปลี่ยนค่าจริง “123” ตัวอักษร เป็น 123 ตัวเลข ReplaceType = ติดป้ายให้ Conversion = เปลี่ยนจริง
ไม่ได้นะครับ ต้องเป็น Type Value เช่น type [Amount = number] หรือ type table [ID = number] โปรแกรมต้องเข้าใจ Type ของคุณ จึงไม่สามารถ parse จาก Text String ได้
Value.ReplaceType บอก Power Query ว่าข้อมูลนี้ควรถูกปฏิบัติเป็นประเภทไหน (record, table หรือ type อื่นๆ) โดยไม่เปลี่ยนค่าจริง เพียงแต่เปลี่ยน Type Metadata เท่านั้น
ที่เจ๋งคือ ใช้ Value.ReplaceType แล้ว IntelliSense จะเข้าใจโครงสร้างข้อมูลของคุณ ช่วยจับข้อผิดพลาด Type ได้เร็วกว่า และเมื่อต้องรวมข้อมูลจากหลายแหล่ง มันจะไม่สับสนว่า Amount ตัวนี้มันควรเป็นจำนวนจริงหรือข้อความ
ส่วนตัวผม ใช้ Value.ReplaceType ในทุกครั้งที่สร้าง Custom Function ที่ต้องการให้ Type Signature ชัดเจน ลองแล้วแม่นมากครับ ผมไม่ต้องเดาหรือ debug Type Error อีก 😎