shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Power Query】eachとアンダースコアの理解

Power Queryで自動作成される式で、eachとアンダースコアについて調べた備忘録です。アンダースコアそのもの役割は、【Power Query】識別子 _ (アンダースコア) の理解にまとめたので、eachとの関係性についてです。

内容:

Power Queryの「each」の基本

実務上は、eachについては「それぞれ」という意味でなんとなく理解でよいと思います。

Microsoft Learnの説明では、以下の記載があります。

each-expression は、_ (アンダースコア) という名前の 1 つのパラメーターを受け取る型指定されていない関数を宣言するための構文の省略形です。

M 言語関数 - PowerQuery M | Microsoft Learn

このMicrosoft Learnの説明ページには「たとえば、次の宣言のペアは意味的には同等です」とあり、次の事例が記載されています。

each _ + 1 
(_) => _ + 1  
each [A] 
(_) => _[A] 
 
Table.SelectRows( aTable, each [Weight] > 12 ) 
Table.SelectRows( aTable, (_) => _[Weight] > 12 ) 

つまり、「each」は「(_) =>」と同じという理解で良さそう。

なお、”_[A]”のアンダースコアは省略できるとのことです。

「each」と「(_) =>」の違いを調べた結果

上記のMicrosoft Learnの説明をもとに実際に試した結果が以降です。

「値」という数値フィールドがある表について、次の式を実施しました。

each [値] + 1
each _[値] + 1
(_)=>_[値] + 1
(_)=>[値] + 1

その結果が次のとおり、同じ結果が得られています。

4つの式で同じ値が得られている

「each」と「(_) =>」の違いを調べた結果

なお、このステップの詳細は、詳細エディターで以下のとおりです。

let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"分類", type text}}),
    式1 = Table.AddColumn(変更された型, "each [値] + 1", each [値] + 1, type number),
    式2 = Table.AddColumn(式1, "each _[値] + 1", each _[値] + 1, type number),
    式3 = Table.AddColumn(式2, "(_)=>_[値] + 1", (_)=>_[値] + 1, type number),
    式4 = Table.AddColumn(式3, "(_)=>[値] + 1", (_)=>[値] + 1, type number)
in
    式4

「each _ + 1 」は表でない場面等で利用

上記のMicrosoft Learnの説明にある「each _ + 1 」を前述の表で利用すると、次のようなエラーが発生します。

Expression.Error: 演算子 + を型 Record および Number に適用できません。

Expression.Error: 演算子 + を型 Record および Number に適用できません。のメッセージ

「each _ + 1 」の実施例

アンダースコアのデータが、Record型のために「+」の演算子が適用できないというエラーとなっています。

このRecord型については以下にも記載しています。

shikumika.org

以上、Power Queryで自動作成される式で、eachとアンダースコアについて調べた備忘録でした。