MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

Power Automate を利用して Word 文章に画像や文字列を挿入する方法

f:id:mofumofu_dance:20210805013702p:plain

はじめに

この投稿はPaul Muranaによって投稿された以下のビデオ 『Fill and Sign a Word Document with Power Apps and Power Automate without using any premium actions』の日本語解説です。

今回素晴らしい方法を紹介してくれ、日本語で紹介することを快諾してくれた Paul に心より感謝します。

この動画の中では、Power Apps のペン入力コントロールで書いたサインと、サインをした人の名前、サインをした日付を Power Automate のフローに受け渡して Word文章に挿入する方法が紹介されています。

Power Automate における Word 文章へのデータ挿入については Word Online のアクションとして提供されていますが、プレミアムアクションであり、かつ テーブルを使ったデータ挿入がサポートされていないという制限があります。

今回紹介する方法では Word Online のアクションを利用することなく、文字の挿入や図の挿入、そして応用として Word Onlineのアクションでサポートされていない表の挿入までをカバーすることが可能です。

ポイント

Paulの方法で重要になるのは以下の2つです。

  1. Word ファイル を zip に変換して解凍し、その中のファイルを操作する
  2. SharePoint API を利用してファイル群をzipにまとめなおす

ポイント1: Wordファイルの変換と解凍

Word などのオフィスドキュメントは拡張子を .zipに変更して、できたzipファイルを解凍するとドキュメントの中身を閲覧・操作することができます。これはOffice Open XML という規格に基づいてファイルが構成されているためで、オフィスドキュメントの実体は複数のxmlファイル+画像などのアセットになっています。

support.microsoft.com

実際に簡単なドキュメントの拡張子を変更し、解凍してみると複数のxmlファイルと挿入した画像ファイルを見ることができます。

f:id:mofumofu_dance:20210804230931p:plain

文章そのものは生成されたフォルダの[word]>[document.xml] に格納されています。一方で挿入された画像は[Image1.png]~[ImageN.png]の連番のファイル名で [word]>[media]>[Image1.png]に収められています。

今回のフローでは、まずzipを展開したあとのファイル群をSharePointのドキュメントライブラリに保存し、SharePoint の 「ファイルの作成」アクションで 必要なファイルを書き換えていく (画像の場合にはダミーの画像を置き換えていく) ことでデータの挿入と画像の差し替えを実現しています。

f:id:mofumofu_dance:20210804231631p:plain

ポイント2 : SharePoint API を利用してファイル群をzipに

展開された元 Wordファイルだったxmlファイル群を再びWord ドキュメントに戻すためには、複数のファイル・フォルダの構造を含めてzipにまとめる必要があります。

標準のアクション (3rd Party製でない) ではこのようなアクションは提供されていませんが、 Paulにより SharePoint の APIを実行することで複数のファイルからzipを生成できることが示されました。

これはちょうどドキュメントライブラリで複数のファイルを選んでダウンロードをしたときにzipファイルがダウンロードされることに対応しています。

f:id:mofumofu_dance:20210804232133p:plain

Chromeのデベロッパーツールなどを使って、この時のネットワークを見てみると、https://xxxxx-mediap.svc.ms/transform/zip?cs=xxxxxのようなURLに対してフォームデータを送信していることがわかります。

f:id:mofumofu_dance:20210804232459p:plain

フロ-の中でも、SharePoint への HTTP要求のアクションを利用し、このURLに対してファイル群を記述するようなフォームデータを送信することでzipファイルを得ています。

フローの構築

例として、文章の一部の文字列と画像の差し替えを行うフローを紹介します。(今回のフローはパッケージにしたもののダウンロードリンクを用意しました)

ここでは簡単のために、Power Appsからではなくボタントリガーのフローにしています。

前半部分、文字列の置き換えと画像の差し替えを行うフローは下図のようになります。

f:id:mofumofu_dance:20210804234600p:plain

ここでは事前にテンプレートになるWordファイルの文字挿入するためのプレースホルダーを、わかりやすい&ユニークな文字列にしておいてください。フローの中ではxmlファイルのコンテンツを取得してプレースホルダーを入力文字で置き換えています。

xmlの書き換えが終わった後はファイルの上書きをするだけです。この一連のステップによってもとのテンプレートのWordドキュメントから、文字列と画像を差し替えたWordドキュメントの素ができました。

フローの後半部分では、SharePointのHTTP要求を2回使って、まず特殊な形式でファイル一覧を取得し、それを加工したもので /transform/zipにフォームデータを送信します。

f:id:mofumofu_dance:20210805004216p:plain

ポイント2 で紹介した「SharePoint API を利用してファイル群をzipに」では、ファイル群を記述するようなフォームデータをhttps://xxxxx-mediap.svc.ms/transform/zip?cs=xxxxx に対して送信していました。

この時送信する"ファイル群を記述するフォームデータ" が少し特殊で、「リストアイテムをストリームとして取得」します。

これはちょうど、ドキュメントライブラリの特定のフォルダを表示したときに呼ばれているAPIと同一です。

f:id:mofumofu_dance:20210805005257p:plain

docs.microsoft.com

対象のサイトに対してここで書かれているようなUriを使ってリクエストをおくることで、必要な情報がすべて得られます。

それぞれのアクションが数式を利用しているので、ここはサンプルをダウンロードして数式をコピペしてください。

その際、アクション名を揃えておく必要があります。

後半部分については Paul のブログにも解説が書かれていますので、あわせてご覧ください。

www.tachytelic.net

以上で基本のフローは完成です。

このままだとテンプレートとして用意しておいたファイルが書き換えられてしまうので、フローでかきかえる前のdocument.xml と image1 をほかのフォルダーに用意しておいて、処理完了後に書き戻すとよいでしょう。

サンプルと変更ポイント

今回のフローをパッケージとしてエクスポートしたものを以下のURLからダウンロードいただけます。

github.com

インポートの前にSharePoint のドキュメントライブラリにファイルをアップロードしておいてください。

インポートする際には接続情報を聞かれるので、ご自身の環境に作成したSharePoint コネクターを選択してください。

サンプルは私の環境で作成しているため、サイトURLなどが異なるためそのままではエラーになります。下図のとおり、ご自身のサイト・フォルダーを適宜選びなおしてください。

f:id:mofumofu_dance:20210805011606p:plain

f:id:mofumofu_dance:20210805011945p:plain

これらの書き換えを行って保存→実行としていただくと皆さんの環境でもフローが動作するはずです。

※念のためWordファイルをZipにしたものも配置しておきます。

github.com

まとめ

これまではWord Online のプレミアムアクションを利用してWordファイルへの文字列挿入や画像挿入を行う方法が知られていましたが、今回紹介した方法ではSharePointへのHTTP要求などを駆使することでプレミアムアクションを使うことなしにWordファイルの書き換えが実現できました。

この応用として、OpenXML形式にしたがってdocument.xmlを書き換えることでプレミアムアクションでも提供されていない表の挿入なども可能です。

プレミアムでない というだけでなく、提供されていない機能を実現する方法として一度試してみるとよいでしょう。

Acknowledge

I would like to show my greatest appreciation to Paul Murana, original author of this technique, who kindly accepted to rewrite his blog post & video in Japanese.