前回の記事では、Power AutomateからSharePointにニュースを自動投稿する方法のうち、基本的な部分を解説しました。

今回は、画像やボタンを配置した複雑なページをPower Automateから作成してみましょう。
ページの完成形
今回は以下のSharePointページを、Power Automateから自動作成するのを目標とします。

Request BodyでWebパーツを構成する
ページ作成のアクションのRequest Bodyは以下です。
{
  "@odata.type": "#microsoft.graph.sitePage",
  "name": "newsPublishTest-@{convertFromUtc(body('現在の時刻'),'Tokyo Standard Time','yyyyMMdd-HHmmss')}.aspx",
  "title": "サンプルページ_@{convertFromUtc(body('現在の時刻'),'Tokyo Standard Time','yyyy/MM/dd HH:mm:ss')}",
  "description": "descriptionだよおおおお",
  "pageLayout": "article",
  "showComments": false,
  "promotionKind": "newsPost",
  "thumbnailWebUrl": "@{body('JSON_の解析_-_ファイルの情報の取得')?['webUrl']}",
  "titleArea": {
    "enableGradientEffect": true,
    "imageWebUrl": "@{body('JSON_の解析_-_ファイルの情報の取得')?['webUrl']}",
    "imageSourceType": 2,
    "layout": "imageAndTitle",
    "showAuthor": false,
    "showPublishedDate": false,
    "textAlignment": "left",
    "showTextBlockAboveTitle": true,
    "textAboveTitle": "新着記事"
  },
  "canvasLayout": {
    "horizontalSections": [
      {
        "layout": "oneColumn",
        "id": "1",
        "emphasis": "none",
        "columns": [
          {
            "id": "2",
            "webparts": [
              {
                "id": "3",
                "innerHtml": "@{outputs('作成_-_HTML本文')}"
              }
            ]
          }
        ]
      },
      {
        "layout": "oneColumn",
        "id": "4",
        "emphasis": "none",
        "columns": [
          {
            "id": "5",
            "webparts": [
              {
                "id": "6",
                "webPartType": "d1d91016-032f-456d-98a4-721247c305e8",
                "data": {
                  "dataVersion": "1.13",
                  "description": "Show an image on your page",
                  "title": "Image",
                  "properties": {
                    "imageSourceType": 2,
                    "altText": "",
                    "overlayText": "",
                    "imgWidth": @{body('JSON_の解析_-_ファイルの情報の取得')?['image']?['width']},
                    "imgHeight": @{body('JSON_の解析_-_ファイルの情報の取得')?['image']?['height']},
                    "fixAspectRatio": false,
                    "captionText": "",
                    "alignment": "Center"
                  },
                  "serverProcessedContent": {
                    "imageSources": [
                      {
                        "key": "imageSource",
                        "value": "@{body('JSON_の解析_-_ファイルの情報の取得')?['webUrl']}"
                      }
                    ]
                  }
                }
              },
              {
                "id": "7",
                "webPartType": "0f087d7f-520e-42b7-89c0-496aaf979d58",
                "data": {
                  "dataVersion": "1.1",
                  "description": "カスタムラベルとリンク付きのクリック可能ボタンを追加します。",
                  "title": "ボタン",
                  "properties": {
                    "alignment": "Left",
                    "minimumLayoutWidth": 5
                  },
                  "serverProcessedContent": {
                    "htmlStrings": [],
                    "searchablePlainTexts": [
                      {
                        "key": "label",
                        "value": "リンクはコチラ"
                      }
                    ],
                    "links": [
                      {
                        "key": "linkUrl",
                        "value": "https://shirono-noino.com/powerplatform-admin-canedit-apps-without-permission/"
                      }
                    ],
                    "imageSources": []
                  }
                }
              }
            ]
          }
        ]
      }
    ]
  }
}上記のままだと複雑すぎて構造が把握しづらいため、簡略化してみます。
"canvasLayout": {
  "horizontalSections": [
    {
      "layout": "oneColumn",
      "id": "1",
      "emphasis": "none",
      "columns": [
        {
          "id": "2",
          "webparts": [
            {
              // テキストWebパーツ
            }
          ]
        }
      ]
    },
    {
      "layout": "oneColumn",
      "id": "4",
      "emphasis": "none",
      "columns": [
        {
          "id": "5",
          "webparts": [
            {
              "webPartType": "d1d91016-032f-456d-98a4-721247c305e8",
              "data": {
                // 画像Webパーツの設定
              }
            },
            {
              "webPartType": "0f087d7f-520e-42b7-89c0-496aaf979d58",
              "data": {
                // ボタンWebパーツの設定
              }
            }
          ]
        }
      ]
    }
  ]
}- テキストWebパーツが入ったセクション
 - 画像とボタンのWebパーツが入ったセクション
 
の2つのセクションで構成されていることがわかります。
layoutは両方ともOneColumn、つまり1列です。
セクションの中に配置するWebパーツはwebPartsの配列に格納します。
ここからは画像・ボタンを置くにはどう記述したらいいか解説していきます。
※テキストはHTML文字列を格納した変数を置くだけなので省略します。
webPartType
webPartTypeはWebパーツの指定に使用します。
一見ランダムに生成されたUUIDに見えますが、各種別で固有の値があります。
- 画像…
d1d91016-032f-456d-98a4-721247c305e8 - ボタン…
0f087d7f-520e-42b7-89c0-496aaf979d58 
他にもcreate操作でサポートされているWebパーツがあります。詳細はMicrosoft Graph APIのリファレンスを参照してください。

画像パーツの構成
{
  "id": "6",
  "webPartType": "d1d91016-032f-456d-98a4-721247c305e8",
  "data": {
    "dataVersion": "1.13",
    "description": "Show an image on your page",
    "title": "Image",
    "properties": {
      "imageSourceType": 2,
      "altText": "",
      "overlayText": "",
      "imgWidth": @{body('JSON_の解析_-_ファイルの情報の取得')?['image']?['width']},
      "imgHeight": @{body('JSON_の解析_-_ファイルの情報の取得')?['image']?['height']},
      "fixAspectRatio": false,
      "captionText": "",
      "alignment": "Center"
    },
    "serverProcessedContent": {
      "imageSources": [
        {
          "key": "imageSource",
          "value": "@{body('JSON_の解析_-_ファイルの情報の取得')?['webUrl']}"
        }
      ]
    }
  }
}Microsoftのリファレンスや、ページをGraph APIでGETしたときはもっと多くのプロパティが含まれていますが、いろいろ削りながら実験して、必須そうなプロパティのみを残したのが上記です。
正直今でも何を表しているのかわからないプロパティもありますが、重要なプロパティを抜粋して解説します。
重要なプロパティ
imgWidth, imgHeight
画像の表示サイズです。
実際の画像の解像度にかかわらず、指定した解像度に伸縮されます。また、省略すると0x0の扱いになってしまうのか、画像が表示されなくなってしまいます。
したがって、作成処理をする前に画像の幅・高さが把握できていなければなりません。
imageSources
画像の参照元を指定します。
keyをimageSource、valueを画像ファイルのURLにします。
URLは外部URLでも可です。ただし、このあと説明する解像度の指定の観点から、Premiumライセンスがないと現実的ではありません。
画像の解像度(とURL)を取得する
SharePointに保存されているファイルの場合
Power Automateで画像ファイルの解像度を取得する方法ですが、SharePointドキュメントライブラリにあるならSharePoint REST API v2でそのファイルのプロパティから抽出するのが簡単だと思います。
Power Automateに標準で用意されている「ファイル プロパティの取得」アクションでは、画像の解像度は含まれていません。そのため、「SharePointにHTTP要求を送信します」アクションで、REST API v2(Graph API)から得られるファイルのプロパティを取得します。
ファイルにアクセスするには、
site-idShared Documentsからの相対パス またはitem-id
が必要です。
今回は「パスによるファイル メタデータの取得」アクションで画像ファイルを指定してみました。

「作成」アクションでPathの/Shared Documents/を消し、URLエンコードします。

uriComponent(
  replace(
    outputs('パスによるファイル_メタデータの取得')?['body/Path'],
    '/Shared Documents/',
    ''
  )
)次に「SharePointにHTTP要求を送信します」アクションを配置します。

_api/v2.1/sites/@{body('JSON_の解析_-_Root取得の解析')?['id']}/drive/root:/@{outputs('作成_-_Shared_Documentからの相対パス')}?$select=image,webUrlそして取得した結果が以下です。
{
  "body": {
    "@odata.context": "https://example.sharepoint.com/sites/powerplatform-test/_api/v2.1/$metadata#drives('xxxxxxxxxxxxxxxx')/items(image,webUrl)/$entity",
    "@odata.etag": "\"{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx},2\"",
    "webUrl": "https://example.sharepoint.com/sites/powerplatform-test/Shared%20Documents/powerplatform-admin-canedit-apps-without-permission_thumb.png",
    "image": {
      "height": 630,
      "width": 1200
    }
  }
}普通に取得すると不要な情報がいっぱいくっついてきてしまうので、$select=image,webUrlで必要な情報のみに絞っています。こうしたほうが「JSONの解析」をして動的コンテンツで選択するときに楽になります。
SharePoint以外に保存されているファイルの場合
画像パーツとして置きたいファイルが固定であれば、ハードコードしてしまえば問題ありません。
問題は動的な場合です。
私が思いついた範囲内だと、
- 「HTTP」アクションで画像をGET
 - 取得した画像をSharePointの「ファイルの作成」アクションを使ってコピー
 - SharePoint REST API v2で解像度を取得
 - SharePointドキュメントライブラリから削除(削除しないでコピーした側を使ってもいい)
 
が最も簡単かなと思いました。ただし、この方法だとPremiumライセンスが必要になってしまいます。
サムネイルやバナー画像と違い、本文中のWebパーツとして外部の画像を置くのは簡単ではないですね。
ボタンパーツの構成
{
  "id": "7",
  "webPartType": "0f087d7f-520e-42b7-89c0-496aaf979d58",
  "data": {
    "dataVersion": "1.1",
    "description": "カスタムラベルとリンク付きのクリック可能ボタンを追加します。",
    "title": "ボタン",
    "properties": {
      "alignment": "Left",
      "minimumLayoutWidth": 5
    },
    "serverProcessedContent": {
      "htmlStrings": [],
      "searchablePlainTexts": [
        {
          "key": "label",
          "value": "リンクはコチラ"
        }
      ],
      "links": [
        {
          "key": "linkUrl",
          "value": "https://shirono-noino.com/powerplatform-admin-canedit-apps-without-permission/"
        }
      ],
      "imageSources": []
    }
  }
}ボタンカスタマイズのうえで理解しておくべきなのは以下の2つのみです。
searchablePlainTexts.value…ボタン上に表示されるテキストlinks.value…ボタンをクリックしたときの遷移先のURL
実際にページを作成して発行してみる
Power Automateで以下のようなフローを作ります。

今回説明していないアクションは、以下の記事で解説していますので合わせて参照してください。

このフローを実行すると、一番最初の完成イメージと同様のページが作成されます。

おわりに
Power Automate経由で画像やボタン付きのページを作ってみましたが、
なつぐれできなくはないけど、難しいし不親切な仕様が多いなあ
というのが試行錯誤した末の感想でした。
公式ドキュメントに書いてないことはないのですが、動線や例示があまりに不親切ですし、JSONに謎のプロパティを大量にくっつけないと400 Bad Request祭りになってしまいますし…。
なんだかなあって感じです。
でも「できなくはない」ので、自動化の効率性とビジュアルの両方を追求したい人はチャレンジしてみてください。

			






コメント