Сегодня вылезла бага в одном моем решении для SharePoint online – модуль выводил только первые 100 элементов. Круглое значение меня насторожило еще больше, чем мысль о щепетильности заметившего ошибку – это ж надо было посчитать количество записей 🙂 Но надо воспроизвести и исправить.
Чтоб воспроизвести ошибку с выдачей 100 записей, надо их создать. Не создавать же вручную. Если PowerShell скриптов для SharePoint onpremise я писал много, то для SharePoint Online я практики пока маловато. В целом, с этим и связана ошибка, хотя в SharePoint 2019 было то же самое ограничение, но я про него не вспомнил.
Как создать записи в списке SharePoint online через PowerShell
Для этой задачи использую PowerShell и библиотеку PNP PS. Собственно, скрипт не самый сложный. В списке есть 2 поля формата DateTime. Это, пожалуй, было самым сложным в скрипте.
$url= 'https://markimarta.com/sites/Euro2024/'
Connect-PnPOnline -Url $url -Interactive
Set-PnPTraceLog -On -Level Debug
$listTitle = "My Events"
for ($i = 1; $i -lt 30; $i++) {
$v = Get-Date -Date "2023-10-$i 10:00:00Z"
$ve = Get-Date -Date "2023-10-$i 16:00:00Z"
Add-PnPListItem -List "My Events" -Values @{"Title" = "Test Title"; "StartDate"= $v; "EndDate" = $ve; "BookObject" = 11; "Reservation_x0020_type" = "Blocked" }
}
А для получения более 100 записей через REST API SharePoint нужно добавить в запрос параметр $top=1000. Главное, не ставить более 5000 , т.к. это ограничение обходить можно только через рекурсию.
Для PNP JS в запросе нужно добавлять top(1000).
this._sp.web.lists.getByTitle(this._reserveList).items.filter( `((StartDate gt datetime'${stZ}') and (StartDate le datetime'${enZ}')) ` ).select("Id", "Title", "AllDay", "StartDate", "EndDate", "Reservation_x0020_type").top(1000)