MoreBeerMorePower

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

SlidePackとPower Automateを使ってデータとテンプレートからPowerPointスライドを自動生成

今回はSlidePackというPowerPoint向けのテンプレートエンジンを提供するサービスを使って、OneDriveに配置したデータ (JSON) とテンプレートになるpptxファイルから自動的にスライドを作成するフローをご紹介します。

SlidePack は 2018年に設立されたQitarという会社が提供しているPowerPoint向けのテンプレートエンジンです。10月9日にAPI利用の無料トライアルが開始されたので、早速使ってみました。

slidepack.io

やっていることはPowerPointの中に {xxxxxx} のようなプレースホルダーを書いておいてそのファイルをテンプレートとし、別途用意するJSONファイルに挿入する内容を書いておくことで2つを結合したスライドを作成するというものです。

これまでもWordやExcelへのデータの流し込み、テンプレート化は様々な3rdパーティのサービスあるいはPower Automate上でもWordのコネクターとして提供されてきました。このような仕組みをPowerPointに適用したようなサービスはあまり見ないように思います。

f:id:mofumofu_dance:20201019230845p:plain
SlidePackの動作イメージ

注目ポイントは、今回このスライド作成の処理がAPIで提供されたということです。APIが提供されればあとはiPaaSなどを利用してHTTPリクエストを行うことで自動処理ができますよね。

また、ほかのSaaSが持つデータからテンプレートへの流し込みもやりやすくなります。

今回提供されたAPIに関しては以下のAPIドキュメントが非常に有効です。認証~実際の操作、ケース別のテンプレート、制限事項まで一通り書いてあるので、どのようなことができるかはここを先に見てもいいかもしれません。

SlidePack API Docs

API無料トライアルは30日間です。この申し込みはSlidePackのトップページから申し込みフォームに移動し、必要事項を入力することで仮パスワードが送られてきます。

f:id:mofumofu_dance:20201019232242p:plain

では実際にPower Automateでの処理を見ていきましょう。

準備 : データとテンプレートのzip圧縮

SlidePackのAPIでははじめに、データを収めたJSONファイルとテンプレートのPPTXファイルを含むzipファイルのアップロードを行います。 (認証したあと)

必ず データは data.jsonというファイル名で、テンプレートのPPTXは template.pptx というファイル名で作成してください。

f:id:mofumofu_dance:20201019233158p:plain

今回のフローでは、このzipファイルをOneDriveから取得してSlidePackの処理を進めていきます。

Power Automateでの処理

まずフローの全体は下図のようになります。

f:id:mofumofu_dance:20201019234549p:plain
SlidePackでスライドを作成するフロー

  1. まずはセッションの払い出しを行います。ここで返却されるデータを利用してzipファイルのアップロードを行うので、結果をパースしておきます。
  2. zipファイルアップロードのためのmultipart/form-dataを構成します。
  3. 最初に取得しておいたOneDrive上のzipファイル (のコンテンツ) をアップロードします。
  4. アップロードが成功したら、レンダリングを実行します。これにより生成されたPPTXのスライドのダウンロードURLが返されます。

4.のステップまで完了したら、あとはメールでダウンロードURLをおくったり、OneDriveに保存してください。

1. セッションの払い出し

SlidePackのすべてのエンドポイントでは、SlidePackのWebコンソールで発行されるAPIキーを利用します。

f:id:mofumofu_dance:20201019235614p:plain
APIキーの発行

Power Automate で「HTTP」アクションを追加し、以下の通り設定してください。

パラメータ 設定値
メソッド POST
URI https://slidepack.io/sessions
ヘッダー {"Authorization": "Bearer ここにAPIキー"}

f:id:mofumofu_dance:20201020000027p:plain

このリクエストで返されるデータを「JSONの解析」アクションでパースします。

f:id:mofumofu_dance:20201020000321p:plain

スキーマには以下を設定してください。これで後続ステップで返却されたデータを動的コンテンツから利用できます。

{
    "type": "object",
    "properties": {
        "session": {
            "type": "object",
            "properties": {
                "uuid": {
                    "type": "string"
                },
                "created_at": {
                    "type": "string"
                },
                "rendered_at": {},
                "render_succeeded": {},
                "render_slide_count": {},
                "render_message": {}
            }
        },
        "upload": {
            "type": "object",
            "properties": {
                "action": {
                    "type": "string"
                },
                "method": {
                    "type": "string"
                },
                "enctype": {
                    "type": "string"
                },
                "params": {
                    "type": "object",
                    "properties": {
                        "acl": {
                            "type": "string"
                        },
                        "key": {
                            "type": "string"
                        },
                        "Content-Type": {
                            "type": "string"
                        },
                        "X-Amz-Security-Token": {
                            "type": "string"
                        },
                        "X-Amz-Credential": {
                            "type": "string"
                        },
                        "X-Amz-Algorithm": {
                            "type": "string"
                        },
                        "X-Amz-Date": {
                            "type": "string"
                        },
                        "Policy": {
                            "type": "string"
                        },
                        "X-Amz-Signature": {
                            "type": "string"
                        }
                    }
                }
            }
        }
    }
}

2. multipart/form-dataの構成

SlidePackのzipファイルアップロードは multipart/form-dataでデータを送ります。

以前 Cloudmersive のAPIで行ったのと同様の手続きで、multipart/form-dataをJSONで書き換えます。

SlidePackのAPIドキュメントを参考に、JSONを書くか、「JSONの解析」アクションを「Parse JSON」にリネームしたのち、「作成」アクションを追加して以下のように設定してください。

{
  "$content-type": "multipart/form-data",
  "$multipart": [
    {
      "body": "private",
      "headers": {
        "Content-Disposition": "form-data; name=\"acl\""
      }
    },
    {
      "body": "@{body('Parse_JSON')?['upload']?['params']?['key']}",
      "headers": {
        "Content-Disposition": "form-data; name=\"key\""
      }
    },
    {
      "body": "application/zip",
      "headers": {
        "Content-Disposition": "form-data; name=\"Content-Type\""
      }
    },
    {
      "body": "@{body('Parse_JSON')?['upload']?['params']?['X-Amz-Security-Token']}",
      "headers": {
        "Content-Disposition": "form-data; name=\"X-Amz-Security-Token\""
      }
    },
    {
      "body": "@{body('Parse_JSON')?['upload']?['params']?['X-Amz-Credential']}",
      "headers": {
        "Content-Disposition": "form-data; name=\"X-Amz-Credential\""
      }
    },
    {
      "body": "@{body('Parse_JSON')?['upload']?['params']?['X-Amz-Algorithm']}",
      "headers": {
        "Content-Disposition": "form-data; name=\"X-Amz-Algorithm\""
      }
    },
    {
      "body": "@{body('Parse_JSON')?['upload']?['params']?['X-Amz-Date']}",
      "headers": {
        "Content-Disposition": "form-data; name=\"X-Amz-Date\""
      }
    },
    {
      "body": "@{body('Parse_JSON')?['upload']?['params']?['Policy']}",
      "headers": {
        "Content-Disposition": "form-data; name=\"Policy\""
      }
    },
    {
      "body": "@{body('Parse_JSON')?['upload']?['params']?['X-Amz-Signature']}",
      "headers": {
        "Content-Disposition": "form-data; name=\"X-Amz-Signature\""
      }
    },
    {
      "body":@{outputs('Get_file_content')?['body']} ,
      "headers": {
        "Content-Disposition": "form-data; name=\"file\""
      }
    }
  ]
}

※ここではOneDriveに保存されたファイルを「Get file content」のアクションで取得している前提です。もしほかのデータソースを利用する場合にはJSONの最後の部分

    {
      "body":@{outputs('Get_file_content')?['body']} ,
      "headers": {
        "Content-Disposition": "form-data; name=\"file\""
      }
    }

この"body":の右側を書き換えてください。

3. zipファイルのアップロード

zipファイルをアップロードするためのHTTPアクションを追加し各種パラメータを設定します。

パラメータ 設定値
メソッド POST
URI @{body('Parse_JSON')?['upload']?['action']} ※JSONの解析の動的コンテンツから追加
ヘッダー {"content-type": "multipart/form-data; boundary=--@{guid()}"}
ボディ @{outputs('Compose_multipart_formdata')} ※STEP2の結果を挿入

f:id:mofumofu_dance:20201020001933p:plain

これが成功すると、204 No Contentが返却されてきます。それ以外、何らかの失敗であればエラーメッセージが返されますので、確認し修正しましょう。

4. レンダリング実行

zipファイルのアップロードが終わったら、あとはレンダリング (データを埋め込む処理) を実行するリクエストを出します。

パラメータ 設定値
メソッド POST
URI https://slidepack.io/sessions/@{body('Parse_JSON')?['session']?['uuid']}/render ※JSONの解析の動的コンテンツから追加
ヘッダー {"Authorization": "Bearer ここにAPIキー"}

f:id:mofumofu_dance:20201020003025p:plain

これで一連の処理は完了です。

最後のレンダリングリクエストでは、結果としてファイルのダウンロードURLが返却されます。

f:id:mofumofu_dance:20201020003403p:plain

おわり

今回はSlidePackのAPIを利用して、PPTXのテンプレートとデータからスライドを自動生成するフローを紹介しました。

基本的にはここで書いたように、data.json と template.pptxが用意できればスライドの作成までを自動化できます。月次ミーティングで使うような定型的なスライドを作成するのにも便利かもしれません。 (こういうのが一番面倒で楽しくないので自動化できたらうれしいですよね)

また、応用として「データを外部から取得して、テンプレートと合わせてzip作成する」という自動処理もできます。

この場合には3rdパーティの Cloudmersive File Processing コネクターを利用することでzip作成部分の自動化ができます。

f:id:mofumofu_dance:20201020003902p:plain
SharePointリストのデータとテンプレートを組み合わせる場合の例

いろいろ応用できますし、30日間トライアルは無料ですので、ぜひ試してみてください。