MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Power Automateでデータ操作に親しむための練習問題 その1

何回かに分けて、Power Automate でデータ操作に親しむための練習問題とその解答例を書いていこうと思います。

Power Automateで躓くデータ操作、この問題を通じて使いこなせることを期待しています。

問題では、例として以下のJSONを利用します。

{
  "squadName": "Super hero squad",
  "homeTown": "Metro City",
  "formed": 2016,
  "secretBase": "Super tower",
  "active": true,
  "members": [
    {
      "name": "Molecule Man",
      "age": 29,
      "secretIdentity": "Dan Jukes",
      "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"]
    },
    {
      "name": "Madame Uppercut",
      "age": 39,
      "secretIdentity": "Jane Wilson",
      "powers": [
        "Million tonne punch",
        "Damage resistance",
        "Superhuman reflexes"
      ]
    },
    {
      "name": "Eternal Flame",
      "age": 1000000,
      "secretIdentity": "Unknown",
      "powers": [
        "Immortality",
        "Heat Immunity",
        "Inferno",
        "Teleportation",
        "Interdimensional travel"
      ]
    }
  ]
}

フローの共通部分

練習問題に入る前に、すべてに共通する部分を作っておきます。"作成"アクションに上記のサンプルのJSONをコピペし、"JSONの解析" アクションで動的コンテンツとして利用できる状態にしておきましょう。

これで準備完了です。早速データ操作に慣れるための問題を解いていきましょう。

回答例を示しますが、これは一つの方法であって、Power Automateでは他にもたくさんの方法があると思います。

ご自身の作成したフローと見比べて、何が違うのかを考えてみてください。

問題集

問題1 : "homeTown"の値のみを抽出

期待結果 : Metro City という文字列が得られること

解答例

最も簡単ではありますが、すべての基本になる操作です。必要な値を得るには、動的コンテンツから目的のプロパティ名を探して "作成" アクションの入力に指定します。

問題2 : "members"の配列をアレイ型変数に設定

期待結果 : 下図のようなアレイ型の変数が定義されていること

解答例

データ型を指定して変数を定義するためには "変数を初期化する" アクションを利用します。

配列型 (アレイ型)の変数を定義する場合には、種類には "アレイ” を指定します。

フローの途中で変数の値を確認する場合は "作成" アクションの入力に変数を設定しましょう。

問題3 : "members" 以外のプロパティを含むJSONを作成する

データを取得した後に得られるすべてを利用するケースもそれほど多くないかなと思います。そんな時はプロパティを絞ったデータを途中で作成したりします。 ここでは配列型の "members" 以外の 情報を抽出してみましょう。

期待結果 : 以下のJSONオブジェクトが得られること

{
  "squadName": "Super hero squad",
  "homeTown": "Metro City",
  "formed": 2016,
  "secretBase": "Super tower",
  "active": true
}

解答例

比較的たくさんの方法がありますが、ここでは式を使わずに結果を得る方法を紹介します。

まず "作成" アクションを追加し、そこに以下の文字列をコピペします。

{
  "squadName": ,
  "homeTown": ,
  "formed": ,
  "secretBase": ,
  "active": 
}

貼り付けたらそれぞれの ":” (コロン) の右側にカーソルを移動させ、動的コンテンツから対応する値を挿入します。

他にも、今回は削除するプロパティが1つなので、式を使ってremoveProperty(body('JSON_の解析'),'members') という風にも書くことができます。

問題4 : "members" のうち、"age"が100未満のデータのみを抽出する

データ操作で躓きやすい、配列型のデータ操作を行います。

まずはよく使う数値を対象にしたフィルター処理をやってみましょう。

期待結果 : 以下のようなデータが得られることを確認してください。

[
    {
      "name": "Molecule Man",
      "age": 29,
      "secretIdentity": "Dan Jukes",
      "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"]
    },
    {
      "name": "Madame Uppercut",
      "age": 39,
      "secretIdentity": "Jane Wilson",
      "powers": [
        "Million tonne punch",
        "Damage resistance",
        "Superhuman reflexes"
      ]
    }
]

解答例

何らかの条件をもとにデータを抽出する場合には、 "アレイのフィルター処理" を使います。アレイのフィルター処理は、もとになる配列のうち、指定した条件に合致するデータを抽出するアクションです。

指定しているのが除外する条件ではない ことに気を付けてください。

配列を処理する前には手前で "JSONの解析"アクションを入れておくと、動的コンテンツを利用できるので便利です。

今回の例では年齢が100未満のデータなので、フィルターの条件には 『"age" が 次の値未満 100 』のように設定します。

この時 フィルター処理の元になる配列には 前段の JSON解析の結果 "本文" を、条件になる "age" は同じく JSON解析の "age" から取ってきます。

問題5 : "members" のうち、"age"が20~29 に入るデータを抽出する

この問題は2つの見方があります。1つは上限と下限を使ったデータの絞り込み(複数条件でのフィルター)。もう1つは包含関係、つまり"age"が [20,21,22,...,29]の中に含まれることの確認による絞り込みです。

どちらのアプローチも覚えておくと非常に便利なので、試してみてください。結果としては以下のデータが得られます。

[
    {
      "name": "Molecule Man",
      "age": 29,
      "secretIdentity": "Dan Jukes",
      "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"]
    }
]

解答例1 : 複数条件のフィルター

複数条件のフィルターは、単純に "アレイのフィルター処理" を2回実行すればOKです。

2回繰り返すのですが、その間に1個、JSONの解析アクションを挟みます。

どのアクションの出力結果を利用するのか気を付けながら動的コンテンツから選んでいきましょう。

解答例2 : 指定の配列に含まれるかチェック

年齢の場合には "age" が整数なので、 『20~29の間に入る』 は 『[20, 21, 22, ... , 29] に含まれる』と同義です。

このような、一定の範囲を表す配列に含まれる/含まれない でフィルターすることも、Power Automateのデータ操作では頻繁に発生します。

まずは [20,.,..,29]の配列を作成します。これには range()関数を利用します。 range(20, 10) と指定することで、20からスタートして10個の連続する整数 が生成されます。

これで準備はOK。あとはフィルター処理を書いていきます。

先ほどのフィルターとは "age" の入っている場所が違うことにお気づきでしょうか? 今回のフィルター条件は『[20,21,...,29] の配列が 次の値を含む : "age" 』 というものです。

つまり、ageが [20,21,...,29] に 含まれる なら OK, 含まれなければ除外 ということです。(受動態にするとわかりやすい)

このように、チェックする値が指定の配列に含まれるか・含まれないかによってもフィルターができるということを覚えておきましょう。その場合はチェックする値は右側のボックスに入ります。

フィルター処理の発展編 : "members" を使って年齢に関するヒストグラムを作成する

さて、ここまでの問題を使って、特定のユーザーデータから、年齢に関するヒストグラムを作成してみましょう。

サンプルだと少しデータが少ないので、以下のJSONを作成アクションにコピペして始めていきます。

年齢をたくさん含むJSON

[
    {"age":29},
    {"age":48},
    {"age":34},
    {"age":33},
    {"age":32},
    {"age":37},
    {"age":48},
    {"age":26},
    {"age":53},
    {"age":38},
    {"age":24},
    {"age":45},
    {"age":32},
    {"age":29},
    {"age":31},
    {"age":37},
    {"age":46},
    {"age":48},
    {"age":30},
    {"age":24}
]

この配列を基に、 20代、30代、...50代のデータ数を数えたヒストグラムを作成してみてください。

最終的には頻度の一覧として以下のようなJSON配列が得られることを想定しています。

[
    {
        "age_20": 5
    },
    {
        "age_30": 9
    },
    {
        "age_40": 5
    },
    {
        "age_50": 1
    }
]

それぞれ20代は5回、30代は9回...という具合に出現していることを表しています。

この問題の解答は数日後にアップします。