M言語基本
※使用データは「疑似個人情報生成」様で生成したダミーです
データの種類
テーブル

レコード
テーブルから1行だけ抽出すると「レコード」になる
「キー:値」という辞書型のような形
指定方法:テーブル名{数字}

リスト
テーブルから1列だけ抽出すると「リスト」になる
番号順にデータを格納した一次元配列のような形
指定方法:テーブル名[列名]

値だけ取得(ドリルダウン)
レコードからドリルダウンするときは [] を使い、キーで指定

リストからドリルダウンする時は {} を使い、番号で指定

テーブルからドリルダウンする時は両方を組み合わせ

スペースなどがある場合:#" " で囲む
データの取得
テーブルまたは範囲から
読み込んだ直後

「= Excel.CurrentWorkbook()」はオブジェクトとオブジェクト名のテーブルを取得する模様

{}は行の指定
数字を入れると行番号で指定できる
行を文字列で指定したい場合は [列名=""] と書く


行をクリックすると下に中身のプレビューが表示される
レコードから [] でキーを選択すると中身が展開される

Excelブックから
ファイルパスの指定
ソース = Excel.Workbook(File.Contents("ファイルパス"), null, true)

行を選択:{[Item="Sheet1″,Kind="Sheet"]}

キーを選択:[Data]

1行目をヘッダーに昇格
ヘッダー昇格 = Table.PromoteHeaders(ソース, [PromoteAllScalars=true])

空のクエリ
リストの作成
値を{}で囲むだけ

レコードの作成
キーと値のセットを [] で囲む

テーブルの作成
ハッシュタグ関数?と呼んでいいかわからないがこれが使える
(普通の関数と違って小文字である点に注意)
・第1引数:列名のリスト
・第2引数:行データのリスト(1行1リストずつ格納)

別のテーブルを参照
テーブル名を入れるだけ

別テーブルの1列をユニークリストにする
ソース = List.Distinct(テーブル1[血液型])

別テーブルから複数列を取得する
ソース = Table.SelectColumns(テーブル1, {"性別","血液型"})

[] を入れ子にすると同じことができる
= テーブル名[[列名A],[列名B]]

別テーブルから複数列を取得して重複を削除する
ソース = Table.Distinct(Table.SelectColumns(テーブル1, {"性別","血液型"}))

関数使わない版 こちらの方が書きやすい

クエリの追加(行方向の結合)
2つのテーブルで列の名前が一致してないときれいに結合されない
(列名が一致しない場合、その列が増えて全部nullになる)
ソース = Table.Combine({テーブルA, テーブルB})

列と行の操作
列の選択と削除
選択した列だけ残し、他の列を削除する
列選択 = Table.SelectColumns(ソース,{"氏名(カタカナ)", "性別"})
選択した列を削除する
列削除 = Table.RemoveColumns(ソース,{"氏名(カタカナ)", "性別"})
行の保持
上位の行を保持
行の保持 = Table.FirstN(ソース,3)
下位の行を保持
行の保持 = Table.LastN(ソース,3)
行の範囲を保持
行の保持 = Table.Range(ソース,4,10)
・第2引数の開始位置はゼロベースで指定(=1件目の開始位置は0)
・第3引数は終了位置ではなく「開始位置からx件分を保持」という意味

行の削除
上位の行を削除
行の削除 = Table.Skip(ソース,3)
下位の行を削除
行の削除 = Table.RemoveLastN(ソース,3)
代替行を削除
行の削除 = Table.AlternateRows(ソース,1,1,2)
「代替」の意味が謎だが、実態は「削除する行のパターン」を指定できる
・第2引数:開始位置(ゼロベース)
・第3引数:削除する件数
・第4引数:残す件数
この例では1件消して2件残す、1件消して2件残す、…という繰り返しになっている

重複を削除
重複の削除 = Table.Distinct(ソース, {"出身地", "血液型"})
空白行を削除
※テーブルにあるすべての列が対象になる様子
空白の削除 = Table.SelectRows(ソース, each
not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null})))
エラーを削除
エラー行の削除 = Table.RemoveRowsWithErrors(ソース, {"出身地", "血液型"})
並び替え
昇順は「Order.Ascending」、降順は「Order.Descending」
ソート優先順に数字がつくが、濃い灰色モードではほぼ見えない

単体の列でソートする
第2引数が二重リスト?になってる点が独特
並び替え = Table.Sort(ソース,{{"年齢", Order.Ascending}})
複数列でソートする
第2引数のリスト内で、さらにリストをカンマ区切りする
並び替え = Table.Sort(ソース,{{"年齢", Order.Ascending}, {"出身地", Order.Descending}})
変換
行数のカウント
行数 = Table.RowCount(ソース)

列の追加
Index列の追加
#"列追加:Index" = Table.AddIndexColumn(ソース, "インデックス", 0, 1, Int64.Type)
・第3引数を1にすれば1からのIndexになる
カスタム列の追加
each の後が数式を書く場所
列追加 = Table.AddColumn(ソース, "カスタム", each [年齢]*2)
条件列の追加
each の後にif文を書くだけ
条件列 = Table.AddColumn(ソース, "カスタム", each if [年齢] >= 18 then "成人" else null)
フィルター
基本的なフィルター
単体の値でフィルター
each のあとに条件を()で囲む
フィルター = Table.SelectRows(ソース, each ([血液型] = "A"))
複数の値でフィルター
()の中で or や and を使って条件を繋げる
フィルター = Table.SelectRows(ソース, each ([血液型] = "A" or [血液型] = "B"))
部分一致でフィルター
よくある「*」などのワイルドカードは使えない
フィルター = Table.SelectRows(ソース, each Text.Contains([出身地], "京"))