Power Automate ファイルを配列変数で扱う際はbase64ToBinary変換が必須|添付ファイルの保存など

Power Automateで「メールの添付ファイルを一度『配列変数』に入れてから、最後にまとめて『ファイルの作成』アクションでSharePointに保存する」というフローを組んだとき、なぜか保存されたPDFなどのファイルが壊れて開けなくないという問題に直面した。

結論から言うと、この問題は「ファイルコンテンツ」を保存する際にbase64ToBinary関数が必要だったため。

  • エラーの原因: 添付ファイルを一度変数に入れることで、Power Automateがファイルの属性情報を見失ってしまう
  • 解決策: base64ToBinary(ファイルコンテンツ) を使う
  • なぜ直るのか: 関数を通すことで、中身が「純粋なバイナリデータ(application/octet-stream)」として正しく再定義され、正常に保存・展開できるようになるため(と思われる)

この記事では、変数を経由するとファイルが破損してしまう問題の紹介と、base64ToBinaryを使ったフローの組み方までをスクショ付きで解説。

スポンサーリンク

添付ファイルをSharePointのドキュメントライブラリに保存する

Outlookの添付ファイルをSharePointに保存する際は、「添付ファイルの取得」アクションで取得したデータを、「ファイルの作成アクション」の「ファイルコンテンツ」に代入する。
これで添付ファイルを受け取る(トリガーを起動する)と、
添付ファイルがドキュメントライブラリに保存されて、
PDFファイルはもちろん開くことができる

ファイルを一度配列変数に入れるとファイルが破損する

例えばメールも添付ファイルも保存するという要件で、ファイルの作成アクションを末尾にまとめたいとする。

そのときはきっとこういうフローになって、配列変数に「メール」「添付ファイル」それぞれを追加していく。
ファイルの作成アクションで配列に詰めたファイル名とファイルコンテンツ(contentBytes)を入れる。
これでフローを再実行すると、フロー自体は成功し、
ファイルも2つきちんと保存される。
しかし、PDFファイルはなぜか破損してしまう。
※メール(eml)ファイルは問題なく開ける。

対策:base64ToBinary関数を使用

対策は「ファイルコンテンツ」に入れる際、base64ToBinary関数を使用すること。

こんな感じで、配列変数にファイルコンテンツを格納する際、base64ToBinaryでバイト配列に変換して、フローを再実行すると、
base64ToBinary(outputs('添付ファイルの取得_(V2)')?['body/contentBytes'])
ファイルが2つ保存され、
PDFファイルを無事開くことができる。

原因(の推測):メタデータの消失

Power Automateは内部処理がブラックボックスな部分もありますが、今回の挙動から推測すると、原因は「メタデータの消失」だと思われる。

アクション同士を直接繋げばPower Automate側で $content-type などをいい感じに設定してくれるけど、一度「変数」を経由させることでそれらの属性情報が剥がれ落ちてしまい、単なる文字列として解釈されてファイルが壊れるのかと。
そこに base64ToBinary を噛ませることで、「純粋なバイナリデータ(application/octet-stream)」と再定義され、正常に保存できるようになったと思われる。

※ちなみにメール(emlファイル)が変数経由でも無事だったのは、emlがテキストベースのデータ構造だから。
メタデータが剥がれても中身のテキスト自体は維持されやすいため、影響を受けなかったのだと推測。

コメント

タイトルとURLをコピーしました