MENU

【覚書】SharePointの容量をAutomateで報告

Copilotと一緒にかなり試行錯誤しましたが、一応使えるレベルになってきたので覚書として掲載。
※SharePointサイトの所有者になっていることが必須条件です

目次

フロー内容

特定SharePointサイトの容量を一覧表示
Documentフォルダについてはサブフォルダから容量を一覧化させるが、Top10までのフォルダだけを表示させる
最後に上記をまとめてチャット投稿する

フロー

新しいデザイナーで作成しています

  1. トリガー
  2. 変数の初期化
  3. 変数の初期化
  4. 変数の初期化
  5. 変数の初期化
  6. 変数の初期化
  7. SharePointにHTTP要求を送信します
  8. JSONの解析
  9. 分岐(それぞれに適用する)
    1. 作成
    2. SharePointにHTTP要求を送信します
    3. 作成
    4. 作成
    5. 作成
    6. 文字列変数に追加
    7. SharePointにHTTP要求を送信します
    8. JSONの解析
    9. 分岐(それぞれに適用する)
      1. 作成
      2. SharePointにHTTP要求を送信します
      3. 作成
      4. 文字列変数に追加
      5. 作成
      6. 作成
      7. 配列変数に追加
  10. 選択
  11. 作成
  12. 作成
  13. 文字列変数に追加
    1. 作成
    2. 変数の設定
    3. 変数の追加
  14. チャットまたはチャネルでメッセージを投稿する

フロー詳細

今回はアクション名もまるごと変更します
動的コンテンツではなく式を多用するアクションばかりのため、まずはコピペで動きを確認し、それから独自の改変に挑むと良いです

また、フローが長いため、説明を分割します
皆さんが独自設定しなければいけないのはsiteUrlぐらいで、他はすべてコピペでいけるはず
多分もっとスッキリ最適化する方法はあると思いますので、あとで再チャレンジ予定です

トリガーからの下準備
  1. トリガー:フローを手動でトリガーする
    ※まずは手動にし、使用感を確かめてからスケジュール組めば良いと思います
  2. 変数を初期化する
    • アクション名:siteUrl
    • 名前:siteUrl
    • タイプ:文字列
    • 値:https://(特定サイトのURL)
  3. 変数を初期化する
    • アクション名:totalBytes
    • 名前:totalBytes
    • タイプ:浮動小数点数
    • 値:0
  4. 変数を初期化する
    • アクション名:report
    • タイプ:文字列
    • 値:【SharePointサイト 容量レポート】
  5. 変数を初期化する
    • アクション名:folderStats
    • タイプ:配列
    • 値:[]
  6. 変数を初期化する
    • アクション名:rank
    • タイプ:整数
    • 値:0
  7. SharePointにHTTP要求を送信します
    • アクション名:HTTP-ライブラリ一覧
    • サイトのアドレス:@{variables(‘siteUrl’)}
    • 方法:GET
    • ヘッダー:(左)Accept /(右)application/json;odata=nometadata
    • URI:
_api/web/lists?
$filter=BaseType eq 1 and Hidden eq false
&$select=Id,Title,BaseType,BaseTemplate,Hidden,ItemCount,LastItemModifiedDate,RootFolder/ServerRelativeUrl,RootFolder/ItemCount
&$expand=RootFolder
7.SharePointにHTTP要求を送信します

_api/web/lists
サイトアドレスで指定したサイトの全リスト/ライブラリを表すコレクションエンドポイント

BaseType eq 1
0=リスト 1=ドキュメントライブラリ
今回はドキュメントライブラリのみに絞っています

Hidden eq false
falseに等しくして、非表示ライブラリを除外しています
特定のテンプレートだけに絞るならBaseTemplateを使います
例:BaseTemplate ew 101
101=標準のドキュメントライブラリ
100=カスタムリスト
109=画像ライブラリ

$select=
何のプロパティを返すのか、ここで絞り込みます
Id, Title, BaseType, BaseTemplate, Hidden:基本情報
ItemCount:リスト/ライブラリ全体のアイテム総数
LastItemModifiedDate:最後に変更されたアイテムの日時(UTC)
RootFolder/ServerRelativeUrl:ルートフォルダーのサイト相対 URL(例:/sites/xxx/Shared Documents)
RootFolder/ItemCount:ルート直下のアイテム数(フォルダー直下のファイル/フォルダー個数)

ここまでで、サイト全体の容量を確認して一覧化しています

ドキュメントの一覧化
  1. JSONの解析
    • アクション名:Parse-ライブラリ一覧
    • Content:@{body(‘_HTTP-ライブラリ一覧’)}
    • Schema:
{
    "type": "object",
    "properties": {
        "value": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "Id": {
                        "type": "string"
                    },
                    "Title": {
                        "type": "string"
                    },
                    "BaseType": {
                        "type": "integer"
                    },
                    "BaseTemplate": {
                        "type": "integer"
                    },
                    "Hidden": {
                        "type": "boolean"
                    },
                    "ItemCount": {
                        "type": "integer"
                    },
                    "LastItemModifiedDate": {
                        "type": "string"
                    },
                    "RootFolder": {
                        "type": "object",
                        "properties": {
                            "ServerRelativeUrl": {
                                "type": "string"
                            },
                            "ItemCount": {
                                "type": "integer"
                            }
                        },
                        "required": [
                            "ServerRelativeUrl"
                        ]
                    }
                },
                "required": [
                    "Title",
                    "BaseType",
                    "BaseTemplate",
                    "Hidden",
                    "RootFolder"
                ]
            }
        }
    },
    "required": [
        "value"
    ]
}
  1. 分岐(それぞれに適用する)
    • アクション名:各ライブラリを処理
    • 前のステップから出力を選択します:@{body(‘Parse-ライブラリ一覧’)?[‘value’]}

以下は「それぞれに適用する」の入れ子として作成します

  1. 作成
    • アクション名:フォルダURIを作成
    • 入力:(式として投入)
concat(
  '_api/web/GetFolderByServerRelativeUrl(''', 
  uriComponent(items('各ライブラリを処理')?['RootFolder']?['ServerRelativeUrl']), 
  ''')?$select=StorageMetrics&$expand=StorageMetrics'
)
  1. SharePointにHTTP要求を送信します
    • アクション名:HTTP-フォルダMetrics
    • サイトのアドレス:@{variables(‘siteUrl’)}
    • 方法:GET
    • URI:@{outputs(‘フォルダURIを作成’)}
    • ヘッダー:(左)Accept /(右)application/json;odata=nometadata
  2. 作成
    • アクション名:ライブラリサイズ(バイト)
    • 入力:(式として入力)
float(body('HTTP-フォルダMetrics')?['StorageMetrics']?['TotalFileStreamSize'])
  1. 作成
    • アクション名:新しい合計を計算
    • 入力:(式として入力)
add(
  float(variables('totalBytes')),
  float(coalesce(outputs('ライブラリサイズ(バイト)'), 0))
)
  1. 変数の設定
    • アクション名:合計を再計算
    • 名前:totalBytes
    • 値:@{outputs(‘新しい合計を計算’)}
  2. 作成
    • アクション名:ライブラリサイズ(GB)
    • 入力:(式で入力)
div(outputs('ライブラリサイズ(バイト)'), 1073741824)
  1. 変数に文字列として追加
    • アクション名:レポートに1行追加
    • Name:report
    • Value:(式として入力)
concat(
  items('各ライブラリを処理')?['Title'],
  ': ',
  formatNumber(
    div(
      float(coalesce(outputs('ライブラリサイズ(バイト)'), 0)),
      1073741824
    ),
    '0.00'
  ),
  ' GB'
)

サブフォルダの容量確認
  1. SharePointにHTTP要求を送信します
    • アクション名:HTTP-サブフォルダ一覧
    • サイトのアドレス:@{variables(‘siteUrl’)}
    • 方法:GET
    • ヘッダー:(左)Accept /(右)application/json;odata=nometadata
    • URI:(式で入力)
concat('_api/web/GetFolderByServerRelativeUrl(''', uriComponent(item()['RootFolder']['ServerRelativeUrl']), ''')/Folders?$select=Name,ServerRelativeUrl&$top=5000')
  1. JSONの解析
    • アクション名:Parse-サブフォルダ一覧
    • Content:@{body(‘HTTP-サブフォルダ一覧’)}
    • Schema:下記をそのまま入力
{
    "type": "object",
    "properties": {
        "value": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "Name": {
                        "type": "string"
                    },
                    "ServerRelativeUrl": {
                        "type": "string"
                    }
                },
                "required": [
                    "Name",
                    "ServerRelativeUrl"
                ]
            }
        }
    },
    "required": [
        "value"
    ]
}
  1. 分岐(それぞれに適用する)
    • アクション名:各サブフォルダを処理
    • 前のステップから出力を選択します:@{body(‘Parse-サブフォルダ一覧’)?[‘value’]}

以下は分岐の入れ子として作成

  1. 作成
    • アクション名:サブフォルダURIを作成
    • 入力:(式として作成)
concat('_api/web/GetFolderByServerRelativeUrl(''', uriComponent(item()['ServerRelativeUrl']), ''')?$select=StorageMetrics&$expand=StorageMetrics')
  1. SharePointにHTTP要求を送信します
    • アクション名:HTTP-サブフォルダMetrics
    • サイトのアドレス:@{variables(‘siteUrl’)}
    • 方法:GET
    • URI:@{outputs(‘サブフォルダURIを作成’)}
    • ヘッダー:
      • キー:Accept
      • 値:application/json;odata=nometadata
  2. 作成
    • アクション名:サブフォルダサイズ(バイト)
    • 入力:(式として作成)
float(body('HTTP-サブフォルダMetrics')?['StorageMetrics']?['TotalFileStreamSize'])
  1. 文字列変数に追加
    • アクション名:レポートにサブフォルダ行を追加
    • Name:report
    • Value:(式として入力)
concat('  - ', item()['Name'], ': ', formatNumber(div(float(coalesce(outputs('サブフォルダサイズ(バイト)'), 0)), 1073741824), '0.00'), ' GB')
  1. 配列変数に追加
    • アクション名:配列変数に追加
    • Name:folderStats
    • Value:(式として入力)
json(concat('{"Name":"', item()['Name'], '","SizeGB":', string(div(float(coalesce(outputs('サブフォルダサイズ(バイト)'), 0)), 1073741824)), '}'))
  1. 作成
    • アクション名:サブフォルダSizeGB(数値)
    • 入力:(式として入力)
div(float(coalesce(outputs('サブフォルダサイズ(バイト)'), 0)), 1073741824)
  1. 作成
    • アクション名:サブフォルダ統計オブジェクト
    • 入力:(式として入力)
setProperty(
  setProperty(
    setProperty(
      setProperty(
        json('{}'),
        'Name', items('各サブフォルダを処理')?['Name']
      ),
      'LibraryTitle', items('各ライブラリを処理')?['Title']
    ),
    'ServerRelativeUrl', items('各サブフォルダを処理')?['ServerRelativeUrl']
  ),
  'SizeGB', float(outputs('サブフォルダSizeGB(数値)'))
)
  1. 配列変数に追加
    • アクション名:folderStatsに追加
    • Name:folderStats
    • Value:@{outputs(‘サブフォルダ統計オブジェクト’)}

ここですべてのループを終了

サブフォルダの順位付け
  1. 選択
    • アクション名:folderStatsを正規化
    • 元:@{variables(‘folderStats’)}
    • マップ1
      • キー:Name
      • 値:@{item()?[‘Name’]}
    • マップ2
      • キー:LibraryTitle
      • 値:@{item()?[‘LibraryTitle’]}
    • マップ3
      • キー:ServerRelativeUrl
      • 値:@{item()?[‘ServerRelativeUrl’]}
    • マップ4
      • キー:SizeGB
      • 値:(式として入力)
float(coalesce(item()?['SizeGB'], 0))
  1. 作成
    • アクション名:サブフォルダ降順
    • 入力(式として入力)
reverse( sort(body('folderStatsを正規化'), 'SizeGB') )

Top10を算出
  1. 作成
    • アクション名:Top10見出しを追加
    • 入力:
---

【全ライブラリ横断:サブフォルダ容量 Top10】
  1. 分岐(それぞれに適用)
    • アクション名:Top10を出力
    • 前のステップから出力を選択します:@{outputs(‘サブフォルダTop10’)}

分岐の入れ子で作成します

  1. 作成
    • アクション名:次の順位
    • 入力:(式として入力)
add(variables('rank'), 1)
  1. 変数の設定
    • アクション名:順位を更新
    • 名前:rank
    • 値:@{outputs(‘次の順位’)}
  2. 文字列変数に追加
    • アクション名:Top10行を追加
    • Name:report
    • Value:(式として入力)
concat(
  string(variables('rank')), '. ',
  items('Top10を出力')?['LibraryTitle'], ' / ',
  items('Top10を出力')?['Name'], ': ',
  formatNumber(float(items('Top10を出力')?['SizeGB']), '0.00'), ' GB','<br>'
)

ここですべてのループを終了

レポートをまとめて投稿
  1. チャットまたはチャネルでメッセージを投稿する
    • アクション名:チャットまたはチャネルでメッセージを投稿する
    • 投稿者:ユーザー
    • 投稿先:グループチャット
    • Group chat:48:notes (カスタム値)
    • Message:(式として入力・HTMLコード入力モードにする)
concat(
  '<b>【SharePoint サイト容量レポート】</b><br>',
  '対象: ', variables('siteUrl'), '<br>',
  '(単位はGB、小数点2桁)<br>',
  '---<br>',
  replace(coalesce(variables('report'), ''), '\n', '<br>')
)

広告

目次