Power Automate DesktopでPower Fxが一般公開されてから久しいですが、Power Fx有効時にフォルダ型の扱いが地味に変更になっていることに気づきました。
具体的には、フォルダ型変数と文字列を結合してパスを作るときに、従来の表記とPower Fxでは文字列結合演算子以外にも注意すべき点が増えています。
例:「特別なフォルダーを取得」して、その配下のファイルを開くとき
デスクトップやドキュメントフォルダなどを取得するときに、「特別なフォルダーを取得する」アクションをよく使うと思います。
「特別なフォルダーを取得する」で取得したフォルダは、初期名がSpecialFolderPath
という変数に保存されます。
ここからは、デスクトップ上にあるExcelファイル(PADテスト用.xlsx
)を開く例を使って、Power Fxが有効・無効でどう違うのかを見ていきます。
Power Fx無効時
「Excelを起動」アクションを以下のように設定します。
パスの指定は以下のように入力しています。
%SpecialFolderPath%\PADテスト用.xlsx
簡単ですね。
Power Fx有効時
間違った書き方
Power Fx有効時に変数と文字列を結合する方法は以下の3つです。
// 1.テキスト結合演算子の「&」を使う
=SpecialFolderPath & "\PADテスト用.xlsx"
// 2.文字列補間で変数を${}で囲う(この場合、先頭の「=」と文字列を囲う「""」が不要)
${SpecialFolderPath}\PADテスト用.xlsx
// 3.文字列補間で全体を$""で囲い、さらに変数を{}で囲う
=$"{SpecialFolderPath}\PADテスト用.xlsx"
しかし、これらはすべてエラーになります。
結合演算子と文字列補間で文面は異なりますが、怒られている内容は同じで、
指定された変数(SpecialFolderPath
)の中身が、どうあがいでも文字列にならねえよ!
って言ってます。
正しい書き方
じゃあどうしたら良いか?
SpecialFolderPath.FullName
プロパティを使うんです。
正しい書き方
=SpecialFolderPath.FullName & "\PADテスト用.xlsx"
${SpecialFolderPath.FullName}\PADテスト用.xlsx
=$"{SpecialFolderPath.FullName}\PADテスト用.xlsx"
これで正常にファイルが開けるようになります。
文字列を結合しないなら直接使える
ややこしいんですが、文字列として結合しないなら変数を直接使うことができます。
というのも、上の画像の通り「フォルダーを含む変数」であればフォルダの指定として成り立つんですね。
先ほどまでの例では、「フォルダーを含む変数」を文字列に結合して「完全なパス」を作ろうとしていたので問題が起きていました。
フォルダ型は本来、ただのパスの文字列じゃない
ファイル型とフォルダ型は、ただそのファイル・フォルダがあるパスを示すだけでなく、それ以外にも作成日・ファイルステータス・サイズなど、そのファイル・フォルダに関する様々なプロパティが含まれているオブジェクトです。
本来は文字列に直接結合できるデータ型ではないんです。
従来表記ではプログラム側が都合よく解釈(「暗黙的な型変換」といいます。)してくれていましたが、Power Fxでは型の定義が厳格化され、ファイル型・フォルダ型から文字列型への暗黙的な型変換は行われないように変更されたようです。
正しいコードで登場したFullName
プロパティは、「フォルダのフルパスの文字列」が格納されたプロパティです。
プロコード(C#やJavaなど)でプログラミングを行ったことがない人にはピンと来ないかもしれませんね。
悪い例でやっていたことは、手紙に住所を書くときに建物という「概念」をペンで書こうとしていたようなものです。
型の厳格具合は言語によって異なりますし、PADの従来表記のようにファイルオブジェクトが必要なタイミングで暗黙的型変換されてパスとして機能するプロコードも存在します。柔軟さと堅牢さのトレードオフなので、一概にこちらの仕様がいいというわけでもないと思います。
※MSに対してちょっとした文句※
「そもそも"特別なフォルダーを取得する"アクションで自動生成される変数の名前がSpecialFolderPath
なのが良くないのでは?」って私は思います。
SpecialFolderPath
って言われたら「パスなんだな」としか思わないじゃないですか。
しかも、今まではそれで本当にパスの一部として機能してしまっていたのが、なおさらややこしさに拍車をかけています。
市民開発が容易なノーコード開発ツールとして作るなら、リファレンスにも書かずに初学者が理解に困るような変更をしないでほしいです。
まとめ
Power Fx使用時に、フォルダ型と文字列を結合してファイルを指定するときは、以下の3つのどれかを使いましょう。
// 1.テキスト結合演算子の「&」を使う
=SpecialFolderPath.FullName & "\PADテスト用.xlsx"
// 2.文字列補間で変数を${}で囲う
${SpecialFolderPath.FullName}\PADテスト用.xlsx
// 3.文字列補間で全体を$""で囲い、さらに変数を{}で囲う
=$"{SpecialFolderPath.FullName}\PADテスト用.xlsx"
それと、間違いの防止のために変数の名前をSpecialFolderPath
から変更することをオススメします。(例:DesktopFolderObject
、AppDataRoamingFolder
など)