今回はPowerQueyの繰り返し処理を
直接プログラムを書いて作ってみます!
プログラムを触っている方だと想像つきやすいと思います!
同じ処理を繰返し実行させるとき
プログラミングではForとかLoopを使って表現したりします。
ではこのPowerQueryのM言語では
どのように書く事ができるでしょうか?
以前PowerQueryでBacklogのAPIに接続する記事でも少し触れましたが
【PowerQuery】Backlogの課題一覧情報をAPIから取得してExcelに自動出力!今回はもっと深堀して紹介します!
では私が実際に職場の業務効率化に取り入れた
2つの方法を紹介します!
繰り返し処理と再帰処理について
かじむー
繰り返し処理について
繰り返し処理というのは
同じ処理を指定した回数実行させることです!
例えば「いらっしゃいませ」という挨拶を3回繰り返す!
「いらっしゃいませ、いらっしゃいませ、いらっしゃいませ」というかんじですね。
サンドウィッチマンから「BookOffか」と突っ込まれそうですが。
プログラミング触ってる方なら
For文やLoop文、While文などに当たりますね。
再帰処理について
再帰処理は繰り返し処理の仲間みたいなものです。
どういうものかというと「自分自身を呼び出す」という処理です!
例えば「挨拶メソッド」というものがあったとします。
一言目に「おはよう」二言目に「おやすみ」
一旦ここまでで「おはよう」と「おやすみ」が出てきました。
次に「@挨拶メソッド」と書いてます。
ここでこの挨拶メソッドそのものが呼び出されると思ってください。
では続きの処理はどうなるかと言うと
同じように「おはよう」と「おやすみ」が出てきます。
そしてその後、また自分自身を呼び出す事で
同じように「おはよう」と「おやすみ」が出てきます。
ただこのままだと永遠にループしてしまうので
限りのあるものに使うか、回数制限などを設けておきましょう。
かじむー
ではこれら2つの処理を
PowerQueryで書いてみようと思います!
M言語で繰り返し処理を書いてみよう!
かじむー
ここに1~10まであるテーブルがあります。
この横の列に「偶数だけ2倍」になった列を作ろうと思います。
テーブルをリストに変換する
ここで繰り返し処理を実現させてくれる
M言語の関数は「List.TransformMany」です。
早速作っていきます!
まずこの関数(List.TransformMany)はリストを扱う関数なので
テーブルからリストに変換します。
list_number = table_number[No]
テーブル名の直後に [列名] とするだけで
その列をリストに変換する事ができます!
List.TransformMany関数で繰り返し処理を行う
そしてここから偶数だけを2倍した列を作ります。
result = List.TransforMany () と書いた後
括弧の中に3つの値を設定していきます。
1つ目は繰り返し処理させたいリスト「list_number」を書きます。
2つ目は以下の様に書きます。
(x) => if Number.IsEven(x) then {x*2} else {x}
このxにlist_numberの中身が1つずつ渡されます。
(x) => の右側は、そのxを使った式を書きます!
今回は「xが偶数なら2倍する。奇数ならそのまま。」という式になります。
Number.IsEven()は数値が偶数だった場合Trueを返す関数です。
例えばまずxに1が渡されると、{x}でそのまま{1}という結果に。
次にxに2が渡されると、2倍されて{4}という結果になりますね。
そして3つ目は以下の様に書きます。
(x, y) => {x, y}
xと言うのは先ほど説明した list_number の中身が格納されたものです。
yと言うのは、xを使った式の結果が格納されたものです。
ここで { x, y } と書けば、x と y が結果に出力されます。
一旦出してみましょうか。
そうすると、リストの中に、さらにリストとなった形で出力されました。
これだとちょっと見にくいですよね?
こういった形をテーブルに変換するTable.FromRows関数を使います。
result = Table.FromRows(
List.TransformMany(
list_number
,(x) => if Number.IsEven(x) then {x*2} else {x}
,(x, y) => {x, y}
),
{"No", "偶数2倍"}
)
ここで第2引数にリスト形式で
{“No”, “偶数2倍”} と書く事で
出力する列名を指定できます!
はい!分かり易くなりましたね!
例えば先ほどの最終結果をyだけにすれば
右側の「偶数2倍」列だけが出力されます。
はい!この様にデータの中身を1つずつ取り出して
同じ処理、今回は偶数を二倍する、という
繰返し処理を実装する事ができました!