Guido Oliveira
  • Home
  • Sobre
  • Contato
  • Home
  • Sobre
  • Contato
Menu
  • Home
  • Sobre
  • Contato

Adicionando feriados no Outlook diretamente de um website pelo Powershell

Published by Guido Oliveira on 08/06/2020
Categories
  • Powershell
Tags
  • HTML Table to Object
  • Invoke-WebRequest
  • New Outlook calendar item
  • Outlook.Application
  • powershell
Facebook0
Twitter0
LinkedIn0
Google+0
Pinterest0

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!

Share
Guido Oliveira
Guido Oliveira

Related posts

05/01/2021

Removendo dispositivos órfãos do Windows com Powershell


Read more
31/03/2020

Armazenando Chaves RSA(SSH) no Azure Key Vault


Read more
30/03/2020

Usando extensões do Azure para criar usuários em servidores linux em lote


Read more

2 Comments

  1. Denis Basílio Denis Basílio disse:
    08/06/2020 às 10:23 PM

    up

    Responder
  2. Denis Basílio Denis Basílio disse:
    18/07/2020 às 6:33 PM

    para cima.

    Responder

Deixe uma resposta Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

ME SIGA:

  • youtube
  • facebook
  • twitter
  • instagram
  • github
  • linkedin
  • telegram

Busca

Prêmios

Powershell MVP
Facebook
© 2019 Guido Oliveira. All Rights Reserved.
Menu
  • Home
  • Sobre
  • Contato