のいのログ

【PAD】Power Fx有効時にフォルダ型を使ってファイルパスを指定するときの注意点

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って言われたら「パスなんだな」としか思わないじゃないですか。

しかも、今まではそれで本当にパスの一部として機能してしまっていたのが、なおさらややこしさに拍車をかけています。

市民開発が容易なノーコード開発ツールとして作るなら、リファレンスにも書かずに初学者が理解に困るような変更をしないでほしいです。

【間違い対策】変数名を変更する

上記のようにファイル・フォルダ型は「パス」ではないです。

しかし、自動生成される変数名はSpecialFolderPathです。名が体を表していません。プログラミングにおいて、誤った変数命名はアンチパターンとされます。

そのため、変数の名前をSpecialFolderPath以外へ変更することをオススメします。

(例:DesktopFolderObjectAppDataRoamingFolderなど)

まとめ

Power Fx使用時に、フォルダ型と文字列を結合してファイルを指定するときは、以下の3つのどれかを使いましょう。

1.テキスト結合演算子の&を使う

=SpecialFolderPath.FullName & "\PADテスト用.xlsx"

2.文字列補間で変数を${}で囲う

${SpecialFolderPath.FullName}\PADテスト用.xlsx

3.文字列補間で全体を$""で囲い、さらに変数を{}で囲う

=$"{SpecialFolderPath.FullName}\PADテスト用.xlsx"
シェアしていただけると嬉しいです!
  • URLをコピーしました!

この記事を書いた人

ローコード・RPAエンジニア。DX・業務効率化を専門に開発。

前職では鉄道運転士として働きながら、社内複業でSwift・Power Platformで業務効率化を推進していた。

コメント

コメントする

CAPTCHA


目次(クリックでジャンプできます)