Olá Pessoal,
Recentemente me mudei para o Canadá, e ainda não estou familiarizado com os feriados do país. Meus colegas de trabalho me indicaram um site para localizar os feriados do estado de Ontario(onde moro) o StatutoryHolidays.ca e ele contém uma tabela com os feriados do ano e o nome.
Mesmo sabendo que existem plugins no outlook para isso, resolvi fazer um script que iria ler a pagina, transformar a tabela com os feriados em um Objeto e em seguida criar as entradas no meu calendário do Microsoft Outlook.
Primeiro eu precisava recuperar o HTML da página, para isso, acabei pesquisando se alguem ja havia tentado fazer isso antes e localizei o artigo do Lee Holmes, com uma aborgagem interessante sobre como transformar Tabelas em uma pagina Web em um objeto no powershell, e então acabei aproveitando uma parte do código dele. A diferença foi no titulo, que para localiza-lo precidei verificar se a classe era “tablehead” e buscar as celulas dentro dela, mas isso foi apenas para o caso dessa pagina, em seguida armazenei o resultado na variavel “$Holidays”:
$WebRequest = Invoke-WebRequest -Uri 'https://www.statutoryholidays.com/ontario.php'
$table = @($WebRequest.ParsedHtml.getElementsByTagName("TABLE"))[0]
$titles = @()
$Holidays = foreach($row in @($table.Rows))
{
if($row.ClassName -eq 'tablehead'){
$titles = $row.cells | Foreach-Object -Process { ($PSItem.InnerText).Trim() }
}
else{
$cells = @($row.Cells)
$resultObject = [Ordered] @{}
for($counter = 0; $counter -lt $cells.Count; $counter++)
{
$title = $titles[$counter]
if(-not $title) { continue }
$resultObject[$title] = ($cells[$counter].InnerText).Trim()
}
[PSCustomObject] $resultObject
}
}
Em seguida abro o Outlook e com um laço foreach eu crio uma entrada de calendário nova por item, o artigo que me baseei para identificar essa chamada foi esse:
https://docs.microsoft.com/en-us/archive/blogs/buckwoody/create-outlook-appointments-from-powershell
$outlookApplication = New-Object -ComObject 'Outlook.Application'
foreach($Holiday in $Holidays){
# Creating a instance of Calenders
$newCalenderItem = $outlookApplication.CreateItem('olAppointmentItem')
$newCalenderItem.Subject = $Holiday.Holiday
$newCalenderItem.Body = $Holiday.Holiday
$newCalenderItem.Start = [datetime]$Holiday.2020
$newCalenderItem.ReminderSet = $true
$newCalenderItem.Importance = 1
$newCalenderItem.ReminderMinutesBeforeStart = '15'
$newCalenderItem.BusyStatus = 3 #out of the office
$newCalenderItem.AllDayEvent = $true
$newCalenderItem.Save()
}
$outlookApplication.Quit()
O Script Completo ficou assim:
$WebRequest = Invoke-WebRequest -Uri 'https://www.statutoryholidays.com/ontario.php'
$table = @($WebRequest.ParsedHtml.getElementsByTagName("TABLE"))[0]
$titles = @()
$Holidays = foreach($row in @($table.Rows))
{
if($row.ClassName -eq 'tablehead'){
$titles = $row.cells | Foreach-Object -Process { ($PSItem.InnerText).Trim() }
}
else{
$cells = @($row.Cells)
$resultObject = [Ordered] @{}
for($counter = 0; $counter -lt $cells.Count; $counter++)
{
$title = $titles[$counter]
if(-not $title) { continue }
$resultObject[$title] = ($cells[$counter].InnerText).Trim()
}
[PSCustomObject] $resultObject
}
}
$outlookApplication = New-Object -ComObject 'Outlook.Application'
foreach($Holiday in $Holidays){
# Creating a instance of Calenders
$newCalenderItem = $outlookApplication.CreateItem('olAppointmentItem')
$newCalenderItem.Subject = $Holiday.Holiday
$newCalenderItem.Body = $Holiday.Holiday
$newCalenderItem.Start = [datetime]$Holiday.2020
$newCalenderItem.ReminderSet = $true
$newCalenderItem.Importance = 1
$newCalenderItem.ReminderMinutesBeforeStart = '15'
$newCalenderItem.BusyStatus = 3 #out of the office
$newCalenderItem.AllDayEvent = $true
$newCalenderItem.Save()
}
$outlookApplication.Quit()
Assim, meu calendário ficou com os feriados e os devidos lembretes, esse foi um exemplo simples, mas pode ser utilizado de várias outras formas onde a fonte é uma pagina web com tabela HTML.
Dúvidas? Sugestões?
Até a próxima!
2 Comments
up
para cima.