【上級編】【PowerQuery】ループ処理を直接書く方法!

今回はPowerQuey繰り返し処理
直接プログラムを書いて作ってみます!

プログラムを触っている方だと想像つきやすいと思います!

同じ処理を繰返し実行させるとき
プログラミングではForとかLoopを使って表現したりします。
ではこのPowerQueryM言語では
どのように書く事ができるでしょうか?

以前PowerQueryでBacklogのAPIに接続する記事でも少し触れましたが

【PowerQuery】Backlogの課題一覧情報をAPIから取得してExcelに自動出力!

今回はもっと深堀して紹介します!

では私が実際に職場の業務効率化に取り入れた
2つ方法を紹介します!

動画で見たい方はコチラ

繰り返し処理と再帰処理について

かじむー

では繰り返し処理と、その仲間になる再帰処理について概要を説明するよ~!

繰り返し処理について

繰り返し処理というのは
同じ処理を指定した回数実行させることです!

例えば「いらっしゃいませ」という挨拶を3回繰り返す!
「いらっしゃいませ、いらっしゃいませ、いらっしゃいませ」というかんじですね。
サンドウィッチマンから「BookOffか」と突っ込まれそうですが。

プログラミング触ってる方なら
For文やLoop文、While文などに当たりますね。

再帰処理について

再帰処理は繰り返し処理の仲間みたいなものです。
どういうものかというと「自分自身を呼び出す」という処理です!

例えば「挨拶メソッド」というものがあったとします。
一言目に「おはよう」二言目に「おやすみ」
一旦ここまでで「おはよう」と「おやすみ」が出てきました。

次に「@挨拶メソッド」と書いてます。
ここでこの挨拶メソッドそのものが呼び出されると思ってください。

では続きの処理はどうなるかと言うと
同じように「おはよう」と「おやすみ」が出てきます。

そしてその後、また自分自身を呼び出す事で
同じように「おはよう」と「おやすみ」が出てきます。

ただこのままだと永遠にループしてしまうので
限りのあるものに使うか、回数制限などを設けておきましょう。

かじむー

僕はフォルダの中身を検索する時に、再帰処理を使ってサブフォルダの中身まで検索する様なプログラムを作るよ~!

ではこれら2つの処理を
PowerQueryで書いてみようと思います!

M言語で繰り返し処理を書いてみよう!

かじむー

では繰り返し処理で1つ実際に作ってみよう!

ここに1~10まであるテーブルがあります。
この横の列に「偶数だけ2倍」になった列を作ろうと思います。

テーブルをリストに変換する

ここで繰り返し処理を実現させてくれる
M言語の関数は「List.TransformMany」です。

早速作っていきます!

まずこの関数(List.TransformMany)はリストを扱う関数なので
テーブルからリストに変換します。

テーブルからリストに変換
list_number = table_number[No]

テーブル名の直後に [列名] とするだけで
その列をリストに変換する事ができます!

List.TransformMany関数で繰り返し処理を行う

そしてここから偶数だけを2倍した列を作ります。

result = List.TransforMany () と書いた後
括弧の中に3つ設定していきます。

1つ目繰り返し処理させたいリストlist_number」を書きます。

2つ目は以下の様に書きます。

List.TransformManyの第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つ目は以下の様に書きます。

List.TransformManyの第3引数
(x, y) => {x, y}

xと言うのは先ほど説明した list_number の中身が格納されたものです。
yと言うのは、xを使った式の結果が格納されたものです。
ここで { x, y } と書けば、x と y が結果に出力されます。

一旦出してみましょうか。

そうすると、リストの中に、さらにリストとなった形で出力されました。
これだとちょっと見にくいですよね?

こういった形をテーブルに変換するTable.FromRows関数を使います。

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つずつ取り出して
同じ処理、今回は偶数を二倍する、という
繰返し処理を実装する事ができました!

1 2