TL;DR
Bahasa M adalah bahasa script di balik Power Query, dipakai buat ngambil, ngerapiin, dan ngegabungin data sebelum masuk ke Excel atau Power BI. Struktur dasarnya let yang berisi daftar langkah bernama, lalu in yang nunjuk langkah mana yang jadi hasil akhir. Fungsi yang paling sering kepakai analis cuma sekitar 25, dikelompokkan jadi empat: sumber data (Csv.Document, Folder.Files), bentuk tabel (Table.SelectRows, Table.Group, Table.AddColumn), olah nilai (Text.Trim, Date.Year, Number.Round), dan penggabungan (Table.NestedJoin, Table.Combine). Bahasa M sensitif huruf besar kecil, jadi table.selectrows bakal error.
Bahasa M adalah bahasa script di balik Power Query. Tiap kali kamu klik tombol filter atau hapus kolom di Power Query Editor, Excel nulis satu baris M di belakang layar.
Yang bikin M layak dipelajari: begitu kamu bisa baca dan edit scriptnya langsung, kerjaan yang tadinya 12 klik jadi satu baris ketikan.
Halaman ini isinya fungsi yang beneran kepakai sehari-hari, dikelompokkan per tugas. Simpan buat dibuka pas lagi ngerjain.
Bahasa M adalah bahasa formula yang dipakai Power Query buat ngambil data dari sumber, ngerapiin bentuknya, lalu ngirim hasilnya ke worksheet atau model data. M jalan di tahap persiapan data, sebelum ada perhitungan apa pun. Ini bagian yang di dunia data disebut proses ETL.
M ada di Power Query Excel, Power BI Desktop, dan Dataflow. Satu script yang kamu tulis di Excel bisa kamu tempel ke Power BI tanpa diubah.
Satu hal yang wajib kamu inget dari awal: M itu case sensitive. Table.SelectRows jalan, table.selectrows error.
Semua query M punya bentuk yang sama: let berisi daftar langkah bernama, terus in nunjuk langkah mana yang jadi hasil akhir. Tiap langkah dipisah koma, dan langkah berikutnya biasanya manggil nama langkah sebelumnya sebagai input.
let
Sumber = Csv.Document(File.Contents("D:\data\penjualan.csv"), [Delimiter=",", Encoding=65001]),
Header = Table.PromoteHeaders(Sumber, [PromoteAllScalars=true]),
Tipe = Table.TransformColumnTypes(Header, {{"tanggal", type date}, {"nilai", Int64.Type}}),
#"Baris Selesai" = Table.SelectRows(Tipe, each [status] = "selesai")
in
#"Baris Selesai"
Nama langkah yang ada spasinya wajib ditulis pakai #"...". Ini yang bikin script hasil klik-klik kelihatan penuh tanda pagar, soalnya Power Query kasih nama otomatis kayak #"Changed Type".
| Fungsi | Gunanya | Contoh |
|---|---|---|
Excel.CurrentWorkbook() | Ambil tabel dari workbook yang lagi kebuka | Excel.CurrentWorkbook(){[Name="tbl_transaksi"]}[Content] |
Csv.Document | Baca file CSV | Csv.Document(File.Contents("D:\a.csv"), [Delimiter=";", Encoding=65001]) |
Excel.Workbook | Baca file Excel lain | Excel.Workbook(File.Contents("D:\a.xlsx"), true) |
Folder.Files | Daftar semua file di satu folder | Folder.Files("D:\data\bulanan") |
Web.Contents | Ambil data dari URL atau API | Json.Document(Web.Contents("https://api.contoh.id/data")) |
Table.PromoteHeaders | Jadiin baris pertama sebagai nama kolom | Table.PromoteHeaders(Sumber, [PromoteAllScalars=true]) |
Catatan encoding: 65001 itu kode UTF-8. Kalau nama produk kamu berubah jadi karakter aneh setelah impor CSV, ini yang pertama dicek.
| Fungsi | Gunanya | Contoh |
|---|---|---|
Table.SelectRows | Filter baris | Table.SelectRows(t, each [nilai] > 100000) |
Table.SelectColumns | Simpan kolom tertentu doang | Table.SelectColumns(t, {"tanggal", "nilai"}) |
Table.RemoveColumns | Buang kolom | Table.RemoveColumns(t, {"catatan"}) |
Table.RenameColumns | Ganti nama kolom | Table.RenameColumns(t, {{"val", "nilai"}}) |
Table.AddColumn | Bikin kolom baru | Table.AddColumn(t, "total", each [qty] * [harga], type number) |
Table.TransformColumnTypes | Ubah tipe data kolom | Table.TransformColumnTypes(t, {{"tanggal", type date}}) |
Table.Group | Agregasi per kelompok | Table.Group(t, {"kota"}, {{"omzet", each List.Sum([nilai]), type number}}) |
Table.Distinct | Hapus baris duplikat | Table.Distinct(t, {"order_id"}) |
Table.Sort | Urutkan baris | Table.Sort(t, {{"omzet", Order.Descending}}) |
Table.FirstN | Ambil n baris teratas | Table.FirstN(t, 10) |
Table.RowCount | Hitung jumlah baris | Table.RowCount(t) |
Table.ReplaceValue | Ganti nilai tertentu | Table.ReplaceValue(t, null, 0, Replacer.ReplaceValue, {"qty"}) |
Table.UnpivotOtherColumns | Ubah kolom bulanan jadi baris | Table.UnpivotOtherColumns(t, {"produk"}, "bulan", "nilai") |
Kata kunci each itu singkatan buat fungsi satu argumen. each [nilai] > 100000 artinya "buat tiap baris, cek apakah kolom nilai lebih dari 100.000".
| Fungsi | Gunanya | Contoh hasil |
|---|---|---|
Text.Trim | Buang spasi di ujung teks | Text.Trim(" Bandung ") jadi Bandung |
Text.Upper / Text.Proper | Seragamkan huruf | Text.Proper("toko berkah") jadi Toko Berkah |
Text.Replace | Ganti potongan teks | Text.Replace("Rp1.000", "Rp", "") jadi 1.000 |
Text.Split | Pecah teks jadi list | Text.Split("a,b,c", ",") jadi list 3 item |
Text.Contains | Cek isi teks | Text.Contains([produk], "minyak") |
Number.Round | Bulatkan angka | Number.Round(77320.26, 2) jadi 77320.26 |
Date.Year / Date.Month | Ambil bagian tanggal | Date.Year([tanggal]) jadi 2025 |
Date.StartOfMonth | Tanggal awal bulan | 1 Okt 2025 dari 27 Okt 2025 |
Date.ToText | Format tanggal jadi teks | Date.ToText([tanggal], [Format="yyyy-MM"]) |
List.Sum / List.Average | Agregasi list angka | Dipakai di dalam Table.Group |
try ... otherwise | Tangani error tanpa berhenti | try Number.From([nilai]) otherwise 0 |
Pola try ... otherwise ini padanan IFERROR di dunia rumus Excel. Kepakai banget waktu ada satu baris kotor yang bikin seluruh query gagal refresh.
Ada dua cara gabung, dan sering ketuker. Append nempelin baris ke bawah, dipakai kalau strukturnya sama. Merge nempelin kolom ke samping berdasarkan kunci, mirip VLOOKUP.
// Append: tumpuk banyak tabel jadi satu
Table.Combine({tabel_jan, tabel_feb, tabel_mar})
// Merge: tarik nama pelanggan ke tabel transaksi
let
Gabung = Table.NestedJoin(transaksi, {"pelanggan_id"}, pelanggan, {"id"}, "data_pel", JoinKind.LeftOuter),
Buka = Table.ExpandTableColumn(Gabung, "data_pel", {"nama", "kota"}, {"nama_pelanggan", "kota"})
in
Buka
Pilihan JoinKind yang tersedia: Inner, LeftOuter, RightOuter, FullOuter, LeftAnti, RightAnti. Dua yang terakhir kepakai buat nyari baris yang nggak punya pasangan, misalnya transaksi dengan pelanggan_id yang nggak terdaftar. Itu cara cepat ngecek kualitas data kamu.
Dataset toko_berkah yang aku pakai buat latihan punya 12 file CSV bulanan, total 84.320 baris transaksi. Sebelum pakai Power Query, ngegabungin manual butuh copy paste 12 kali plus rapiin format tanggal yang beda-beda.
let
Folder = Folder.Files("D:\toko_berkah\2025"),
HanyaCsv = Table.SelectRows(Folder, each Text.EndsWith([Name], ".csv")),
Isi = Table.AddColumn(HanyaCsv, "Data", each Csv.Document([Content], [Delimiter=",", Encoding=65001])),
Ambil = Table.SelectColumns(Isi, {"Name", "Data"}),
Buka = Table.ExpandTableColumn(Ambil, "Data", {"Column1", "Column2", "Column3"}, {"tanggal", "produk", "nilai"}),
BuangHeader = Table.SelectRows(Buka, each [tanggal] <> "tanggal"),
Bersih = Table.TransformColumns(BuangHeader, {{"produk", Text.Trim, type text}}),
Tipe = Table.TransformColumnTypes(Bersih, {{"tanggal", type date}, {"nilai", Int64.Type}})
in
Tipe
Script ini jalan 9 detik di laptop biasa buat 84.320 baris. Yang lebih penting: bulan depan tinggal taruh file baru di folder yang sama, klik Refresh All, selesai.
Langkah BuangHeader itu yang sering kelewat. Waktu 12 file digabung, baris header dari file kedua sampai kedua belas ikut kebawa jadi baris data. Filter [tanggal] <> "tanggal" nyingkirin 11 baris sampah itu.
Text.trim nggak ada, yang ada Text.Trim.#"Baris Difilter", bukan Baris Difilter.Excel.CurrentWorkbook().Daftar lengkap semua fungsi M ada di referensi resmi Power Query M dari Microsoft. Buka pas kamu butuh fungsi yang nggak ada di halaman ini.
Bahasa M jalan sebelum data masuk model, tugasnya ngambil dan ngerapiin tabel. DAX jalan setelah data masuk model, tugasnya ngitung ukuran kayak total penjualan dan persentase pertumbuhan. Gampangnya, M ngatur bentuk tabel, DAX ngitung angka dari tabel yang udah rapi. Dua-duanya ada di Power BI, tapi cuma M yang ada di Power Query Excel.
Nggak perlu. Sebagian besar kerjaan harian kepenuhan sama sekitar 25 fungsi yang ada di cheat sheet ini. Sisanya bisa kamu cari di referensi resmi waktu butuh. Cara belajar yang paling cepat: klik tombol di antarmuka Power Query, terus lihat baris M yang muncul di formula bar. Lama-lama kamu bisa ngedit langsung tanpa klik.
Cek huruf besar kecilnya. Bahasa M itu case sensitive, jadi Table.SelectRows jalan sementara table.selectrows langsung error. Penyebab kedua yang sering: nama langkah yang ada spasinya harus ditulis pakai tanda pagar dan kutip, misalnya #"Baris Difilter". Penyebab ketiga: tipe kolom belum diubah, jadi teks dibandingkan sama angka.
Buka Power Query Editor, terus klik Home lalu Advanced Editor. Di situ muncul seluruh script M dari query kamu, lengkap dengan semua langkah yang tadi kamu bikin lewat tombol. Kamu bisa edit langsung di jendela itu. Sebelum ngubah, salin dulu isinya ke Notepad supaya gampang balik kalau ada yang rusak.
Dua hal yang paling ngubah kecepatan kerja kamu di Power Query: bisa baca script di Advanced Editor, dan hafal pola Table.SelectRows plus Table.Group. Sisanya nyusul sambil jalan.
Mulai dari satu query yang udah ada. Buka Advanced Editor, baca barisnya satu per satu, cocokkan sama tabel di halaman ini.
Kalau hasil rapiannya mau langsung dipakai buat laporan mingguan, lanjut ke dashboard rapat mingguan penjualan. Bookmark halaman ini biar gampang dibuka pas lagi ngoding M.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Punya ratusan angka dan mau tau sebarannya masuk ke rentang mana aja? FREQUENCY ngitung distribusi frekuensi sekali jalan, tanpa nulis COUNTIFS berkali-kali.
SUMIFS ribet kalau kriterianya banyak dan sering ganti. Rumus database Excel kayak DSUM baca kriteria dari sel terpisah, jadi kamu tinggal ubah tabel kecil tanpa nyentuh rumus.
DATEDIF ngasih umur bulat, tapi kadang kamu butuh angka desimal kayak 27,6 tahun buat hitung masa kerja atau bunga. YEARFRAC ngasih pecahan tahun dengan presisi.