MSGraph – Planner

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
}