вторник, 12 ноября 2013 г.

Создание оповещений (Alert) с помощью PowerShell


Недавно встала задача создать оповещения для нескольких пользователей. Казалась задача тривиальная, зайти в список и создать оповещения для этих пользователей, но необходимо было создать определенные условия.
Необходимо что бы пользователям приходило оповещение  за семь дней до истечения срока завершения задачи. Такого условия в форме создания оповещения нет.
Создаем оповещение средствами браузера и смотрим  с помощью PowerShell что у нас получается, оказывается условия выполнения это знакомый нам Query.





Что бы решить свою задачу я добавил вычисляемое поле expire в список Задачи. В качестве формулы использовал: [Срок]-7 , тип возвращаемых данных "Дата и время"


Теперь нам нужно отправить письмо, когда дата expire будет равна текущей дате и задача будет поставлена определенному пользователю.
Создаем необходимый Query (можно воспользоваться U2U CAML Query Builder, только будьте внимательны с вычисляемым полем, в нашем случае оно должно возвращать данные типа Дата и время)



<Query>
                <And>
                               <Eq>
                                               <FieldRef Name="AssignedTo" />
                                               <Value Type="User">Иванова Инна Ивановка</Value>
                               </Eq>
                               <Eq>
                                               <FieldRef Name="expire"/>
                                               <Value Type="DateTime"><Today /></Value>
                               </Eq>
                </And>
</Query>
Осталось записать требуемое значение фильтра в оповещение, но как к нему обратиться, ведь элементов у списка оповещения нет ID?

можно обратится как к элементу массива
$web = get-spweb http://server/sites
$web.alerts [n]



Обновляем значение поля filter
$web = get-spweb http://server/sites
$web.alerts[1].filter = '<Query><And><Eq><FieldRef Name="AssignedTo" /> <Value Type="User"> Иванова Инна Ивановка</Value></Eq><Eq><FieldRef Name="expire"/><Value Type="DateTime"><Today /></Value></Eq></And></Query>'
$web.alerts[1].update()


В общем, не плохо, но что будет, когда оповещений будет много, и как найти нужное оповещение.
Можно еще воспользоваться SharePoint Manager 2010 и редактировать значение поля Filter с помощью него
.

Но, на мой взгляд, лучше, что бы исключить возможность ошибки, лучше сразу создавать оповещения с нужными значениями поля Filter 


$SPweb = Get-SPWeb http://server/sites
$SPlist = $SPweb.lists["Задачи"]  # спискок к которому привязываем оповещения
$SPuser = $SPweb.EnsureUser('domain\user') # пользователь которому создаем оповещения
$SPnewAlert = $SPuser.Alerts.Add()
$SPnewAlert.Title = "Приближающиеся задачи" # название оповещения
$SPnewAlert.AlertType=[Microsoft.SharePoint.SPAlertType]::List
$SPnewAlert.List = $SPlist
$SPnewAlert.DeliveryChannels = [Microsoft.SharePoint.SPAlertDeliveryChannels]::Email
$SPnewAlert.EventType = [Microsoft.SharePoint.SPEventType]::All
$SPnewAlert.AlertFrequency = [Microsoft.SharePoint.SPAlertFrequency]::Daily
$SPnewAlert.Filter = '<Query><And><Eq><FieldRef Name="AssignedTo" /> <Value Type="User">Иванова Инна Ивановна</Value></Eq><Eq><FieldRef Name="expire"/><Value Type="DateTime"><Today /></Value></Eq></And></Query>'
$SPnewAlert.Update()
$SPweb.Dispose()


Надеюсь моя статья будет Вам полезна.