ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【質問回答】ExcelのテーブルをClearCollect関数の実行文に変換する

Twitterでこんな話をしました。なので作りました。

今回は「フローで配列操作と文字列操作を駆使すればこんなこともできる」という話をします。


フローをGitHubで公開しました。下記リンク先からダウンロードしてください。
github.com

今回実現したいこと

フローの入力情報はExcelのテーブルです。

それを今回のフローで処理して出力したものがこちらです。これはPower Apps のClearCollect関数です。

この関数を実行すると、入力情報と同じ構造のテーブルが作成されます。


今回のフローによって得たいものはテーブルを作成するためのClearCollect関数の実行文です。これをフローで作ります。

解説するフロー図

アクションの設定を閉じた状態のフロー図


開いた状態のフロー図

ステップごとに解説します。

フローを使用する準備

このフローでは入力情報の格納場所としてOneDrive for Business 上のフォルダを使います。OneDrive for Businessにこのフロー用のフォルダを作成します。

ルートフォルダに「テーブルからコレクションコードを作成」という名前のフォルダを作成します。このフォルダに入力情報として使用するExcelファイルをアップロードします。

今回使用する表がフローから参照できるように表をテーブルにしておきます。

フローの使用イメージ

フローを開いて、Excelファイルのパスを指定します。

ClearCollect関数で作成するコレクションの名前をテキストで入力します。

そしたら、この編集画面で手動実行をします。

実行します。

フローの実行が完了しました。一番下のアクションの出力に表示されたテキストが今回得たい実行文です。この部分を全選択してコピーしてください。

メモ帳にコピペしてみました。これをPower Appsにもっていきましょう。

Power Appsでボタンをひとつ配置しました。OnSelectプロパティに先ほどのテキストを貼り付けます。貼り付けたら、「テキストの書式設定」をクリックして整形してみましょう。

整形してみました。ちゃんと実行文のルールに従って記載されているのが分かりますね。

では実行。ぽちっ。

期待通りコレクションが作成されました。(`・ω・´) フオォォォォ


では、フローをステップごとに解説します。

ステップごとの説明

「手動でフローをトリガーします」トリガー

名前の通り、フローを手動で実行するトリガーです。今回はこのトリガーでの入力情報はありません。

「表内に存在する行を一覧表示」アクション

Excel Online (Business)」>「表内に存在する行を一覧表示」アクションです。指定したExcelファイルを読み込みます。

今回のフローではこのアクションで入力情報であるテーブルのデータを読み込みます。

「変数を初期化する-テーブルから取得したデータ」アクション

「変数」>「変数を初期化する」アクションです。テーブルから読み込んだデータを処理した結果の格納先として使う変数を宣言します。

「Apply to each-各行の不要なプロパティを削除」アクション

「コントロール」>「Apply to each」アクションです。読み込んだテーブルの行の数だけ繰り返し処理を行うために使います。

「配列変数に追加-「@odata.etag」と「ItemInternalId」を削除済み」アクション

「変数」>「配列変数に追加」アクションです。

このアクションの目的は2つです。

  • テーブルから読み込んだ行が持つプロパティ情報のうち最終的な出力に不要なものを削除する。
    • @odata.etag
    • ItemInternalId
  • 不要なプロパティの削除が完了した行データを配列変数「テーブルから取得したデータ」に追加する


"inputs": {
 "name": "テーブルから取得したデータ",
 "value": "@removeProperty(removeProperty(json(replace(string(item()),'@odata.etag','@odataetag')),'@odataetag'),'ItemInternalId')"
},

removeProperty関数は名前の通りプロパティを削除するための関数です。「@odata.etag」と「ItemInternalId」という2つのプロパティを削除するためにremoveProperty関数を2回使用しています。

ここでのポイントがひとつあります。
「@odata.etag」プロパティはそのまま削除しようとするとフローに怒られます。そのため、削除時に工夫がいります。

エラーが発生する削除方法:
removeProperty(item(),'@odata.etag')


エラーメッセージ:
行 '0'、列 '0' のアクション '作成' 入力でテンプレート言語式を処理できません: '指定されたプロパティ名 '@odata.etag' に無効な文字 '.' が含まれています。この名前には、次の記号を使用できません: '[, ], .'。'。


そのため以下の4ステップで「@odata.etag」の削除を行っています。

  • string関数を使って配列を文字列に変換
  • 変換結果として得た文字列をreplace関数を使って「@odata.etag」から「@odataetag」に置き換え(= ”.” を消した)
  • json関数を使って配列に戻す
  • removeProperty関数を使って「@odataetag」プロパティを削除


このやりかたは簡易版JSON Dictionary のアクション解説でも触れています。
参考:
wataruf.hatenablog.com

「作成-コレクション名」アクション

「データ操作」>「作成」アクションです。ClearCollect関数で作成するコレクションの名前をこのアクションで定義しています。

「作成-配列の括弧を削除」アクション

これも「データ操作」>「作成」アクションです。フローの最終形で不要な括弧を取り除きます。

"inputs": "@replace(replace(string(variables('テーブルから取得したデータ')),'[',''),']','')"

これで下図の赤枠の部分の括弧を削除します。

「作成-コレクションコードを生成」アクション

これも「データ操作」>「作成」アクションです。こまでのアクションで作成したテキストをこのアクションで合わせることでClearCollect関数の実行文のテキストを生成します。

"inputs": "ClearCollect(@{outputs('作成-コレクション名')},@{outputs('作成-配列の括弧を削除')})"

「作成-プロパティ名についているダブルクォーテーションを削除」アクション

これも「データ操作」>「作成」アクションです。

このアクションではClearCollect関数によって作成するコレクションの列名からダブルクォーテーションを削除しています。プロパティ名にダブルクォーテーションがあるとエラーになることを私が知らなかったため、フローの最後で急遽このアクションをいれました。

"inputs": "@replace(replace(replace(outputs('作成-コレクションコードを生成'),'{\"','{'),'\":',':'),',\"',',')",

フローの最終的な出力

フローの最終的な出力が下図のClearCollect関数の実行文です。フローによる配列操作・文字列操作に興味があるかたはこのフローのステップごとの処理と最終結果を見比べてみてください。

最後に

投稿予定のものが増えてきました。順次投稿していきます。
・「フォームの未回答者への催促」フローの応用編その2
・「Power Automate でCSVのデータを配列に変換する」フローの解説編
・「PowerShellを使ったフロー一覧の取得」でフローの最終実行日も取得する
・「ExcelのテーブルをCrearCollect関数の実行文に変換する」フローの応用編

今回は以上です。

[追記]フローを改良しました。

https://wataruf.hatenablog.com/entry/2022/07/31/233017