1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PowerAutomate「ファイルの作成」で使用できない文字

Last updated at Posted at 2022-08-24

ユーザーが決めたファイル名のまま保存すると予期せぬトラブルに繋がる。

Power Automateの「ファイルの作成」アクションでSharePointにファイルを保存するとき、ファイル名の禁則文字があります。
SharePointに手動で保存する場合は問題なくても、Power Automateからファイルを保存する場合はより制限が厳しいようで、ユーザーがつけたファイル名で保存しようとするとフローが異常終了することがあります。

どんなファイル名が利用できないか

SharePoint/OneDriveのドキュメントを見ると、SPOの場合はそもそもファイル名に使用できない" * : < > ? / \ |に加え、
$#も環境により使用できないとの記載があります。

$も#もSharePointに手動で保存する場合は問題なく保存できます。
また、なぜか_vti_の名前も禁則文字で、これは手動でも保存できないようです。
https://support.microsoft.com/ja-jp/office/onedrive-%E3%81%A8-sharepoint-%E3%81%AE%E5%88%B6%E9%99%90%E4%BA%8B%E9%A0%85-64883a5d-228e-48f5-b3d2-eb39e07630fa#invalidfilefoldernames

しかしながら、前述の通りPower Automate経由で保存する場合は制限が厳しいようです。
以下は検証した限りでPower Automate経由で正しく保存でいない文字列の一覧です。

Automate経由での保存でエラーが発生するもの

ファイル名に以下を含むファイルの作成アクションはNot Foundとなり失敗します。
%については、%25などのデコード可能な並びの場合は保存可能でした。

[
    "#",
    "%",
    "_vti_"
]

image.png

保存はできるが勝手に「_」に変換されるもの

ファイルの作成アクションで以下の記号を含めて保存すると、記号が_に変換されて保存されました。
※確率は低いと思いますが、_に変換されることでファイル名が重複して失敗するパターンもあります。

[
    "~",
    "{",
    "}",
]

image.png

対策

ファイル名にこれらの記号は使うなと厳しく指導してください🙁

システム的にファイル名を決めたいところですが、
テクニック的な備忘録として、禁止文字をリネームする方法を考えましたので残しておきます。

PowerAutomateで複数の文字列を置換する

Apply to Eachを使った方法

全体像

  • 禁則文字リストを作る
  • それを to each で回す
  • 置換して変数に格納

image.png

詳細

まずは変数「元ファイル名」に保存したいファイル名を設定します。
image.png

禁則文字を配列で定義します。
image.png

禁則文字の配列をApply to each で回します。
一旦作成アクションで、変数のファイル名をreplaceして、
次に変数の設定アクションでこれをセットします。
※変数の設定が自己参照できないため。
image.png

置換後
image.png

Selectアクションの場合

選択アクションでやる方法も考えてみました。
1文字の記号ならこれでなんとか・・・

全体像

image.png

以下のようにファイル名と禁止文字マップを作成。
{"記号":"置換後文字"}の配列
image.png

選択アクションで、ファイル名の文字列を一文字ずつ分解。
image.png

//これで文字数分の配列を作り
range(0,length(outputs('作成:ファイル名')))
//1文字ずつ出力
substring(outputs('作成:ファイル名'),item(),1)

String.Split("")ができないのは不便。

もう一つの選択アクションで禁止文字をマッピング
image.png

//item()が禁止文字マップに存在しない場合→ item()を出力
//存在する場合→ 禁止文字マップから置換後文字列を出力
if(equals(empty(outputs('作成:禁止文字マップ')?[item()]),true),item(),outputs('作成:禁止文字マップ')?[item()])

最後は配列から文字列に戻します。
image.png

一文字ずつに分解する都合上、_vti_は対応できませんでした。
方法思いついたら追記します。

Power Automateでファイルを保存する場合は注意ですね。
可能であれば、システム側で名前を付けて、元ファイル名は他の場所で保持してあげたいです。

関連記事

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?