Cheat Sheet Power Query Bahasa M untuk Analis
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.
Apa itu bahasa M di Power Query?
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.
Gimana struktur dasar script M?
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 apa aja buat ambil data?
| 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 apa aja buat merapikan tabel?
| 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 apa aja buat teks, angka, dan tanggal?
| 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.
Gimana cara gabungin tabel di M?
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.
Contoh kasus: 12 file CSV toko_berkah jadi satu tabel
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.
Kesalahan umum waktu nulis M
- Salah huruf besar kecil. Penyebab error nomor satu buat pemula.
Text.trimnggak ada, yang adaText.Trim. - Nama langkah dengan spasi tanpa tanda pagar. Tulis
#"Baris Difilter", bukanBaris Difilter. - Ngubah tipe kolom di awal padahal masih ada baris kotor. Bersihin dulu, baru ubah tipe. Kalau kebalik, satu sel berisi "n/a" bisa bikin seluruh kolom jadi error.
- Hardcode path folder di script. Waktu file pindah, semua query mati. Taruh path di satu sel Excel, panggil pakai
Excel.CurrentWorkbook(). - Nggak nulis apa arti tiap kolom. Query yang jalan mulus hari ini bakal bikin bingung tiga bulan lagi. Catat definisinya di kamus data spreadsheet.
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.
FAQ
Apa bedanya bahasa M sama DAX?
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.
Perlu hafal semua fungsi bahasa M?
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.
Kenapa script M aku error padahal nama fungsinya bener?
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.
Gimana cara lihat script M dari query yang udah aku bikin lewat klik-klik?
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.
Penutup
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.
Artikel terkait
INDEX MATCH Google Sheets: Lookup Lebih Fleksibel dari VLOOKUP (2026)
INDEX MATCH gabung dua fungsi buat lookup yang bisa nyari ke kiri dan nggak gampang rusak. Ini alasan banyak analis pindah dari VLOOKUP.
SUMPRODUCT Google Sheets: Hitung Berbobot Tanpa Ribet (2026)
SUMPRODUCT ngaliin dua kolom atau lebih baris per baris, terus jumlahin hasilnya. Cocok buat total qty kali harga sampai hitungan bersyarat.
REGEXMATCH Google Sheets: Cek Kecocokan Pola Teks (2026)
REGEXMATCH ngecek apakah teks cocok sama pola tertentu dan balikin TRUE atau FALSE. Cocok buat validasi nomor HP, email, sampai filter data berantakan.