Récupération de l’ID
Pour récupérer l’ID d’un planner, on doit d’abord récupérer l’ID du groupe SharePoint via le portail d’administration, puis on peut récupérer les ID des planners qui y sont via la requête graph suivante :
https://graph.microsoft.com/v1.0/groups/$idgroup/planner/plans
Scan des tâches
$ApiTasksonPlanner = "https://graph.microsoft.com/v1.0/planner/plans/$idplanner/tasks"
$ResultTasksonPlanner = @()
While ($ApiTasksonPlanner -ne $Null) {
$Response = Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri $ApiTasksonPlanner -Method Get
if ($Response.value) {
$Calls = $Response.value
ForEach ($Call in $Calls) {
$ResultTasksonPlanner += New-Object PSObject -property @{
id = $Call.id
title = $Call.title
}
}
}
$ApiTasksonPlanner = $Response.'@odata.nextlink' # Move to the next page
}
($ResultTasksonPlanner).count
Création d’une tâche
On provisionne d’abord le body :
Le bucketId correspond à la colonne à Analyser
Les catégories peuvent être récupérées en Graph via https://graph.microsoft.com/v1.0/planner/plans/$idplan/details
Les valeurs devront être $true ou $false, exemple de mon code plus haut :
if ($tags -match « New Feature ») {$category1 = $true} else {$category1 = $false}
$Body = @{
planId = "$idplan"
bucketId = "$bucketId"
title = $cibleTitle
startDateTime = $publisheddate
priority = $priority
appliedCategories = @{
"category1" = $category1
"category2" = $category2
"category3" = $category3
"category4" = $category4
"category5" = $category5
"category6" = $category6
"category7" = $category7
"category8" = $category8
"category9" = $category9
"category10" = $category10
"category11" = $category11
"category12" = $category12
"category13" = $category13
"category14" = $category14
"category15" = $category15
"category16" = $category16
"category17" = $category17
"category18" = $category18
"category19" = $category19
"category20" = $category20
"category21" = $category21
"category22" = $category22
"category23" = $category23
"category24" = $category24
}
} | ConvertTo-Json -Depth 3
Puis on créé la tâche :
try {
$POSTReq = Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri "https://graph.microsoft.com/v1.0/planner/tasks" -Method POST -Body $Body -ContentType "application/json"
$Id = $POSTReq.id
} catch {
$responseStream = $_.Exception.Response.GetResponseStream()
$reader = New-Object System.IO.StreamReader($responseStream)
$errorBody = $reader.ReadToEnd()
Write-Host "Détails de l'erreur sur la création de la tâche : $errorBody"
write-host $body
break
}
Ajout d’une description
Par défaut, en Graph, la description ne peut pas être envoyée lors de la création de la tâche.
Il est donc nécessaire de réaliser une seconde requête Graph, de type PATCH.
Attention cette fois-ci, le body sera différent :
$cibleBody = @{
description = "Message ID : $sourceId `
Id de Roadmap (opt) :
} | ConvertTo-Json -Depth 3
Puis on envoi la requête :
$Etag = (Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri "https://graph.microsoft.com/v1.0/planner/tasks/$Id/details" -Method GET -ContentType "application/json").'@odata.etag'
#Création de la description de la tâche Planner
try {
Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)";"If-Match" = $Etag;"Content-Type" = "application/json"} -Uri "https://graph.microsoft.com/v1.0/planner/tasks/$Id/details" -Method Patch -Body $cibleBody
} catch {
$responseStream = $_.Exception.Response.GetResponseStream()
$reader = New-Object System.IO.StreamReader($responseStream)
$errorBody = $reader.ReadToEnd()
Write-Host "Détails de l'erreur sur la création de la description : $errorBody"
Write-Host $cibleBody
break
}
Petite note, l’Etag sera nécessaire pour envoyer une correction sur la tâche
Clôture d’une tâche
$Body = @{
percentComplete = "100"
} | ConvertTo-Json -Depth 3
$Etag = (Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri "https://graph.microsoft.com/v1.0/planner/tasks/$Id" -Method GET -ContentType "application/json").'@odata.etag'
Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)";"If-Match" = $Etag;"Content-Type" = "application/json"} -Uri "https://graph.microsoft.com/v1.0/planner/tasks/$Id" -Method Patch -Body $Body
Suppression de toutes les tâches
Pour vider l’ensemble des tâches d’un Planner, on peut le faire avec le bout de script suivant
$ApiTasksonPlanner = "https://graph.microsoft.com/v1.0/planner/plans/$idplan/tasks"
$ResultTasksonPlanner = @()
While ($ApiTasksonPlanner -ne $Null) {
$Response = Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri $ApiTasksonPlanner -Method Get
if ($Response.value) {
$Calls = $Response.value
ForEach ($Call in $Calls) {
$ResultTasksonPlanner += New-Object PSObject -property @{
id = $Call.id
title = $Call.title
}
}
}
$ApiTasksonPlanner = $Response.'@odata.nextlink' # Move to the next page
}
($ResultTasksonPlanner).count
#Nettoyage
($ResultTasksonPlanner) | foreach-object {
$id = $_.id
write-host "$id"
$task = Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri "https://graph.microsoft.com/v1.0/planner/tasks/$id" -Method GET
$etag = $task.'@odata.etag'
Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)";"If-Match" = $etag} -Uri "https://graph.microsoft.com/v1.0/planner/tasks/$id" -Method DELETE
}