Copilotと一緒にかなり試行錯誤しましたが、一応使えるレベルになってきたので覚書として掲載。
※SharePointサイトの所有者になっていることが必須条件です
フロー内容
特定SharePointサイトの容量を一覧表示
Documentフォルダについてはサブフォルダから容量を一覧化させるが、Top10までのフォルダだけを表示させる
最後に上記をまとめてチャット投稿する
フロー
新しいデザイナーで作成しています
- トリガー
- 変数の初期化
- 変数の初期化
- 変数の初期化
- 変数の初期化
- 変数の初期化
- SharePointにHTTP要求を送信します
- JSONの解析
- 分岐(それぞれに適用する)
- 作成
- SharePointにHTTP要求を送信します
- 作成
- 作成
- 作成
- 文字列変数に追加
- SharePointにHTTP要求を送信します
- JSONの解析
- 分岐(それぞれに適用する)
- 作成
- SharePointにHTTP要求を送信します
- 作成
- 文字列変数に追加
- 作成
- 作成
- 配列変数に追加
- 選択
- 作成
- 作成
- 文字列変数に追加
- 作成
- 変数の設定
- 変数の追加
- チャットまたはチャネルでメッセージを投稿する
フロー詳細
今回はアクション名もまるごと変更します
動的コンテンツではなく式を多用するアクションばかりのため、まずはコピペで動きを確認し、それから独自の改変に挑むと良いです
また、フローが長いため、説明を分割します
皆さんが独自設定しなければいけないのはsiteUrlぐらいで、他はすべてコピペでいけるはず
多分もっとスッキリ最適化する方法はあると思いますので、あとで再チャレンジ予定です
トリガーからの下準備
- トリガー:フローを手動でトリガーする
※まずは手動にし、使用感を確かめてからスケジュール組めば良いと思います - 変数を初期化する
- アクション名:siteUrl
- 名前:siteUrl
- タイプ:文字列
- 値:https://(特定サイトのURL)
- 変数を初期化する
- アクション名:totalBytes
- 名前:totalBytes
- タイプ:浮動小数点数
- 値:0
- 変数を初期化する
- アクション名:report
- タイプ:文字列
- 値:【SharePointサイト 容量レポート】
- 変数を初期化する
- アクション名:folderStats
- タイプ:配列
- 値:[]
- 変数を初期化する
- アクション名:rank
- タイプ:整数
- 値:0
- 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=RootFolder7.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:ルート直下のアイテム数(フォルダー直下のファイル/フォルダー個数)
ここまでで、サイト全体の容量を確認して一覧化しています
ドキュメントの一覧化
- 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"
]
}- 分岐(それぞれに適用する)
- アクション名:各ライブラリを処理
- 前のステップから出力を選択します:@{body(‘Parse-ライブラリ一覧’)?[‘value’]}
以下は「それぞれに適用する」の入れ子として作成します
- 作成
- アクション名:フォルダURIを作成
- 入力:(式として投入)
concat(
'_api/web/GetFolderByServerRelativeUrl(''',
uriComponent(items('各ライブラリを処理')?['RootFolder']?['ServerRelativeUrl']),
''')?$select=StorageMetrics&$expand=StorageMetrics'
)- SharePointにHTTP要求を送信します
- アクション名:HTTP-フォルダMetrics
- サイトのアドレス:@{variables(‘siteUrl’)}
- 方法:GET
- URI:@{outputs(‘フォルダURIを作成’)}
- ヘッダー:(左)Accept /(右)application/json;odata=nometadata
- 作成
- アクション名:ライブラリサイズ(バイト)
- 入力:(式として入力)
float(body('HTTP-フォルダMetrics')?['StorageMetrics']?['TotalFileStreamSize'])- 作成
- アクション名:新しい合計を計算
- 入力:(式として入力)
add(
float(variables('totalBytes')),
float(coalesce(outputs('ライブラリサイズ(バイト)'), 0))
)- 変数の設定
- アクション名:合計を再計算
- 名前:totalBytes
- 値:@{outputs(‘新しい合計を計算’)}
- 作成
- アクション名:ライブラリサイズ(GB)
- 入力:(式で入力)
div(outputs('ライブラリサイズ(バイト)'), 1073741824)- 変数に文字列として追加
- アクション名:レポートに1行追加
- Name:report
- Value:(式として入力)
concat(
items('各ライブラリを処理')?['Title'],
': ',
formatNumber(
div(
float(coalesce(outputs('ライブラリサイズ(バイト)'), 0)),
1073741824
),
'0.00'
),
' GB'
)サブフォルダの容量確認
- 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')- 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"
]
}- 分岐(それぞれに適用する)
- アクション名:各サブフォルダを処理
- 前のステップから出力を選択します:@{body(‘Parse-サブフォルダ一覧’)?[‘value’]}
以下は分岐の入れ子として作成
- 作成
- アクション名:サブフォルダURIを作成
- 入力:(式として作成)
concat('_api/web/GetFolderByServerRelativeUrl(''', uriComponent(item()['ServerRelativeUrl']), ''')?$select=StorageMetrics&$expand=StorageMetrics')- SharePointにHTTP要求を送信します
- アクション名:HTTP-サブフォルダMetrics
- サイトのアドレス:@{variables(‘siteUrl’)}
- 方法:GET
- URI:@{outputs(‘サブフォルダURIを作成’)}
- ヘッダー:
- キー:Accept
- 値:application/json;odata=nometadata
- 作成
- アクション名:サブフォルダサイズ(バイト)
- 入力:(式として作成)
float(body('HTTP-サブフォルダMetrics')?['StorageMetrics']?['TotalFileStreamSize'])- 文字列変数に追加
- アクション名:レポートにサブフォルダ行を追加
- Name:report
- Value:(式として入力)
concat(' - ', item()['Name'], ': ', formatNumber(div(float(coalesce(outputs('サブフォルダサイズ(バイト)'), 0)), 1073741824), '0.00'), ' GB')- 配列変数に追加
- アクション名:配列変数に追加
- Name:folderStats
- Value:(式として入力)
json(concat('{"Name":"', item()['Name'], '","SizeGB":', string(div(float(coalesce(outputs('サブフォルダサイズ(バイト)'), 0)), 1073741824)), '}'))- 作成
- アクション名:サブフォルダSizeGB(数値)
- 入力:(式として入力)
div(float(coalesce(outputs('サブフォルダサイズ(バイト)'), 0)), 1073741824)- 作成
- アクション名:サブフォルダ統計オブジェクト
- 入力:(式として入力)
setProperty(
setProperty(
setProperty(
setProperty(
json('{}'),
'Name', items('各サブフォルダを処理')?['Name']
),
'LibraryTitle', items('各ライブラリを処理')?['Title']
),
'ServerRelativeUrl', items('各サブフォルダを処理')?['ServerRelativeUrl']
),
'SizeGB', float(outputs('サブフォルダSizeGB(数値)'))
)- 配列変数に追加
- アクション名:folderStatsに追加
- Name:folderStats
- Value:@{outputs(‘サブフォルダ統計オブジェクト’)}
ここですべてのループを終了
サブフォルダの順位付け
- 選択
- アクション名:folderStatsを正規化
- 元:@{variables(‘folderStats’)}
- マップ1
- キー:Name
- 値:@{item()?[‘Name’]}
- マップ2
- キー:LibraryTitle
- 値:@{item()?[‘LibraryTitle’]}
- マップ3
- キー:ServerRelativeUrl
- 値:@{item()?[‘ServerRelativeUrl’]}
- マップ4
- キー:SizeGB
- 値:(式として入力)
float(coalesce(item()?['SizeGB'], 0))- 作成
- アクション名:サブフォルダ降順
- 入力(式として入力)
reverse( sort(body('folderStatsを正規化'), 'SizeGB') )Top10を算出
- 作成
- アクション名:Top10見出しを追加
- 入力:
---
【全ライブラリ横断:サブフォルダ容量 Top10】- 分岐(それぞれに適用)
- アクション名:Top10を出力
- 前のステップから出力を選択します:@{outputs(‘サブフォルダTop10’)}
分岐の入れ子で作成します
- 作成
- アクション名:次の順位
- 入力:(式として入力)
add(variables('rank'), 1)- 変数の設定
- アクション名:順位を更新
- 名前:rank
- 値:@{outputs(‘次の順位’)}
- 文字列変数に追加
- アクション名:Top10行を追加
- Name:report
- Value:(式として入力)
concat(
string(variables('rank')), '. ',
items('Top10を出力')?['LibraryTitle'], ' / ',
items('Top10を出力')?['Name'], ': ',
formatNumber(float(items('Top10を出力')?['SizeGB']), '0.00'), ' GB','<br>'
)ここですべてのループを終了
レポートをまとめて投稿
- チャットまたはチャネルでメッセージを投稿する
- アクション名:チャットまたはチャネルでメッセージを投稿する
- 投稿者:ユーザー
- 投稿先:グループチャット
- Group chat:48:notes (カスタム値)
- Message:(式として入力・HTMLコード入力モードにする)
concat(
'<b>【SharePoint サイト容量レポート】</b><br>',
'対象: ', variables('siteUrl'), '<br>',
'(単位はGB、小数点2桁)<br>',
'---<br>',
replace(coalesce(variables('report'), ''), '\n', '<br>')
)