Sharepoint リスト 添付ファイル 一括ダウンロード

SharePoint Onlineで複数ファイルのダウンロードがサポートされるようになっておりました。
新しくなった画面(OneDrive系)でのみのサポートですが、フォルダチェックやファイルの複数チェックでダウンロードが行えます。なお、First Release向けというわけではなく、全ユーザーで利用できそうです。

Sharepoint リスト 添付ファイル 一括ダウンロード

複数ファイル時はzipで圧縮されてダウンロードとなるようです。
OneDrive_日付.zip形式でダウンロードとなるので、複数回のダウンロードを行う際はブラウザの動作で名前が変わったり、上書きされたりという状態になります。

Sharepoint リスト 添付ファイル 一括ダウンロード

実態はOneDriveのプレフィックスの通り、OneDrive実装をそのまま持ってきたもののようですね。

手元の環境で試したところ、100MB超えでもダウンロードは行えるようでした。
また、日本語名称は総じて文字化けしており、今後の改修が待ち望まれる感じではあります。

中身を重視し、まずは利用できるようにする。というのはなかなか難しい選択となりますが、スピード感のある対応はありがたいですね。(もちろんIT管理者側では、制限事項を伝える役割があるので、リリース時に問題情報を展開してもらえるとありがたいのですけれども。)

音楽:虎の夢

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

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

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

Sharepoint リスト 添付ファイル 一括ダウンロード

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

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

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

Sharepoint リスト 添付ファイル 一括ダウンロード

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

Sharepoint リスト 添付ファイル 一括ダウンロード

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

Sharepoint リスト 添付ファイル 一括ダウンロード

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

Sharepoint リスト 添付ファイル 一括ダウンロード

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

いいとこわるいとこ

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

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

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

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

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

Sharepoint リスト 添付ファイル 一括ダウンロード

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

Sharepoint リスト 添付ファイル 一括ダウンロード

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

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

Sharepoint リスト 添付ファイル 一括ダウンロード

いいとこわるいとこ

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

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"
          }
        ]
      }
    ]
  }
}