Power Automate Desktop が Excel ファイルを読み取り JSON データで Node-RED に連携するメモ

Power Automate Desktop が Excel ファイルを読み取り JSON データで Node-RED に連携するメモです。

元となる Excel データ

image

デスクトップに Excel ファイル sample.xlsx を置いています。

image

データは テストデータ生成 で作っています。

Power Automate Desktop の流れ

今回は Power Automate Desktop に Excel データの JSON データ化までをやってもらいます。本来であれば、ローカルのファイルの読み取りからのデータ化って結構苦労するので、こうやって手軽にやれる最も効果的なところを担当していただきます!

image

Foreach の中身はやや冗長に見えますが、各行の内容を JSON 文字列にするあたりを(自分に)伝わりやすいように書いています。CurrentItemString という変数を用意して1行ごとの情報を JSON 文字列で作成してます。

最初は %'\"ID\":\"' + CurrentItem['ID'] + '\",' + '\"Name\":\"' + CurrentItem['Name'] + '\",' + '\"Detail\":\"' + CurrentItem['Detail'] + '\"'% のように1ステップにまとめていたのですが、読みにくく作りにくくあまり良いやり方ではなかったのでこうしました。プログラムをワンライナーで書くがごとく文字列の結合式まわりでエラーが出ないように作りきるのに苦労したので、未来の自分に向けてあえて分けて分かりやすく書いてます。

もっとJSONに簡単に変換できる方法があるかもしれません。カスタムオブジェクトをJSONにするフローあたりが気になってはいるので、このあたり調べてみます。

image

image

Excel ワークシートの読み取りでは「範囲の最初の行に列名が含まれています」をオンにしています。こうすることで読み取ったデータにカラム名で整理されるので取り出しやすいです。また、セル範囲取得は一旦手動で決めています。このあたりは、状況によって動的で入れることもありそうです。

image

Node-RED へつなぐ部分は 、Web サービスの呼び出しでつなぎます。

image

要求本文で %'{\"excelDatas\":[' + JSONArrayJoinedText + ']}'% で文字列で最終的なJSONデータを作っています。JSONArrayJoinedText が、各行のデータが JSON 文字列で入っている最後に JSONStringList のリストをカンマで結合してJSON配列文字列に変換してます。これでカンマをつけるのに最後を気にする必要がないのでよくなりました。

Node-RED の流れ

image

このようなフローを作りました。今回は手元のPCで実行した localhost な Node-RED です。もちろん、どこかのサーバーに置いた Node-RED でも URL さえ分かれば受け取れます。わりとローカル同士の実行の方がファイアウォールなどが影響しないか心配だったので早めにテストできてよかったです。

image

受け取ったデータエンコードされているので $decodeUrlComponent(payload) でデコードしたのちにJSON化しているところが、地味ながらもシンプルなフローに落とし込むために試行錯誤できて楽しかったです。

インポートできるフローデータも置いておきます。

[{"id":"95259983.9eaf28","type":"http in","z":"cfc71d3c.acdb4","name":"","url":"/power_automate","method":"post","upload":false,"swaggerDoc":"","x":320,"y":300,"wires":[["c71f5b0b.bf4218","3030a235.6ccd0e"]]},{"id":"ee5656a7.ff5378","type":"http response","z":"cfc71d3c.acdb4","name":"","statusCode":"","headers":{},"x":710,"y":300,"wires":[]},{"id":"3ba15268.ee715e","type":"debug","z":"cfc71d3c.acdb4","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":990,"y":200,"wires":[]},{"id":"c71f5b0b.bf4218","type":"change","z":"cfc71d3c.acdb4","name":"OK! を返す","rules":[{"t":"set","p":"payload","pt":"msg","to":"OK!","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":550,"y":300,"wires":[["ee5656a7.ff5378"]]},{"id":"3030a235.6ccd0e","type":"change","z":"cfc71d3c.acdb4","name":"$decodeUrlComponent(payload)\t","rules":[{"t":"set","p":"payload","pt":"msg","to":"$decodeUrlComponent(payload)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":200,"wires":[["34bfd09b.55ed8"]]},{"id":"34bfd09b.55ed8","type":"json","z":"cfc71d3c.acdb4","name":"","property":"payload","action":"","pretty":false,"x":830,"y":200,"wires":[["3ba15268.ee715e"]]},{"id":"6541fdb.3bf6d04","type":"comment","z":"cfc71d3c.acdb4","name":"受け取ったデータをデコードとJSON化","info":"","x":630,"y":160,"wires":[]},{"id":"70bd0c68.a9e824","type":"comment","z":"cfc71d3c.acdb4","name":"単純な返答","info":"","x":540,"y":260,"wires":[]}]

実行してみる

image

Node-RED を起動し Power Automate Desktop でフローを実行してみます。

image

Node-RED の debug タブでこのようにJSONデータとして扱いやすい形で実行できます。