MoreBeerMorePower

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

SharePointでダウンロードカウンター的なものを作ってみた

【2022/10/31更新:パターン3を追加】

SharePointで作った社内ポータルでファイルを提供する際に、ダウンロードした人の記録をとりたい/どれくらいダウンロードされたか知りたいという要件があったのでPower Automateを駆使して作ってました。

パターンを2つ考えてみたので、それぞれを実現する構成、フロー、また特徴やできる・できないを紹介していこうと思います。

パターン1 : ページ上でボタンを押したら押した人にメールでファイルを送る

"ダウンロード"と書いておきながらいきなりダウンロードではないわけですが。

この方法ではみんなが見るサイトの上に書き込み可能なリストを1個用意しておきます。このリストがユーザーによって更新されたら、更新した人を別リストに記録しつつ、更新した人にメールの添付ファイルとしてファイルを送ります。

『リストを更新してね』と言うと人によってできるできないが出てくるので、リストのビューをカスタマイズして、ボタン風にします。(ビューをカスタマイズした際のJSONは最後に)

ボタンを押すと (=リストを更新すると) それをトリガーにしてフローが実行されます。ボタンを押した人は アイテムの更新者 でとれるので、これをダウンロードカウンター(リスト)に記録します。

あとはファイルコンテンツを取得してメールに乗せてボタンを押した人に送るだけです。

これで無事ファイルを欲してボタンを押した人を記録し、ファイルをお届けできました。 途中でファイルの情報を取得しているのは「どのバージョンのファイルが届けられたか」を記録しておくためです。

いいとこわるいとこ

人まで記録できるのがいいところです。ただメールが送られるまでのラグとか、そもそもダウンロードじゃないという点が難点ですね。

しかしメールにしておけば説明文なんかも一緒に送れるので、活用次第ではなかなかいい方法かなと思います。

パターン2 : モダンページのボタンパーツを押したらダウンロード実行

こう書くと、ダウンロード用URLを設定しておけばいい気がしてきますが、記録もとりたいので間にフローを入れます。

実際の動作は以下のような感じ。ファイルがダウンロードされていますね。

これを実現するにはHTTPリクエストで起動するようなフローを作ります。

フローの中でファイルコンテンツを取得して、応答のアクションでファイルコンテンツを返してあげることでダウンロードの動きになります。

サイトページのほうではボタンパーツをおいて、フローのトリガーURLを設定しておきます。

いいとこわるいとこ

この方法、確かにダウンロードではあるのですが、欠点としてダウンロードした人が取れない ということがあります。

HTTPリクエスト送ってるだけで、そこにユーザー情報乗っからないので当然ですが、ユーザーまで記録しておきたい場合は使えません。

ダウンロードカウンター (ほんとにカウントだけ) という用途であれば満足させられます。

あとはHTTPトリガーも応答アクションもプレミアムなので、このフローを作る人には有償ライセンスが必要だということも注意すべきところになります。

パターン3 : 合わせ技

ハイパーリンクを使いつつ、setValueできるという書式を教えていただきましたので、これを使ってパターン1とパターン2を合わせてみました。

参考: 【Microsoft Lists】アイテム更新をする書式設定のサンプル - MyNote365

変更したのは書式のみです。

{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json",
  "hideSelection": true,
  "hideColumnHeader": true,
  "rowFormatter": {
    "elmType": "div",
    "customRowAction": {
      "action": "setValue",
      "actionInput": {
        "count": "=[$count]+1"
      }
    },
    "attributes": {
      "class": "sp-row-card"
    },
    "children": [
      {
        "elmType": "div",
        "style": {
          "text-align": "center"
        },
        "children": [
          {
            "elmType": "a",
            "style": {
              "text-decoration": "none",
              "padding": "5px 10px 5px 10px",
              "font-weight": "bold",
              "border-radius": "5px",
              "font-size": "13px",
              "white-space": "nowrap"
            },
            "attributes": {
              "class": "sp-row-button",
              "href": "='https://prod-183.westus.logic.azure.com:443/workflows/xxxxxx/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=yyyy&title='+[$Title]",
              "target": "_blank"
            },
            "txtContent": "Download/ダウンロード"
          }
        ]
      }
    ]
  }
}

aタグで別タブを開いていますが、その際のURLをフローのURLにしています。さらにURLパラメータとしてタイトルを追加しています。

これで、アイテムの更新を拾いつつ、ユーザーに即ダウンロードさせるようなUIができました。

おわり

今回はSharePoint上でリストとPower Automateを使ってファイルのダウンロードカウンターのようなものを作る方法を紹介しました。

ライセンスのことと、人を記録できないことが許容できるならパターン2のほうがいいかなと思います。

最後にパターン1で利用したJSONをおいておきます。ここではTitle列とcount列 (数値) のみからなるリストを利用しています。

{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json",
  "hideSelection": true,
  "hideColumnHeader": true,
  "rowFormatter": {
    "elmType": "div",
    "attributes": {
      "class": "sp-row-card"
    },
    "children": [
      {
        "elmType": "div",
        "style": {
          "text-align": "left"
        },
        "children": [
          {
            "elmType": "div",
            "attributes": {
              "class": "sp-row-title"
            },
            "txtContent": "[$Title]"
          },
          {
            "elmType": "button",
            "customRowAction": {
              "action": "setValue",
              "actionInput": {
                "count": "= [$count] + 1"
              }
            },
            "txtContent": "Request"
          }
        ]
      }
    ]
  }
}