{"id":58513,"date":"2023-05-30T06:00:00","date_gmt":"2023-05-30T10:00:00","guid":{"rendered":"https:\/\/practical365.com\/?p=58513"},"modified":"2024-06-03T11:50:53","modified_gmt":"2024-06-03T15:50:53","slug":"report-planner-data","status":"publish","type":"post","link":"https:\/\/practical365.com\/report-planner-data\/","title":{"rendered":"Practical Graph: Reporting Plans in a Microsoft 365 Tenant"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/practical365.com\/report-planner-data\/#Graph_Application_Permissions_Make_it_Easier_to_Report_Plans\" >Graph Application Permissions Make it Easier to Report Plans<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/practical365.com\/report-planner-data\/#Using_an_Azure_AD_Registered_App_to_Access_Planner_Data\" >Using an Azure AD Registered App to Access Planner Data<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/practical365.com\/report-planner-data\/#Using_PowerShell_to_Access_Planner_Data\" >Using PowerShell to Access Planner Data<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/practical365.com\/report-planner-data\/#Reporting_the_Data\" >Reporting the Data<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/practical365.com\/report-planner-data\/#Test_It_Yourself\" >Test It Yourself<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/practical365.com\/report-planner-data\/#Cybersecurity_Risk_Management_for_Active_Directory\" >Cybersecurity Risk Management for Active Directory<\/a><\/li><\/ul><\/nav><\/div>\n<div id=\"bsf_rt_marker\"><\/div>\n<h2 class=\"wp-block-heading\" id=\"h-graph-application-permissions-make-it-easier-to-report-plans\"><span class=\"ez-toc-section\" id=\"Graph_Application_Permissions_Make_it_Easier_to_Report_Plans\"><\/span>Graph Application Permissions Make it Easier to Report Plans<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Three years ago, I described some of the frustrations about using Graph APIs to report information about <a href=\"https:\/\/practical365.com\/office-365-microsoft-planner-features\/\" target=\"_blank\" rel=\"noreferrer noopener\">Planner <\/a>plans. The basic problem was the lack of application permissions for the <a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/resources\/planner-overview?WT.mc_id=M365-MVP-9501\" target=\"_blank\" rel=\"noreferrer noopener\">Planner Graph API<\/a>. Only delegate permissions were available at the time, which meant that you could only report details of plans belonging to Microsoft 365 groups you belong to. Other plans remain inaccessible because of a lack of permissions.<\/p>\n\n\n\n<p>Application permissions allow <a href=\"https:\/\/bit.ly\/3kl3Dzo\" target=\"_blank\" rel=\"noreferrer noopener\">Azure AD<\/a> apps to access data without a signed-in user. Microsoft promised to update the Planner Graph API with application permissions, but a marked lack of progress disappointed those who wanted to interact with plans for administrative purposes. For instance, Microsoft doesn\u2019t have a backup API for Planner, and the lack of application permissions forced people to add an administrator account to every group with a plan to backup plan data \u2013 or to move plan data to another tenant.<\/p>\n\n\n\n<p>But recently (I don\u2019t exactly know when because I stopped checking months ago), the <em>Tasks.Read.All<\/em> and <em>Tasks.ReadWrite.All<\/em> application permissions for the Planner Graph API turned up.<\/p>\n\n\n\n<p>The Microsoft Graph PowerShell SDK is restricted to the delegated <em>Tasks.Read<\/em> and <em>Tasks.ReadWrite<\/em> permission, which means that its cmdlets (like <em>Get-MgGroupPlannerPlan<\/em>) can only interact with plans the signed-in account can access. Any attempt to assign the application permissions is declined with an odd error. On one level, I understand the restriction because the SDK uses delegate permissions as the norm. However, the SDK also takes Azure AD administrator roles into account when calculating the set of effective permissions available in a session. It would therefore seem reasonable to be allowed to assign the application permission to the SDK so that it could be used by accounts with administrator permission. But that\u2019s not possible (yet).<\/p>\n\n\n\n<div class=\"q-blockads-inside-content q-blockads-entity-placement\" id=\"q-blockads-3474589859\"><div id=\"q-blockads-3034005937\"><p><a href=\"https:\/\/www.quest.com\/P365_On_Demand_Migration\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-62892\" src=\"https:\/\/practical365.com\/wp-content\/uploads\/2024\/09\/1901-10-20-2025-Redone-300x31.jpg\" alt=\"\" width=\"861\" height=\"89\" srcset=\"https:\/\/practical365.com\/wp-content\/uploads\/2024\/09\/1901-10-20-2025-Redone-300x31.jpg 300w, https:\/\/practical365.com\/wp-content\/uploads\/2024\/09\/1901-10-20-2025-Redone-768x80.jpg 768w, https:\/\/practical365.com\/wp-content\/uploads\/2024\/09\/1901-10-20-2025-Redone.jpg 860w\" sizes=\"auto, (max-width: 861px) 100vw, 861px\" \/><\/a><\/p>\n<\/div><\/div><h2 class=\"wp-block-heading\" id=\"h-using-an-azure-ad-registered-app-to-access-planner-data\"><span class=\"ez-toc-section\" id=\"Using_an_Azure_AD_Registered_App_to_Access_Planner_Data\"><\/span>Using an Azure AD Registered App to Access Planner Data<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The solution is to use an Azure AD registered app to access Planner data for every Microsoft 365 group that has a plan in its set of resources. To test the principle, I created a new Azure AD registered app and gave administrator consent for the following application permissions:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Directory.Read.All (read directory information).<\/li>\n\n\n\n<li>Group.Read.All (read group information).<\/li>\n\n\n\n<li>Tasks.Read.All (read plan information).<\/li>\n<\/ul>\n\n\n\n<p>I then created an application secret to use for testing. In production, it\u2019s safer to use a certificate or use an Azure Automation runbook with a managed identity (in this case, the service principal for the automation account must be assigned the necessary permissions).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-using-powershell-to-access-planner-data\"><span class=\"ez-toc-section\" id=\"Using_PowerShell_to_Access_Planner_Data\"><\/span>Using PowerShell to Access Planner Data<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>With an application identifier, tenant identifier, and application secret, we can ask Azure AD for <a href=\"https:\/\/office365itpros.com\/2022\/02\/17\/understanding-azure-ad-access-token\/\" target=\"_blank\" rel=\"noreferrer noopener\">an access token<\/a> containing the app permissions and use that to make Graph API requests. There\u2019s no mystery in this code, as it\u2019s a well-worn road.<\/p>\n\n\n\n<p>The basic steps in the script are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Find all Microsoft 365 groups in the tenant.<\/li>\n\n\n\n<li>For each group, check if it has any plans. Originally, a group could only have one plan, but Microsoft lifted that restriction to allow Teams to support plans in multiple channels.<\/li>\n\n\n\n<li>If plans are found, extract the details of the plan.<\/li>\n\n\n\n<li>Report the data.<\/li>\n<\/ul>\n\n\n\n<p>To check the plans in a group, I used this code (<em>Get-GraphData<\/em> is a helper function to run the <em>Invoke-RestRequest<\/em> cmdlet and process the results):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$Uri = (\"https:\/\/graph.microsoft.com\/v1.0\/groups\/{0}\/planner\/plans\" -f $Group.Id)\n[array]$Plans = Get-GraphData -Uri $Uri -AccessToken $Token\n<\/pre>\n\n\n\n<p>When a group has a plan, the data returned (for a single plan) looks like this:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@odata.etag     : W\/\"JzEtUGxhbiAgQEBAQEBAQEBAQEBAQEBAVCc=\"\ncreatedDateTime : 2020-06-09T14:45:19.2940321Z\nowner           : 107fe4dd-809c-4ec9-a3a1-ab88c96e0a5e\ntitle           : Plans\nid              : N6TvImQH70KdUzZGk25B5JYAF77k\ncreatedBy       : @{user=; application=}\ncontainer       : @{containerId=107fe4dd-809c-4ec9-a3a1-ab88c96e0a5e; type=group;\n                  url=https:\/\/graph.microsoft.com\/v1.0\/groups\/107fe4dd-809c-4ec9-a\n                  3a1-ab88c96e0a5e}\n<\/pre>\n\n\n\n<p>The script checks that a container (the way Planner describes a plan) exists and then proceeds to fetch the tasks for each plan. Here\u2019s an example of a call:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$Uri =  (\"https:\/\/graph.microsoft.com\/v1.0\/planner\/plans\/{0}\/tasks\" -f $Plan.id)\n[array]$Tasks = Get-GraphData -Uri $Uri -AccessToken $Token\n<\/pre>\n\n\n\n<p>After fetching tasks, the script computes some data such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The timestamp for the newest and oldest task in the plan.<\/li>\n\n\n\n<li>The number of tasks for each priority (urgent, important, medium, and low). Planner uses numeric values for priorities, with the corresponding values being 1, 3, 5, and 9.<\/li>\n\n\n\n<li>The number of tasks at each stage of progress (complete, in progress, not started). Planner stores progress as percentage values of 100, 50, and 0.<\/li>\n\n\n\n<li>The buckets used to organize tasks in the plan (even if a plan holds no tasks, it has a default bucket). For each bucket, the script calculates the number of active and completed tasks and the percentage of completed tasks.<\/li>\n<\/ul>\n\n\n\n<p>To retrieve the buckets for a plan, the script uses:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$Uri =  (\"https:\/\/graph.microsoft.com\/v1.0\/planner\/plans\/{0}\/buckets\" -f $Plan.id)\n[array]$Buckets = Get-GraphData -Uri $Uri -AccessToken $Token\n<\/pre>\n\n\n\n<p>The information retrieved for each plan goes into a PowerShell list for later processing.<\/p>\n\n\n\n<p>The Microsoft documentation for the various APIs (like <a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/plannergroup-list-plans?WT.mc_id=M365-MVP-9501\">List <\/a><a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/plannergroup-list-plans?WT.mc_id=M365-MVP-9501\" target=\"_blank\" rel=\"noreferrer noopener\">Plans<\/a>) provides some additional detail.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Reporting_the_Data\"><\/span>Reporting the Data<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>After processing all the plans linked to Microsoft 365 groups, the script processes the data to create an HTML report. The intention here is not to generate the best-looking report in the world. Instead, the script produces a report where all the plans belonging to a group are listed together. For each plan where some tasks are found, the script includes an analysis of each bucket with the number of tasks, completed tasks, active (not started or in progress) tasks, and percentage of active tasks. It\u2019s just an example of what can be done with the data extracted for a plan.<\/p>\n\n\n\n<p>Figure 1 shows an extract of the report from my tenant showing details of the plan the <a href=\"https:\/\/gum.co\/O365IT\/\" target=\"_blank\" rel=\"noreferrer noopener\">Office 365 for IT Pros<\/a> eBook team use to organize potential changes published in the Microsoft 365 message center that might affect book content. The plan is called MAC Tasks, and you can see how useful the bucket analysis can be in highlighting areas where work is necessary.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"673\" src=\"https:\/\/practical365.com\/wp-content\/uploads\/2023\/06\/Reporting-Planner-Graph-1024x673.jpg\" alt=\"\" class=\"wp-image-58669\" srcset=\"https:\/\/practical365.com\/wp-content\/uploads\/2023\/06\/Reporting-Planner-Graph-1024x673.jpg 1024w, https:\/\/practical365.com\/wp-content\/uploads\/2023\/06\/Reporting-Planner-Graph-300x197.jpg 300w, https:\/\/practical365.com\/wp-content\/uploads\/2023\/06\/Reporting-Planner-Graph-768x505.jpg 768w, https:\/\/practical365.com\/wp-content\/uploads\/2023\/06\/Reporting-Planner-Graph.jpg 1273w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Figure 1: Reporting Planner data, including a bucket analysis<\/figcaption><\/figure>\n<\/div>\n\n\n<div class=\"q-blockads-content q-blockads-entity-placement\" id=\"q-blockads-2506614156\"><div id=\"q-blockads-1696594514\"><p><a href=\"https:\/\/www.quest.com\/Security_Guardian_P365\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-62893\" src=\"https:\/\/practical365.com\/wp-content\/uploads\/2024\/04\/1902-10-20-2025-Redone-300x31.jpg\" alt=\"\" width=\"861\" height=\"89\" srcset=\"https:\/\/practical365.com\/wp-content\/uploads\/2024\/04\/1902-10-20-2025-Redone-300x31.jpg 300w, https:\/\/practical365.com\/wp-content\/uploads\/2024\/04\/1902-10-20-2025-Redone-768x80.jpg 768w, https:\/\/practical365.com\/wp-content\/uploads\/2024\/04\/1902-10-20-2025-Redone.jpg 860w\" sizes=\"auto, (max-width: 861px) 100vw, 861px\" \/><\/a><\/p>\n<\/div><\/div><h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Test_It_Yourself\"><\/span>Test It Yourself<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>The script is available to <a href=\"https:\/\/github.com\/12Knocksinna\/Office365itpros\/blob\/master\/Report-Plans.PS1\" target=\"_blank\" rel=\"noreferrer noopener\">download from GitHub<\/a>. Remember that the code is not a perfect solution for Planner reporting. It\u2019s intended to be a practical demonstration of what\u2019s possible now that the Planner Graph API supports application permissions. Feel free to suggest changes (or make them) in GitHub.<\/p>\n\n\n\n<p>Before you can run the script, you\u2019ll need to create an Azure AD registered app in your tenant and adjust the values for the application identifier, tenant identifier, and application secret. After that, navigating the internals of plans, tasks, and buckets should be smooth sailing.<\/p>\n\n\n\n\r\n    <div id=\"qcb-cybersecurityriskmanagementforactivedirectory\" data-v3=\"Promo\" class=\"q-custom-block promo-block contact-v3 centered pt-v3 pb-v3 \">\r\n        <div class=\"container\">\r\n                        <div class=\"contact-info bg-cyan \">\r\n                <h2 class=\"title-v3\"><span class=\"ez-toc-section\" id=\"Cybersecurity_Risk_Management_for_Active_Directory\"><\/span>Cybersecurity Risk Management for Active Directory<span class=\"ez-toc-section-end\"><\/span><\/h2>                <div class=\"intro-v3 txt-v3\" data-v3-action=\"Content\">\r\n                    <p>Discover how to prevent and recover from AD attacks through these Cybersecurity Risk Management Solutions.<\/p>\n                <\/div>\r\n                                    <div class=\"cta-v3 center\">\r\n                                                                                    <a data-v3-action=\"CTA Button\" class=\"btn-v3 btn-block-xs btn-default\" target=\"_blank\" href=\"https:\/\/www.quest.com\/P365_Cybersecurity_risk_management_for_Active_Directory\">Learn More!<\/a>\r\n                                                                        <\/div> <!-- \/* Ends CTA Buttons *\/ -->\r\n                            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\n","protected":false},"excerpt":{"rendered":"<p>The arrival of application permissions for the Planner Graph API makes it much easier to write PowerShell scripts to automate administrative operations like reporting Planner data. This article describes a example script that uses the Planner APIs to gather and report information about the plans belonging to Microsoft 365 Groups.<\/p>\n","protected":false},"author":84,"featured_media":58556,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[9055],"tags":[146,10825,238,10826],"class_list":["post-58513","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell","tag-planner","tag-planner-graph-api","tag-powershell","tag-reporting-planner-data","entry","has-media"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Reporting Planner Data with the Graph API | Practical365<\/title>\n<meta name=\"description\" content=\"The arrival of application permissions for the Planner Graph API makes it much easier to write PowerShell scripts to automate administrative operations like reporting Planner data. This article describes a example script that uses the Planner APIs to gather and report information about the plans belonging to Microsoft 365 Groups.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/practical365.com\/report-planner-data\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Practical Graph: Reporting Plans in a Microsoft 365 Tenant\" \/>\n<meta property=\"og:description\" content=\"The arrival of application permissions for the Planner Graph API makes it much easier to write PowerShell scripts to automate administrative operations like reporting Planner data. This article describes a example script that uses the Planner APIs to gather and report information about the plans belonging to Microsoft 365 Groups.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/practical365.com\/report-planner-data\/\" \/>\n<meta property=\"og:site_name\" content=\"Practical 365\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Practical365\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-30T10:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-03T15:50:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/practical365.com\/wp-content\/uploads\/2023\/05\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1100\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Tony Redmond\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/12Knocksinna\" \/>\n<meta name=\"twitter:site\" content=\"@Practical365\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tony Redmond\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/\"},\"author\":{\"name\":\"Tony Redmond\",\"@id\":\"https:\\\/\\\/practical365.com\\\/#\\\/schema\\\/person\\\/19d7b2f404dd1da1d87586fb07015a19\"},\"headline\":\"Practical Graph: Reporting Plans in a Microsoft 365 Tenant\",\"datePublished\":\"2023-05-30T10:00:00+00:00\",\"dateModified\":\"2024-06-03T15:50:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/\"},\"wordCount\":1034,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/practical365.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg\",\"keywords\":[\"Planner\",\"Planner Graph API\",\"PowerShell\",\"Reporting Planner Data\"],\"articleSection\":[\"PowerShell\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/\",\"url\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/\",\"name\":\"Reporting Planner Data with the Graph API | Practical365\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/practical365.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg\",\"datePublished\":\"2023-05-30T10:00:00+00:00\",\"dateModified\":\"2024-06-03T15:50:53+00:00\",\"description\":\"The arrival of application permissions for the Planner Graph API makes it much easier to write PowerShell scripts to automate administrative operations like reporting Planner data. This article describes a example script that uses the Planner APIs to gather and report information about the plans belonging to Microsoft 365 Groups.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/#primaryimage\",\"url\":\"https:\\\/\\\/practical365.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg\",\"contentUrl\":\"https:\\\/\\\/practical365.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg\",\"width\":1100,\"height\":500},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/practical365.com\\\/report-planner-data\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/practical365.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PowerShell\",\"item\":\"https:\\\/\\\/practical365.com\\\/powershell\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Practical Graph: Reporting Plans in a Microsoft 365 Tenant\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/practical365.com\\\/#website\",\"url\":\"https:\\\/\\\/practical365.com\\\/\",\"name\":\"Practical 365\",\"description\":\"Practical Office 365 News, Tips, and Tutorials\",\"publisher\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/practical365.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/practical365.com\\\/#organization\",\"name\":\"Practical 365\",\"url\":\"https:\\\/\\\/practical365.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/practical365.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/practical365.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/Logo-P365-stacked.jpg\",\"contentUrl\":\"https:\\\/\\\/practical365.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/Logo-P365-stacked.jpg\",\"width\":1176,\"height\":696,\"caption\":\"Practical 365\"},\"image\":{\"@id\":\"https:\\\/\\\/practical365.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Practical365\",\"https:\\\/\\\/x.com\\\/Practical365\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/practical365-com\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/practical365.com\\\/#\\\/schema\\\/person\\\/19d7b2f404dd1da1d87586fb07015a19\",\"name\":\"Tony Redmond\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/practical365.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-TonyRedmondHeadShot2016-1200-96x96.jpg\",\"url\":\"https:\\\/\\\/practical365.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-TonyRedmondHeadShot2016-1200-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/practical365.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-TonyRedmondHeadShot2016-1200-96x96.jpg\",\"caption\":\"Tony Redmond\"},\"description\":\"Tony Redmond has written thousands of articles about Microsoft technology since 1996. He is the lead author for the Office 365 for IT Pros eBook, the only book covering Office 365 that is updated monthly to keep pace with change in the cloud. Apart from contributing to Practical365.com, Tony also writes at Office365itpros.com to support the development of the eBook. He has been a Microsoft MVP since 2004.\",\"sameAs\":[\"https:\\\/\\\/office365itpros.com\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/12Knocksinna\"],\"url\":\"https:\\\/\\\/practical365.com\\\/author\\\/tony-redmondredmondassociates-org\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Reporting Planner Data with the Graph API | Practical365","description":"The arrival of application permissions for the Planner Graph API makes it much easier to write PowerShell scripts to automate administrative operations like reporting Planner data. This article describes a example script that uses the Planner APIs to gather and report information about the plans belonging to Microsoft 365 Groups.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/practical365.com\/report-planner-data\/","og_locale":"en_US","og_type":"article","og_title":"Practical Graph: Reporting Plans in a Microsoft 365 Tenant","og_description":"The arrival of application permissions for the Planner Graph API makes it much easier to write PowerShell scripts to automate administrative operations like reporting Planner data. This article describes a example script that uses the Planner APIs to gather and report information about the plans belonging to Microsoft 365 Groups.","og_url":"https:\/\/practical365.com\/report-planner-data\/","og_site_name":"Practical 365","article_publisher":"https:\/\/www.facebook.com\/Practical365","article_published_time":"2023-05-30T10:00:00+00:00","article_modified_time":"2024-06-03T15:50:53+00:00","og_image":[{"width":1100,"height":500,"url":"https:\/\/practical365.com\/wp-content\/uploads\/2023\/05\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg","type":"image\/jpeg"}],"author":"Tony Redmond","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/12Knocksinna","twitter_site":"@Practical365","twitter_misc":{"Written by":"Tony Redmond","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/practical365.com\/report-planner-data\/#article","isPartOf":{"@id":"https:\/\/practical365.com\/report-planner-data\/"},"author":{"name":"Tony Redmond","@id":"https:\/\/practical365.com\/#\/schema\/person\/19d7b2f404dd1da1d87586fb07015a19"},"headline":"Practical Graph: Reporting Plans in a Microsoft 365 Tenant","datePublished":"2023-05-30T10:00:00+00:00","dateModified":"2024-06-03T15:50:53+00:00","mainEntityOfPage":{"@id":"https:\/\/practical365.com\/report-planner-data\/"},"wordCount":1034,"commentCount":0,"publisher":{"@id":"https:\/\/practical365.com\/#organization"},"image":{"@id":"https:\/\/practical365.com\/report-planner-data\/#primaryimage"},"thumbnailUrl":"https:\/\/practical365.com\/wp-content\/uploads\/2023\/05\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg","keywords":["Planner","Planner Graph API","PowerShell","Reporting Planner Data"],"articleSection":["PowerShell"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/practical365.com\/report-planner-data\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/practical365.com\/report-planner-data\/","url":"https:\/\/practical365.com\/report-planner-data\/","name":"Reporting Planner Data with the Graph API | Practical365","isPartOf":{"@id":"https:\/\/practical365.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/practical365.com\/report-planner-data\/#primaryimage"},"image":{"@id":"https:\/\/practical365.com\/report-planner-data\/#primaryimage"},"thumbnailUrl":"https:\/\/practical365.com\/wp-content\/uploads\/2023\/05\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg","datePublished":"2023-05-30T10:00:00+00:00","dateModified":"2024-06-03T15:50:53+00:00","description":"The arrival of application permissions for the Planner Graph API makes it much easier to write PowerShell scripts to automate administrative operations like reporting Planner data. This article describes a example script that uses the Planner APIs to gather and report information about the plans belonging to Microsoft 365 Groups.","breadcrumb":{"@id":"https:\/\/practical365.com\/report-planner-data\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/practical365.com\/report-planner-data\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/practical365.com\/report-planner-data\/#primaryimage","url":"https:\/\/practical365.com\/wp-content\/uploads\/2023\/05\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg","contentUrl":"https:\/\/practical365.com\/wp-content\/uploads\/2023\/05\/922-05-16-2023-Reporting-plans-in-a-Microsoft-365-tenant-LOW.jpg","width":1100,"height":500},{"@type":"BreadcrumbList","@id":"https:\/\/practical365.com\/report-planner-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/practical365.com\/"},{"@type":"ListItem","position":2,"name":"PowerShell","item":"https:\/\/practical365.com\/powershell\/"},{"@type":"ListItem","position":3,"name":"Practical Graph: Reporting Plans in a Microsoft 365 Tenant"}]},{"@type":"WebSite","@id":"https:\/\/practical365.com\/#website","url":"https:\/\/practical365.com\/","name":"Practical 365","description":"Practical Office 365 News, Tips, and Tutorials","publisher":{"@id":"https:\/\/practical365.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/practical365.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/practical365.com\/#organization","name":"Practical 365","url":"https:\/\/practical365.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/practical365.com\/#\/schema\/logo\/image\/","url":"https:\/\/practical365.com\/wp-content\/uploads\/2022\/06\/Logo-P365-stacked.jpg","contentUrl":"https:\/\/practical365.com\/wp-content\/uploads\/2022\/06\/Logo-P365-stacked.jpg","width":1176,"height":696,"caption":"Practical 365"},"image":{"@id":"https:\/\/practical365.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Practical365","https:\/\/x.com\/Practical365","https:\/\/www.linkedin.com\/company\/practical365-com"]},{"@type":"Person","@id":"https:\/\/practical365.com\/#\/schema\/person\/19d7b2f404dd1da1d87586fb07015a19","name":"Tony Redmond","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/practical365.com\/wp-content\/uploads\/2022\/06\/cropped-TonyRedmondHeadShot2016-1200-96x96.jpg","url":"https:\/\/practical365.com\/wp-content\/uploads\/2022\/06\/cropped-TonyRedmondHeadShot2016-1200-96x96.jpg","contentUrl":"https:\/\/practical365.com\/wp-content\/uploads\/2022\/06\/cropped-TonyRedmondHeadShot2016-1200-96x96.jpg","caption":"Tony Redmond"},"description":"Tony Redmond has written thousands of articles about Microsoft technology since 1996. He is the lead author for the Office 365 for IT Pros eBook, the only book covering Office 365 that is updated monthly to keep pace with change in the cloud. Apart from contributing to Practical365.com, Tony also writes at Office365itpros.com to support the development of the eBook. He has been a Microsoft MVP since 2004.","sameAs":["https:\/\/office365itpros.com","https:\/\/x.com\/https:\/\/twitter.com\/12Knocksinna"],"url":"https:\/\/practical365.com\/author\/tony-redmondredmondassociates-org\/"}]}},"_links":{"self":[{"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/posts\/58513","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/users\/84"}],"replies":[{"embeddable":true,"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/comments?post=58513"}],"version-history":[{"count":0,"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/posts\/58513\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/media\/58556"}],"wp:attachment":[{"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/media?parent=58513"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/categories?post=58513"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/practical365.com\/wp-json\/wp\/v2\/tags?post=58513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}