<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Project Support Blog articles</title>
    <link>https://techcommunity.microsoft.com/t5/project-support-blog/bg-p/ProjectSupport</link>
    <description>Project Support Blog articles</description>
    <pubDate>Thu, 30 Apr 2026 00:08:06 GMT</pubDate>
    <dc:creator>ProjectSupport</dc:creator>
    <dc:date>2026-04-30T00:08:06Z</dc:date>
    <item>
      <title>Project Selection: Portfolio Analysis using Copilot in Excel with Python</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/project-selection-portfolio-analysis-using-copilot-in-excel-with/ba-p/4251595</link>
      <description>&lt;P&gt;One of my favourite features in Project Online, and Project Server, has been the portfolio features that allow you do match your plan portfolio against your business drivers to ensure you are gaining the best strategic value.&amp;nbsp; I created a Power App to do something similar a while back, and when Copilot in Excel with Python was announced, I thought it would be a good time to see if I could recreate what Project does, but in Excel.&amp;nbsp; This is probably a feature that we won't be rebuilding for new Planner but may be a perfect scenario for Copilot to fill the gap, and maybe some agents can help out?&amp;nbsp; Copilot in Excel with Python is available now for Insiders (&lt;A title="Copilot in Excel with Python" href="https://support.microsoft.com/en-us/office/copilot-in-excel-with-python-364e4ae9-9343-4d56-952a-5f62b0f70db6" target="_blank" rel="noopener"&gt;Excel Advanced Analysis&lt;/A&gt;&amp;nbsp;)&amp;nbsp;and I must say I was pretty impressed how straightforward it was to talk Copilot through creating some Python for me to do the analysis - and give me exactly the same choice of projects from my portfolio.&amp;nbsp; I'm not using any insider knowledge to do this, but using public documentation on the maths behind the process from&amp;nbsp;&lt;A title="Portfolio Analysis with  Microsoft Project Server 2010" href="https://download.microsoft.com/download/0/4/2/042AFA1E-B05D-4AA9-9434-8FC47D1D8773/Portfolio_Analysis_with_Microsoft_Project_Server_2010.pdf" target="_blank" rel="noopener"&gt;Portfolio Analysis with Microsoft Project Server 2010&lt;/A&gt;&amp;nbsp;a white paper written for Microsoft by Andrew Lavinsky, now with EY) and if you want to dig deeper, a search on Saaty and Analytic Hierarchy Process (AHP - the name given to this particular optimization technique) will find more papers going back to the late 70's. I was keen to check results against Project Online, so used a similar approach, but this does generally show how you might ask Copilot to come up with different optimization algorithms if you have specific scenarios in mind.&amp;nbsp; I'll walk through more or less the steps I followed, along with the issues I saw along the way and the way I steered Copilot to put things right.&amp;nbsp; At this point I am only looking at the cost side or things.&amp;nbsp; Resourcing is a topic for another day...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Initial Steps - Setting up a Portfolio in Project Online&lt;/H3&gt;
&lt;P&gt;To give me something to validate against, I configured some drivers and projects in Project Online and set up some driver prioritizations and then mapped my projects to them.&amp;nbsp; I set a budget and forced in a couple of projects.&amp;nbsp; I used the articles at &lt;A href="https://learn.microsoft.com/en-us/projectonline/portfolio-analysis-overview" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/projectonline/portfolio-analysis-overview&lt;/A&gt;&amp;nbsp;to configure some data, if you want to follow along.&amp;nbsp; I used the same names for drivers and plans, although I could not bring myself to have a plan called Lync 2012 Enterprise Deployment - so that was renamed as Teams Enterprise Deployment.&lt;/P&gt;
&lt;P&gt;My target is to have my driver priorities match these:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;My plan priorities to look something like this:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;And my final selection to match up with this group of plans:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;H3&gt;Into Excel - Prioritizing Business Drivers!&lt;/H3&gt;
&lt;P&gt;Starting with the Business Drivers sheet, and I soon learned that it was better to keep things tidy in Excel - so I just labelled my drivers A-E as it made the matrix easier to see, rather than having long text descriptions.&amp;nbsp; From memory I knew this needed to be a symetrical matrix, with the leading diagonal all '1's as each driver matches itself, then the other numbers represented the 'is as important', 'is more important', is much more important' and finally 'is extremely more important than' - with the same for 'less important' levels too.&amp;nbsp; I got the numbers wrong first time through (I used 1,3,5 and 7) and my percentages were a little bit off - but I still got the same project selection - but for accuracy I'll use the ones from the white paper - 1,3,6 and 9, and the reciprocals for the 'less than' options.&amp;nbsp; You only need to fill out the top half of the matrix (to the upper right of the '1's) and have the lower as =1/(the matching cell).&amp;nbsp; So my matrix ended up looking like this to match the driver comparisons I had chosen in Project Online:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;I then fired up Copilot and gave the following prompt:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Can you write some Python code to set a ranking for the drivers A, B, C, D and E on the business drivers sheet based on the pair-wise comparison using the Analytic Hierarchy Process. Can you give a consistency ratio for the analysis as well as displaying the priorities calculated for the drivers.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;If I hadn't known about AHP then I think Copilot might still have got to this by starting with basics like asking how to prioritize items against each other - but a little knowledge accelerated this part.&amp;nbsp; You'll see later how I needed to encourage Copilot to do better...&lt;/P&gt;
&lt;P&gt;The answer from Copilot was that it needed to engage overdrive to solve this - or more accurately, to use start advanced analysis:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;I clicked Start advanced analysis, which created a new sheet then I could see a few cells that had PY in them so knew it was starting to do things with Python.&amp;nbsp; After creating a DataFrame (the construct the Python library called pandas uses for handling numeric arrays) and copying in my data, which it identified correctly it came up with some Python to do what I asked - and soon had a result, not 42, but 0.031127.&amp;nbsp; Project shows the consistency ratio as a percentage (around 97% for this analysis), so I did ask Copilot if this was an ok value for consistency ratio and it suggested anything under 0.1 was good.&amp;nbsp; It didn't initially show me the individual priorities, so I had to ask Copilot &lt;EM&gt;Can you show the priorities for each driver?&amp;nbsp;&amp;nbsp;&lt;/EM&gt;The Analysis1 sheet that Copilot was working in then looked like this:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;I'll add to the foot of this post some of the responses and code generated along the way.&amp;nbsp; The beauty of having the Python code here is you could take it and use it elsewhere.&amp;nbsp; You want to create an Azure Function in Python that would take a call from a Power App and return the priorities?&amp;nbsp; This would be a good starting point - just take it over to VS Code.&amp;nbsp; Or just use Copilot in Github.&amp;nbsp; So many possibilities.&lt;/P&gt;
&lt;P&gt;So how are we doing?&amp;nbsp; Those numbers look good.&amp;nbsp; Trust me, the A was the top driver, E 2nd and then D, B, C.&amp;nbsp; And the percentages are only differing in the 3rd decimal place.&amp;nbsp; I call that pretty close.&lt;/P&gt;
&lt;H3&gt;Applying the priorities to plans&lt;/H3&gt;
&lt;P&gt;In Project Online to get the priorities for the plans, a similar approach is taken as for prioritizing the drivers, saying for each one what impact it will have for the driver concerned:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Behind the scenes, as per the white paper, these levels of None to Extreme can be represented by number 0,1,3,6 and 9.&amp;nbsp; In my Projects sheet I show this same data, for consumption by Copilot and Python:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Then I asked Copilot:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Can you then apply these driver priorities to the Projects on the Projects sheet, in rows which are aligned to the drivers A to E referenced by column using the Ranking of values 0,1,3,6 and 9. 9 is a higher alignment. The aim is to prioritise the projects that have the most alignment with the most important drivers.&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;It certainly gave a result here, but I need to see it normalized to check if the % matched project - this was the Analysis1 sheet at this point before they were normalized, where you can also see some of the Python in cell A51 that was doing the work:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Slight break here for some gotches I hit along the way.&amp;nbsp; I did see issues a couple of times where Copilot would think there were only 5 plans, as it assumed a similar shape for the dataframe from the driver analysis.&amp;nbsp; It got things right this time, maybe as I'd changed focus to the Projects sheet.&amp;nbsp; Anyway, before I'd just give it a nudge and tell if what the project dataframe should be and all was well.&amp;nbsp; Another gotcha is that I am writing the blog as I go along - and Copilot seemed to lose interest due to the long gap between prompts...&amp;nbsp; It did pick up again without having to start over.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And the normalized result - looking good with just some differences in the 2nd decimal from the result in Project Online:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Budgets, and Mandatory Projects&lt;/H3&gt;
&lt;P&gt;The next step was to get Copilot to look at my Budget sheet.&amp;nbsp; I did try to have the driver rankings and budgets all in the same sheet, but it seemed to be less trouble to keep things clean and have these separate.&amp;nbsp; My next prompt for Copilot:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Looking at the Budgets sheet, it would cost over $2.5M to execute all projects. If I have just $1.5M which projects should I execute based on the priorities calculated?&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;And Copilots response?&amp;nbsp; The first what was on the Analysis1 sheet (I added the total) and then what was returned in the chat area (and I haven't really been telling that side of the story, but it has kept me informed of what it was doing and the resultant DataFrames, as well as showing the Python being used (see the foot of this blog post):&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Based on the priorities calculated and the $1.5M budget constraint, the following projects should be executed:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Shared GPS devices for transportation&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Helmet with Integrated Sunvisor&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Voice Recognition Product&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Aquisition Target Analysis&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;E-campaign to Bloggers&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Catalog Publishing&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Removable protective lining&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Print Advertising Campaign System&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;This is all well and good, but it has a couple of problems.&amp;nbsp; Firslty there are a couple of projects that I really must do, even though they don't rank highly against these business drivers, but they keep the company running (the ones showing Force-in, on the Proejct Online screenshot above).&amp;nbsp; And after I've solved that issue - these projects aren't delivering the best strategic value I could possibly obtain.&amp;nbsp; They are just the highest ranked plans chosen until the money runs out.&amp;nbsp; The helmet project is very expensive, and even if it does rank very high, could the money be better spent to give higher strategic value?&lt;/P&gt;
&lt;P&gt;Let sort out the projects I need to do first;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;If I absolutely must execute the Operations Management plan, and the Internal Application Customization plan, which projects would also fit in the $1.5M budget?&lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Copilot responded:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;To include the Operations Management and Internal Application Customization plans within the $1.5M budget, I will first subtract their costs from the total budget. Then, I will select the highest priority projects that fit within the remaining budget. I will write Python code to perform this selection.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Including the Operations Management and Internal Application Customization plans, the following projects fit within the $1.5M budget:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Shared GPS devices for transportation&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Helmet with Integrated Sunvisor&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Voice Recognition Product&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;E-campaign to Bloggers&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Operations Management&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Internal Application Customization&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Cool, but how to get a better optimization?&amp;nbsp; Maybe Copilot has some ideas?&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;The method used here just adds the top priority plan until the budget is reached. Is there any other algorithm that could be used to optimize the strategic value by trying different combinations of plans together?&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;At this point, and something similar had popped up at other times, I'd see Copilot get and error, then try something else instead.&amp;nbsp; Cool!&amp;nbsp; Before I'd seen it reference the error, work out why it got an error, then try another approach.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;This time however it did appear to be stuck.&amp;nbsp; Looking at the code it seems like it is using Normalized_Score when it doesn't have that in the DataFrame it is considering.&amp;nbsp; Of course I could have debugged the Python myself (eventually...).&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Re-thinking the prompts from the beginning&lt;/H3&gt;
&lt;P&gt;Instead, I reviewed the responses leading up to this to see where Copilot was headed:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;A more sophisticated approach to optimize the strategic value while considering different combinations of plans is to use a knapsack algorithm. The knapsack problem is a classic optimization problem that can help in selecting the best combination of projects to maximize the total value within a given budget. I will write Python code to implement the knapsack algorithm to find the optimal combination of projects.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Maybe I could give it a bit of a push in the right direction.&amp;nbsp; I cleaned up my sheets so that no extraneous information existed (I also had a 'benefits' value on my budget sheet which I wasn't using) and crafted a set of prompts to start from the beginning, not bothering with some of the normalizing steps, which I'd only needed to validate results against my known percentages.&amp;nbsp; I also put the final selection in a single prompt, giving it the budget, the clue it should use knapsack and also tell it my mandatory plans.&amp;nbsp; These were my 3 final prompts:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Can you write some Python code to set a ranking for the drivers A, B, C, D and E on the business drivers sheet based on the pair-wise comparison using the Analytic Hierarchy Process. Can you give a consistency ratio for the analysis and display the priorities calculated for each driver.&lt;/EM&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;EM&gt;Can you then apply these driver priorities to the Projects on the Projects sheet, in rows which are aligned to the drivers A to E referenced by column using the Ranking of values 0,1,3,6 and 9. 9 is a higher alignment. The aim is to prioritise the projects that have the most alignment with the most important drivers.&lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Looking at the Budgets sheet, can you use the knapsack approach to choose the optimal set of projects to maximize strategic value, based on a strict budget of $1.5M which should not be exceeded and also ensuring that the mandatory projects, Operations Management plan and Internal Application Customization plan are included. Do not include fractions of projects, all or nothing.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The 'partial project' piece was added after seeing my budget apparently exceeded, but on closer inspection of the results and DataFrame, it had selected 0.8 of a project to consume the final $120K.&amp;nbsp; Pretty sure that for most projects you don't get 80% of the strategic impact for doing 80% of the plan...&amp;nbsp; But it had been easy to see what it was doing so debugging wasn't a problem and modifying the prompt usually got things back on track.&amp;nbsp; I also had the best experience when the sheet that contained the data needed for each step was active when the prompt was entered, otherwise sometimes the DataFrames could be the wrong shape.&amp;nbsp; I'd see it only considering 5 projects, if the sheet with 5 drivers was still active.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Final Result!&lt;/H3&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A perfect match to the $1.38M that Project Online had selected - see the screenshot right at the start.&amp;nbsp; I haven't shown here, but I did quiz Copilot on the measure of strategic value compared to the maximum I could have achieved - and got a result around 70%, which also matched that shown by Project.&amp;nbsp; I did sometimes see that even with the prompt saying complete projects only, I did sometimes still see the budget met by adding 80% of the next highest priority plan.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Final Thoughts&lt;/H3&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Comparing to the results from Project Online allowed me to easily verify if I was getting the results I was expecting, giving me confidence I could use the same prompts against a different data set and still make a good selection.&amp;nbsp; To take out more of the uncertainty, rather than using Copilot each time, it would make sense to use my 'trusted and verified' Python code - although it might need a little work to allow it to work with variable numbers of drivers. Tip - the value of the variable RI (Random Index) is different for different sizes of matrix.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;What are the different values of RI, Random Index, used when carrying out AHP analysis on different sized matrices?&lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;The Random Index (RI) values used in the Analytic Hierarchy Process (AHP) analysis for different sized matrices are as follows:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;For a 1x1 matrix: RI = 0.00&lt;/LI&gt;
&lt;LI&gt;For a 2x2 matrix: RI = 0.00&lt;/LI&gt;
&lt;LI&gt;For a 3x3 matrix: RI = 0.58&lt;/LI&gt;
&lt;LI&gt;For a 4x4 matrix: RI = 0.90&lt;/LI&gt;
&lt;LI&gt;For a 5x5 matrix: RI = 1.12&lt;/LI&gt;
&lt;LI&gt;For a 6x6 matrix: RI = 1.24&lt;/LI&gt;
&lt;LI&gt;For a 7x7 matrix: RI = 1.32&lt;/LI&gt;
&lt;LI&gt;For an 8x8 matrix: RI = 1.41&lt;/LI&gt;
&lt;LI&gt;For a 9x9 matrix: RI = 1.45&lt;/LI&gt;
&lt;LI&gt;For a 10x10 matrix: RI = 1.49&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;These values are used to determine the consistency of the pairwise comparison matrix in AHP.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks Copilot!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Appendix&lt;/H3&gt;
&lt;P&gt;The following contains the responses to my final 3 prompts - and the Python generated.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Responses to Prompt 1&lt;/H2&gt;
&lt;P&gt;To rank the drivers using the Analytic Hierarchy Process (AHP), the pairwise comparison matrix will be used to calculate the priority vector and the consistency ratio. The steps involved are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Normalize the pairwise comparison matrix.&lt;/LI&gt;
&lt;LI&gt;Calculate the priority vector (eigenvector).&lt;/LI&gt;
&lt;LI&gt;Compute the consistency index (CI) and consistency ratio (CR). I will write Python code to perform these steps and display the priorities and consistency ratio.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;"=PY(""#Calculate priorities and consistency ratio using AHP&lt;/P&gt;
&lt;P&gt;from numpy.linalg import eig&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Extract the pairwise comparison matrix&lt;/P&gt;
&lt;P&gt;pairwise_matrix = Business_Drivers_A1_F6_df.iloc[:, 1:].values&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Normalize the pairwise comparison matrix&lt;/P&gt;
&lt;P&gt;column_sums = pairwise_matrix.sum(axis=0)&lt;/P&gt;
&lt;P&gt;normalized_matrix = pairwise_matrix / column_sums&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Calculate the priority vector (eigenvector)&lt;/P&gt;
&lt;P&gt;priority_vector = normalized_matrix.mean(axis=1)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Calculate the consistency index (CI)&lt;/P&gt;
&lt;P&gt;eigenvalues, _ = eig(pairwise_matrix)&lt;/P&gt;
&lt;P&gt;max_eigenvalue = max(eigenvalues.real)&lt;/P&gt;
&lt;P&gt;CI = (max_eigenvalue - len(priority_vector)) / (len(priority_vector) - 1)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Calculate the consistency ratio (CR)&lt;/P&gt;
&lt;P&gt;RI = 1.12&amp;nbsp; # Random Index for a 5x5 matrix&lt;/P&gt;
&lt;P&gt;CR = CI / RI&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Create a DataFrame to display the priorities&lt;/P&gt;
&lt;P&gt;priorities_df = pd.DataFrame({&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Driver': Business_Drivers_A1_F6_df['Drivers'],&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Priority': priority_vector&lt;/P&gt;
&lt;P&gt;})&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;priorities_df, CR"",1)"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The priorities for each driver have been calculated using the Analytic Hierarchy Process (AHP). The consistency ratio (CR) for the analysis is approximately 0.0312, indicating a consistent pairwise comparison. The priorities for each driver are displayed in the DataFrame on the sheet.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Responses to Prompt 2&lt;/H2&gt;
&lt;P&gt;o prioritize the projects based on the driver priorities, the following steps will be taken:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Multiply each project's alignment score by the corresponding driver priority.&lt;/LI&gt;
&lt;LI&gt;Sum the weighted scores for each project to get a total score.&lt;/LI&gt;
&lt;LI&gt;Rank the projects based on their total scores. I will write Python code to perform these steps and display the prioritized projects.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;"=PY(""#Rank projects based on driver priorities&lt;/P&gt;
&lt;P&gt;# Extract the priorities from the previous calculation&lt;/P&gt;
&lt;P&gt;priorities = priorities_df['Priority'].values&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Multiply each project's alignment score by the corresponding driver priority&lt;/P&gt;
&lt;P&gt;weighted_scores = Projects_A1_F14_df.iloc[:, 1:].values * priorities&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Sum the weighted scores for each project to get a total score&lt;/P&gt;
&lt;P&gt;Projects_A1_F14_df['Total_Score'] = weighted_scores.sum(axis=1)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Rank the projects based on their total scores&lt;/P&gt;
&lt;P&gt;Projects_A1_F14_df['Rank'] = Projects_A1_F14_df['Total_Score'].rank(ascending=False)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Sort the projects by rank&lt;/P&gt;
&lt;P&gt;ranked_projects_df = Projects_A1_F14_df.sort_values(by='Rank')&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ranked_projects_df"",1)"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The projects have been ranked based on their alignment with the driver priorities. The ranked projects are displayed in the DataFrame on the sheet, with the highest priority project being 'Shared GPS devices for transportation'.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Responses to Prompt 3&lt;/H2&gt;
&lt;P&gt;To solve this problem using the knapsack approach, the following steps will be taken:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Extract the budget and strategic value for each project from the Budgets sheet.&lt;/LI&gt;
&lt;LI&gt;Ensure that the mandatory projects are included in the selection.&lt;/LI&gt;
&lt;LI&gt;Use the knapsack algorithm to select the optimal set of projects that maximizes the total strategic value without exceeding the budget. I will write Python code to perform these steps and display the selected projects.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;"=PY(""#Select optimal set of projects using knapsack approach&lt;/P&gt;
&lt;P&gt;# Extract the budget and strategic value for each project&lt;/P&gt;
&lt;P&gt;budgets = Budgets_A1_B15_df['Budget'].values&lt;/P&gt;
&lt;P&gt;strategic_values = Projects_A1_F14_df['Total_Score'].values&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Ensure that the mandatory projects are included&lt;/P&gt;
&lt;P&gt;mandatory_projects = ['Operations Management', 'Internal Application Customization']&lt;/P&gt;
&lt;P&gt;mandatory_indices = [Budgets_A1_B15_df[Budgets_A1_B15_df['Project'] == project].index[0] for project in mandatory_projects]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Define the knapsack problem&lt;/P&gt;
&lt;P&gt;num_projects = len(budgets)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Initialize the DP table&lt;/P&gt;
&lt;P&gt;dp = [[0 for _ in range(1500001)] for _ in range(num_projects + 1)]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Fill the DP table&lt;/P&gt;
&lt;P&gt;for i in range(1, num_projects + 1):&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for w in range(1500001):&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if i - 1 in mandatory_indices:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dp[i][w] = dp[i - 1][w - budgets[i - 1]] + strategic_values[i - 1] if w &amp;gt;= budgets[i - 1] else dp[i - 1][w]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if w &amp;gt;= budgets[i - 1]:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - budgets[i - 1]] + strategic_values[i - 1])&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dp[i][w] = dp[i - 1][w]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Find the selected projects&lt;/P&gt;
&lt;P&gt;selected_projects = []&lt;/P&gt;
&lt;P&gt;w = 1500000&lt;/P&gt;
&lt;P&gt;for i in range(num_projects, 0, -1):&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if dp[i][w] != dp[i - 1][w]:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; selected_projects.append(i - 1)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; w -= budgets[i - 1]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Ensure mandatory projects are included&lt;/P&gt;
&lt;P&gt;for idx in mandatory_indices:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if idx not in selected_projects:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; selected_projects.append(idx)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# Create a DataFrame to display the selected projects&lt;/P&gt;
&lt;P&gt;selected_projects_df = Budgets_A1_B15_df.iloc[selected_projects]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;selected_projects_df"",1)"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The optimal set of projects has been selected using the knapsack approach, ensuring that the mandatory projects 'Operations Management' and 'Internal Application Customization' are included. The selected projects are displayed in the DataFrame on the sheet.&lt;/P&gt;</description>
      <pubDate>Wed, 25 Sep 2024 17:45:09 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/project-selection-portfolio-analysis-using-copilot-in-excel-with/ba-p/4251595</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2024-09-25T17:45:09Z</dc:date>
    </item>
    <item>
      <title>Project Online: SharePoint Custom Script control impact</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/project-online-sharepoint-custom-script-control-impact/ba-p/4225571</link>
      <description>&lt;P&gt;In February 2024, Message Center post MC 714186 detailed changes coming to Custom Script settings in SharePoint Online.&amp;nbsp; The MC post did not specifically call out Project Web App sites in Project Online, but it is impacted by these changes in a number of ways.&amp;nbsp; There are settings to re-enable these features which will be explained later, but the typical issues reported by customers are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Project Web App web parts are no longer listed as a web part Category&lt;/LI&gt;
&lt;LI&gt;Save site as template is no longer available&lt;/LI&gt;
&lt;LI&gt;Script Editor and Content Editor parts no longer available to add to a page (these are often used to add functionality to Project Web App)&lt;/LI&gt;
&lt;LI&gt;Custom Fields added to Project Detail Pages (PDPs) do not ‘stick’ and although it looks like you added them, they are not present when you stop editing&lt;/LI&gt;
&lt;LI&gt;Reports of 3&lt;SUP&gt;rd&lt;/SUP&gt; party applications that automate steps like those above, have also been reported&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Apart from the last bullet point, &lt;STRONG&gt;nothing breaks or stops working&lt;/STRONG&gt;, just the steps to use these features will require an additional action to ‘unblock’ these scenarios. If you use custom script today, maybe a button that is set to publish all your projects, then this will still work, regardless of the settings described here.&amp;nbsp; These settings only apply to changing things - for example if the code behind the button needed to be edited.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Steps to re-enable above features&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Until November 2024 a single PowerShell command can be run which will ensure that any unblocking will last until November 2024.&amp;nbsp; After that time, and if you do not run that script, you will need to unblock for each 24-hour period that you want to carry out any of the listed actions.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A tenant admin can choose to run a new PowerShell command in the SharePoint Management shell version 16.0.24524.12000 or later, after executing Connect-SPOService:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;NOTE:&lt;/STRONG&gt; When implementing this make sure you understand the&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/sharepoint/security-considerations-of-allowing-custom-script" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;security implications&lt;/STRONG&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connect-SPOService -Url https://&amp;lt;tenantname&amp;gt;-admin.sharepoint.com&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set-SPOTenant -DelayDenyAddAndCustomizePagesEnforcement $True&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Even if the admin chooses to set this option, they will still need to proceed with the next steps to allow any of the changes bulleted at the top of this article to be carried out.&amp;nbsp; The&amp;nbsp;&lt;EM&gt;DelayDenyAddAndCustomizePagesEnforcement&lt;/EM&gt;&amp;nbsp; just avoids the setting getting revert after 24 hours.&amp;nbsp; These steps will require a SharePoint Administrator to either run a PowerShell script or make a setting change in the SharePoint Admin Center.&amp;nbsp; Be aware that the PWA admin, even though a site collection admin, may not be a SharePoint Admin.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Via PowerShell&lt;/STRONG&gt;, for the PWA site they would need to run (after Connect-SPOService):&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set-SPOSite &amp;lt;SiteURL&amp;gt; -DenyAddAndCustomizePages 0&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;where &amp;lt;SiteURL&amp;gt; is your PWA site.&amp;nbsp; Once complete, you should be able to carry out the options as usual.&amp;nbsp; A quick check is to see if &lt;EM&gt;Save site as a template&lt;/EM&gt; is present again in Site Settings.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Via SharePoint Admin Center&lt;/STRONG&gt;, the admin would navigate to Sites, Active Sites, browse/search for the site and click the site name.&amp;nbsp; In the pane that opens, navigating to the Settings tab will show an option for Custom scripts, which will say Blocked and have an option to Edit underneath.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Clicking Edit shows an option to set to Allowed rather than Blocked, along with some warning text, and a reminder that this will revert in 24 hours.&amp;nbsp; This reminder shows even if the script to stop the reversion has been executed.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Clicking Save brings up further warnings, a link to the security implications article referenced above and requests for the change to be Confirmed.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The Active Sites list now has an additional column to expose the &lt;EM&gt;Custom script&lt;/EM&gt; settings, along with a useful new filter than shows all sites where custom scripts are set to &lt;EM&gt;Allowed&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The SharePoint admin could also choose to revert the changes, either through the UI, or via PowerShell, once the changes had been completed, rather than wait for the automatic reversion after 24 hours.&amp;nbsp; That probably isn't a bad idea.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;This change has been introduced because of concerns over what custom script can do, and the scenarios this affects are not usually 'every day' occurrences within PWA.&amp;nbsp; However, I appreciate that this would require a SharePoint admin to get involved, which makes it more than a minor inconvenience.&amp;nbsp; &lt;/STRONG&gt;We are still exploring what other options we might have here, but best to plan to need to involve the SharePoint Admins when doing these kinds of edits in future.&amp;nbsp; Although the issue uses the term 'custom script', many of the options that are blocked may not look like you are really doing any custom scripting - but it is more about what you 'could' be doing.&amp;nbsp; For example, editing a PDP to just add an Enterprise Custom Field doesn't add any custom script - but while editing you 'could' add a script editor web part that contains script.&amp;nbsp; It is more to ensure a conscious decision is being made about these actions.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We are also working on a Learn.Microsoft.com article which should be out shortly.&amp;nbsp; We should certainly have ensured the Message Center post also included Project Online explicitly, so sorry for the lack of communication and confusion around these changes.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Not applicable to PWA, but for reference.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;One confusion is that the SharePoint Message Center post and subsequent article start off talking about the following section with&amp;nbsp;the settings to allow users to run custom scripts on OneDrive and self-service created sites.&amp;nbsp; Project Web App does not come under this category of site, so this setting does not need to be enabled for the above scenarios to work.&amp;nbsp; The steps above are all that are needed. The settings page is also changing with the prevention on personal sites no longer being allowed to be changed.&amp;nbsp; It may look like this:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Or the latest screenshot of SharePoint Classic settings section on Custom Script looks like this one.&amp;nbsp; Either way, this doesn't apply to Project Online sites.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 22 Aug 2024 15:38:40 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/project-online-sharepoint-custom-script-control-impact/ba-p/4225571</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2024-08-22T15:38:40Z</dc:date>
    </item>
    <item>
      <title>Planner: Copy a plan to a premium plan</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/planner-copy-a-plan-to-a-premium-plan/ba-p/4135114</link>
      <description>&lt;P&gt;When you use the trial feature for premium plans you can promote a plan to be a premium plan a.k.a. Project for the web project, to get the additional features of timelines, goals, Copilot and more!&amp;nbsp; This feature will also be coming to new Planner for all basic plans, but probably not until the summer 2024.&amp;nbsp; For now, there is a work around using a specific Url with the Plan ID of the basic plan added - then the magic happens, and you get a premium plan (some limitations apply - see the docs linked below).&lt;/P&gt;
&lt;P&gt;A basic Planner plan you a board view and a grid view, and some charts, but if you need more then time to look at making a premium plan from it.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The workaround until the in-app feature becomes available is to craft a Url that starts with your Project for the web Url, including locale and tenant, adds some specific parameters and adds on the plan id.&amp;nbsp; It will look something like this:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" data-unlink="true"&gt;https://project.microsoft.com/&amp;lt;your tenant name&amp;gt;.onmicrosoft.com/en-US#/hubnew?importPlanId=&amp;lt;your Plan ID&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hopefully you know your tenant name, or just navigate to project.microsoft.com and it should complete the Url up to the locale part (en-US in the able example) once you have signed in.&amp;nbsp; To this you add the&amp;nbsp;#/hubnew?importPlanId= part and then the plan id.&amp;nbsp; It isn't easy to find the plan id in Teams (but if you know your way around F12 Dev Tools you can find it) but easier to just look for your plan at tasks.office.com and open it - then the Url will contain your plan id.&amp;nbsp; In my case the Url in Planner is:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" data-unlink="true"&gt;https://tasks.office.com/brismith.onmicrosoft.com/en-US/Home/Planner/#/plantaskboard?groupId=d132c3ce-e77b-7bfc-a703-3aceaed05a37&amp;amp;planId=q_E7IvbSGkCD1f537UPBUGUADys7&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;and the final part is the plan id - after planId= - so&amp;nbsp;q_E7IvbSGkCD1f537UPBUGUADys7&lt;/P&gt;
&lt;P&gt;Adding this to the project Url and the parameter part gives me a full Url of:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" data-unlink="true"&gt;https://project.microsoft.com/brismith.onmicrosoft.com/en-US#/hubnew?importPlanId=q_E7IvbSGkCD1f537UPBUGUADys7&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once I have this, I can paste it into my browser, log in if I don't already have an active session, then the magic starts!&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;After a short while you will see this screen briefly:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;then you will see the background change to your new premium plan and the dialog changes to:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Be sure to review the document - the "Learn more" link goes to this article&amp;nbsp;&lt;A href="https://prod.support.services.microsoft.com/en-us/office/import-a-plan-into-a-project-for-the-web-016f9e4d-28c6-4f61-a1b1-82187185977d" target="_blank" rel="noopener"&gt;https://prod.support.services.microsoft.com/en-us/office/import-a-plan-into-a-project-for-the-web-016f9e4d-28c6-4f61-a1b1-82187185977d&lt;/A&gt;&amp;nbsp;and probably the most important section relates to the task limits.&amp;nbsp; Only 950 tasks will be imported into your premium plan.&amp;nbsp; See the other sections too to be sure you get what you need:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;But that's it.&amp;nbsp; Hopefully that will help until the UI has an option to import basic Planner plans to the premium experience so you can then use all of the extra features of premium plans:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;and use it in new Planner too - under My Plans:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Any questions - add them below and I'll get back to you.&lt;/P&gt;</description>
      <pubDate>Wed, 08 May 2024 21:04:31 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/planner-copy-a-plan-to-a-premium-plan/ba-p/4135114</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2024-05-08T21:04:31Z</dc:date>
    </item>
    <item>
      <title>Using Power Automate for Project Lifecycle Workflows in Project Online – Part 3</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/using-power-automate-for-project-lifecycle-workflows-in-project/ba-p/4111518</link>
      <description>&lt;H3&gt;Using Dataverse to store workflow status&lt;/H3&gt;
&lt;P&gt;In this 3&lt;SUP&gt;rd&lt;/SUP&gt; episode in the series, I look at using Dataverse, rather than a SharePoint list, to store the workflow information regarding stage and status.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;First, I created a new table and decided to use a primary key made up of the stage and GUID of the project.&amp;nbsp; Seemed like a good idea at the time, but with Dataverse being driven by Row IDs I’m not sure if it makes sense.&amp;nbsp; I do also capture quite a few additional pieces of information compared to the earlier example in the SharePoint List – such as the Flow ID, Instance Id and the Flow Name, which I don’t use in this example, but for scenarios where we might need to resubmit a flow, for a long running workflow that had been disabled, might come in handy.&lt;/P&gt;
&lt;P&gt;These are the fields – excluding the usual ones that Dataverse adds for me:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The Flow follows the same structure as in the first article, initializing variables for fields I’ll use later, including the Row Id for the 3 stage rows I’ll be adding and updating.&amp;nbsp; I check that the EPT is the one this workflow will process and jump into the grabbing of workflow information and creating my rows for the stages.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Getting the workflow information gets the workflow() input, then can be parsed using the output as a sample for the schema, then the name, flowDisplayName and id can be put into my variables.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;When I add a new row for Propose, which is my first stage, I can populate some of the flow information from the above variables into my Workflow_Statuses table, as well as putting in my primary key and project name.&amp;nbsp; I also set the Stage to Propose and Status to Not Started.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I do a similar setup for the Review and Finished stages.&lt;/P&gt;
&lt;P&gt;My Switch and Do Until are very similar to those from Part 1, with some different options there to get my Row ID and get it into a suitable form to use as the Row ID in my Update Dataverse action.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I’m sure I could have done this much more efficiently than the way I ended up – but wanted to get this posted rather than spend time re-working it.&amp;nbsp; The steps use the OData Id from the initial row creation action, which I then trim the GUID out with a compose:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; First(&amp;nbsp;Split(&amp;nbsp;Last(&amp;nbsp;Split(variables('ProposeRowId'),'(')),')'))&lt;/P&gt;
&lt;P&gt;And the output from that trim is put back into my variable.&amp;nbsp; Once I have the GUID I can use that as the Row ID to make a row update, and for all the fields I leave blank they retain the values set earlier:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That is pretty much it.&amp;nbsp; Rinse and repeat, for the various approvals and stage changes to update the rows as things progress.&amp;nbsp; In terms of displaying the status, it really depends on where you want to keep your users.&amp;nbsp; You could expose in a web part in SharePoint (I found a few examples online) or you could perhaps use Adaptive Cards similar to those used in Part 2 - or a Power App?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;One conversation we had internally about a possible “Part X” in this series related to “migration” of workflows on projects running in SharePoint 2013 workflows to a new workflow built with Power Automate.&amp;nbsp; Although I can see this would have some value, particularly when very many projects are involved, I felt it may also inhibit you from getting the best possible experience in Power Automate as just matching what you have today, may not be what you really want for the future.&amp;nbsp; I’d love to hear your thoughts.&amp;nbsp; Would you plan to continue current workflows until the projects are finished (assuming they end before April 2&lt;SUP&gt;nd&lt;/SUP&gt; 2026) and just start new plans with the new workflows?&amp;nbsp; Or would you need to migrate in-flight projects?&amp;nbsp; Anyone looking at having their workflows driven by a 'proxy' project in Project for the web, with the execution happening in Project Online?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 10 Apr 2024 22:17:25 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/using-power-automate-for-project-lifecycle-workflows-in-project/ba-p/4111518</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2024-04-10T22:17:25Z</dc:date>
    </item>
    <item>
      <title>Using Power Automate for Project Lifecycle Workflows in Project Online – Part 2</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/using-power-automate-for-project-lifecycle-workflows-in-project/ba-p/4080039</link>
      <description>&lt;H1&gt;Using Power Automate for Project Lifecycle Workflows in Project Online – Part 2&lt;/H1&gt;
&lt;H2&gt;Background to the requirement to move to Power Automate&lt;/H2&gt;
&lt;P&gt;One great question from part 1, that was raised on LinkedIn by Adem, was &lt;STRONG&gt;Shouldn’t we be using Project for the web?&amp;nbsp; &lt;/STRONG&gt;My answer – of course you should!&amp;nbsp; But there will be customers where the features they need aren’t quite there yet, or even if they are, Project Online just works and they have other business priorities right now, and don’t feel the need to change.&amp;nbsp; As I mentioned in part 1, going the Power Automate route does at least get you heading in the right direction.&lt;/P&gt;
&lt;P&gt;This 2&lt;SUP&gt;nd&lt;/SUP&gt; article describes ways customers can obtain similar functionality to their current Project Online workflows using Power Automate, and specifically how they can interact with custom fields from Project Online from a flow.&amp;nbsp; In this case I’m using Adaptive Card technology and Teams to gather the information, as an alternative to the Project Detail Pages used with current workflows.&amp;nbsp; This is a great example of how Power Automate has greater abilities to integrate across the M365 ecosystem – and it can go beyond too – with plenty of external connectors.&lt;/P&gt;
&lt;H2&gt;Starting a workflow&lt;/H2&gt;
&lt;P&gt;This 2&lt;SUP&gt;nd&lt;/SUP&gt; document concentrates more on the capture and setting of project details into custom fields – and my example starts from creating a project and uses the same techniques as in the Part 1 article.&amp;nbsp; In this case I’m not checking EPT values – just getting right on with the process.&lt;/P&gt;
&lt;H2&gt;Capturing Data in Adaptive Cards in Teams and persisting these to Project Online Custom Fields&lt;/H2&gt;
&lt;P&gt;The approach I present here is to trigger the flow on project create, set various variables, then check in and publish the plan, so that I have access to it from the flow.&amp;nbsp; I send e-mail out at this stage too.&amp;nbsp; The next step uses a Teams &lt;STRONG&gt;Post adaptive card and wait for a response &lt;/STRONG&gt;action to place an adaptive card into a specific channel.&amp;nbsp; Adaptive Cards are a platform-agnostic method for sharing and displaying information without the complexity of customizing CSS or HTML.&amp;nbsp;They are authored in JSON format and automatically transform into native UI within Teams, making them ideal for consistent information exchange between Teams and other services.&amp;nbsp; The JSON returned from this call can be parsed and then the results used to set variables as required, or used directly within a REST call to SharePoint to set the values in the Project Online custom fields (after first checking out the project).&amp;nbsp; I’ve chosen here to add a cost value, a multiline text value and also to set a specific lookup table (LU) value – just to cover the different approaches required.&amp;nbsp; The final steps then check-in and publish the project.&amp;nbsp; I have a couple of delays too – as some of these jobs are queued and I’m not checking they complete – just waiting a bit.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Let’s get started!&lt;/H3&gt;
&lt;P&gt;The variables I’m setting here are for the internal names of the custom fields (CF) I’m going to be setting.&amp;nbsp; It is easy enough to find the GUID that represents the CF, just open up the CF and look at the Url and grab the GUID.&amp;nbsp; But the internal name isn’t just the GUID.&amp;nbsp; It is the GUID stripped on the dashes, then prefixed with Custom_.&amp;nbsp; I set variables for the &lt;STRONG&gt;Division Lookup&lt;/STRONG&gt; &amp;nbsp;CF (LU), the &lt;STRONG&gt;Cost&lt;/STRONG&gt; and &lt;STRONG&gt;Goal&lt;/STRONG&gt; CF, that contain their internal names and also set a variable for the &lt;STRONG&gt;Division LU&lt;/STRONG&gt; value, which will be chosen from the adaptive card (or at least the readable version will be chosen, and that will also get me the GUID).&amp;nbsp; I have manually hard-coded the internal names here, but later, when I get the GUID for the specific lookup table member, I do that using an expression.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The remainder of this flow looks like this:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The check-in and publish just needs the PWA Url (I could have set this as a variable, as I use it in a few places…) and the Project ID, which was obtained as output from the trigger that feeds of the new project creation:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;So what is this Adaptive Card stuff all about?&lt;/H3&gt;
&lt;P&gt;If you aren’t familiar with Adaptive Cards, then this is a good place to start - &lt;A href="https://learn.microsoft.com/en-us/adaptive-cards/" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/adaptive-cards/&lt;/A&gt; The next few steps in this workflow need the most explanation, and I’m also hoping some tooling could be built around this as it shouldn’t be too difficult to decide which custom fields you wish to work with, and then the JSON for the Adaptive Card, the schema for parsing, and the dictionary for setting the fields in the REST call could all be generated.&amp;nbsp; A project (and possible blog post) for another day…&amp;nbsp; The first action in this part of the process is the &lt;STRONG&gt;Post adaptive card and wait for a response. &lt;/STRONG&gt;&amp;nbsp;This has options on how to post and I use a &lt;STRONG&gt;Flow bot&lt;/STRONG&gt;, and &lt;STRONG&gt;post in a Channel&lt;/STRONG&gt;.&amp;nbsp; For the &lt;STRONG&gt;Message&lt;/STRONG&gt; the scrrenshot just contains the first part, so I’ll post the full text as you might want to copy/paste as a starting point for your own.&amp;nbsp; There is an Update message which pops up once the card is submitted and then the Team and Channel the post is going to are in the final two entry fields.&amp;nbsp; I’ve told a white lie with the Update message – the fields are not yet added to PJO, but they will be:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;\&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&lt;/P&gt;
&lt;P&gt;/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;What does the user see in Teams?&lt;/H3&gt;
&lt;P&gt;This is what it looks like in Teams after I’ve added some data (the IT field was chosen from a drop down):&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once I hit submit, it then comes back with:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As promised, here is the json that went into the full message.&amp;nbsp; Only the first and last few lines shows in the screenshot above.&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "$schema": "&lt;A href="http://adaptivecards.io/schemas/adaptive-card.json" target="_blank" rel="noopener"&gt;http://adaptivecards.io/schemas/adaptive-card.json&lt;/A&gt;",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "type": "AdaptiveCard",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "version": "1.3",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "body": [&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "type": "TextBlock",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "text": "Project Proposal: @{triggerOutputs()?['body/ProjectName']}",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "size": "large"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "type": "TextBlock",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "text": "Thank you for proposing @{triggerOutputs()?['body/ProjectName']}.&amp;nbsp; Please enter the estimated cost, the goals of the project and the delivery division below",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "wrap": true&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "type": "Input.Number",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "id": "Cost Value",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "placeholder": "Enter the proposed plan cost",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "label": "Enter cost",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "min": 1,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "max": 100000,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "value": 25000&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "type": "TextBlock",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "text": "Please enter the goals of this plan"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "type": "Input.Text",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "id": "Goals Value",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "placeholder": "Enter goals of this plan",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "maxLength": 500,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "isMultiline": true&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "type": "Input.ChoiceSet",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "id": "Division Value",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "style": "compact",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "label": "Which division would deliver this proposed project?",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "isMultiSelect": false,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "value": "1",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "choices": [&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "title": "IT",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "value": "b0e5895f-d3d1-ee11-9ebd-00155dd8354d"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "title": "HR",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "value": "b1e5895f-d3d1-ee11-9ebd-00155dd8354d"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "title": "Sales",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "value": "b2e5895f-d3d1-ee11-9ebd-00155dd8354d"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ],&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "actions": [&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "type": "Action.Submit",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "title": "Submit"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Handling the response from the card&lt;/H3&gt;
&lt;P&gt;What I did to make the next steps easier was to set the id of the fields to Cost Value, Goals Value and Division Value, to make the parsing more readable, and by setting the actual GUID values of the lookup table choices to their actual GUIDs (picked from the view source on the lookup tables page, and yes, a tool would be nice).&lt;/P&gt;
&lt;P&gt;By running a test of the flow at this point I can also see the returned json from the Adaptive Card – which can be plugged in to the &lt;STRONG&gt;Parse JSON&lt;/STRONG&gt; action as a sample to &lt;STRONG&gt;generate&lt;/STRONG&gt; the schema.&amp;nbsp; Just drill into a flow that has run to see the responses – I’ve scrolled down in this one. so you see the parts that are most interesting, but copying the whole body is useful in the next step:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The &lt;STRONG&gt;Parse JSON&lt;/STRONG&gt; takes the dynamic content Body of the previous step and puts it into objects that can be selected from the dynamic content for future steps.&amp;nbsp; By clicking on Generate from sample and then entering the json copied from the body above, you will get the right schema:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this example, the schema in full is:&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"object",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"properties":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"responseTime":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"responder":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"object",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"properties":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"objectId":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"tenantId":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"email":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"userPrincipalName":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"displayName":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"submitActionId":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"messageId":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"messageLink":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"data":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"object",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"properties":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Cost&amp;nbsp;Value":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Goals&amp;nbsp;Value":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Division&amp;nbsp;Value":&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"type":&amp;nbsp;"string"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;I then check-out the project, and delay for a few seconds.&amp;nbsp; The checkout isn’t queued, so should be quick, but just in case…:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The variables set up for the custom field internal names at the start of this workflow, have a similar counterpart in the lookup table entries.&amp;nbsp; The next step takes the value for the field chosen above, and converts to the internal name by prefixing with Entry_ and stripping out the dashes in the GUID.&amp;nbsp; The full expression in this case is &lt;STRONG&gt;replace(body('Parse_JSON')?['data']?['Division Value'],'-','')&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I could have set the full internal name in the Adaptive Card, but I either didn’t think of it at the time, or though it would be a good learning exercise to do it with this action.&amp;nbsp; You decide. &amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Pushing the captured information into Project Online&lt;/H3&gt;
&lt;P&gt;Now we have all the data we need for the &lt;STRONG&gt;REST &lt;/STRONG&gt;call to SharePoint, so we use a &lt;STRONG&gt;Send an HTTP request to SharePoint&lt;/STRONG&gt; action with the following settings:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You should be able to follow what’s happening here, but for clarity the customFieldDictionary JSON ends up looking something like this:&lt;/P&gt;
&lt;P&gt;{"customFieldDictionary":[&lt;/P&gt;
&lt;P&gt;{"Key":"Custom_1d3c4898d3d1ee11b50500155dd9564e","Value":"Entry_b0e5895fd3d1ee119ebd00155dd8354d","ValueType":"Edm.String"},&lt;/P&gt;
&lt;P&gt;{"Key":"Custom_af05782fd3d1ee1194fe00155dd83733","Value":"To give a good demonstration of the use of Adaptive Cards in Teams as a way to capture data of all kinds and feed into Project Online's custom fields.&lt;/P&gt;
&lt;P&gt;To make a good blog post with meaningful images","ValueType":"Edm.String"},&lt;/P&gt;
&lt;P&gt;{"Key":"Custom_897f7774d2d1ee118b3500155dd84a5c","Value":"85000","ValueType":"Edm.Double"}&lt;/P&gt;
&lt;P&gt;]}&lt;/P&gt;
&lt;P&gt;The first key is the lookup table entry for IT.&amp;nbsp; The second is my multiline field for Goals, and final key is the Cost.&lt;/P&gt;
&lt;P&gt;All that is left here is to have a short delay, then check in and publish:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I haven’t expanded these as we’ve used these steps before.&lt;/P&gt;
&lt;P&gt;If we pop over to Project Online, and the project that was created to kick off this workflow, we should see we now have some custom fields set in our Project Details PDP:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hopefully that all made sense – any questions then please do ask in the comments section.&amp;nbsp; As in part 1, we are eager to hear your experience if you have tried going to Power Automate so reach out to us at &lt;A href="mailto:PJOQueries@microsoft.com" target="_blank" rel="noopener"&gt;PJOQueries@microsoft.com&lt;/A&gt; and let us know.&lt;/P&gt;
&lt;P&gt;For customers who believe the above approach using Power Automate is not addressing their requirements, and are seeking extension of workflows for genuine scenarios, also please reach out to us on &lt;A href="mailto:PJOQueries@microsoft.com" target="_blank" rel="noopener"&gt;PJOQueries@microsoft.com&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The next part won’t follow quite so quickly, and I may cover a variation of the Worflow Status approach, but using Dataverse, or look at some tooling for generating the JSON, Schema and Dictionary used in this workflow.&lt;/P&gt;</description>
      <pubDate>Fri, 08 Mar 2024 21:30:25 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/using-power-automate-for-project-lifecycle-workflows-in-project/ba-p/4080039</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2024-03-08T21:30:25Z</dc:date>
    </item>
    <item>
      <title>Using Power Automate for Project Lifecycle Workflows in Project Online – Part 1</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/using-power-automate-for-project-lifecycle-workflows-in-project/ba-p/4077594</link>
      <description>&lt;H2&gt;Background to the requirement to move to Power Automate&lt;/H2&gt;
&lt;P&gt;SharePoint 2013 Workflows, the workflow technology used in SharePoint and Project Online is being d (&lt;A href="https://support.microsoft.com/en-us/office/sharepoint-2013-workflow-retirement-4613d9cf-69aa-40f7-b6bf-6e7831c9691e" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/office/sharepoint-2013-workflow-retirement-4613d9cf-69aa-40f7-b6bf-6e7831c9691e&lt;/A&gt;. ) At around the same time SharePoint Designer 2013, the only tool to easily manage Project Server workflows (they are called that, even in Project Online), is being &lt;A href="https://learn.microsoft.com/en-us/lifecycle/products/sharepoint-designer-2013" target="_blank" rel="noopener"&gt;deprecated&lt;/A&gt;(actually reaching end of life).&amp;nbsp; Although this is a little way off – there is another date to be aware of and that is April 2024, when new tenants in M365 will not have SharePoint 2013 workflows available.&amp;nbsp; This does not impact existing tenants who add a new PWA, or even add Project Online to an existing tenancy – just net new M365 customers.&amp;nbsp; The expectation is that most of these would not be familiar with, and so not miss, the ‘current’ workflow technology.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This article describes ways customers can obtain similar functionality to the current workflows by using Power Automate and concentrates on the flow through the stages and a potential way to record workflow status.&amp;nbsp; Although it may not give a 1 to 1 match in functionality – Power Automate can go way beyond what is possible in Project Online today.&lt;/P&gt;
&lt;H2&gt;Starting a workflow&lt;/H2&gt;
&lt;P&gt;The role of workflow in Project Online has always been to gather information about the project, usually populating some of this information into custom fields, then control the project lifecycle through its phases and stages, again gathering or displaying information along the way.&lt;/P&gt;
&lt;P&gt;In Power Automate there are project related triggers for Project Creation and Project Publishing.&amp;nbsp; (There are also Task and Resource related triggers – which could be used for functionality beyond what has previously been possible).&amp;nbsp; In this article I will concentrate on the &lt;STRONG&gt;When a new project is created (V2)&lt;/STRONG&gt;&amp;nbsp;although it may be that the &lt;STRONG&gt;When a project is published (V2)&lt;/STRONG&gt;&amp;nbsp;trigger may also be useful at certain points in a larger workflow.&amp;nbsp; An example I’m thinking of (untried) is using the publish trigger to enable an existing workflow that has become disabled due to exceeding a 30 day run period.&amp;nbsp; It could be that a trigger totally outside project could also be used.&lt;/P&gt;
&lt;P&gt;Companies could well have many EPTs, and many different workflows used across them – so an initial challenge would be to identify which workflow should run when a project is created.&amp;nbsp; The most straightforward way, but inefficient, is to have all the workflows triggered on &lt;STRONG&gt;create&lt;/STRONG&gt;&amp;nbsp;then each look to see if the specific project needs that workflow to run – checking ‘is this for my EPT?’.&lt;/P&gt;
&lt;P&gt;I will start with this approach, will enable the &lt;STRONG&gt;create&lt;/STRONG&gt;&amp;nbsp;trigger to check for a property value (EPT) before starting – which would be much more efficient.&lt;/P&gt;
&lt;P&gt;of a skeleton workflow (that doesn’t really do anything) is shown first, then I’ll walk through the detail of each step, then look at how the stages might be driven.&amp;nbsp; Most of the work is in the Condition action – I’ll open that up later.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Initializing Variables&lt;/H3&gt;
&lt;P&gt;In this example the &lt;STRONG&gt;create&lt;/STRONG&gt; trigger then initializes a variable &lt;STRONG&gt;IsWorkflowCompleted&lt;/STRONG&gt; to false.&amp;nbsp; This variable can then be set to true when the workflow is complete (checked in the &lt;STRONG&gt;Do Until&lt;/STRONG&gt; section).&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Several other variables are also initialized that get used later.&amp;nbsp; Power Automate needs all the initialize options at the top level.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Get the Enterprise Project Type (EPT)&lt;/H3&gt;
&lt;P&gt;After the initializations a SharePoint REST call is used to get the EPT details.&amp;nbsp; This action is&amp;nbsp;&lt;STRONG&gt;Send an HTTP request to SharePoint &lt;/STRONG&gt;and isn’t a Premium action – so is used in favor of the &lt;STRONG&gt;HTTP Request&lt;/STRONG&gt;&amp;nbsp;action. The action uses the site address of the PWA site, a GET method and the Uri field adds &lt;STRONG&gt;_api/ProjectServer/Projects('@{triggerOutputs()?['body/ProjectId']}')/EnterpriseProjectType&lt;/STRONG&gt; to the site – hence making a call to Project Online’s REST endpoint, with the GUID of the project inserted that is available from the trigger outputs.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is then parsed to make the elements of the response available.&amp;nbsp; To use the &lt;STRONG&gt;Generate from sample&lt;/STRONG&gt;&amp;nbsp;option to get the json schema – I simply ran a flow that performed the above action – then pulled the body from the output as my sample.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the &lt;STRONG&gt;Parse JSON&lt;/STRONG&gt; action click the &lt;STRONG&gt;Generate from sample&lt;/STRONG&gt; and paste in the body json and click &lt;STRONG&gt;Done&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;This then gives you a parsing action like this:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Now you have the parsed json, the name will be available to check if the project that triggered the flow was created using the EPT we are interested in.&lt;/P&gt;
&lt;H3&gt;Is this the EPT we were looking for?&lt;/H3&gt;
&lt;P&gt;A &lt;STRONG&gt;Condition&lt;/STRONG&gt; action can then be used to compare the name of the EPT from the parsed json to our target EPT, in this case called &lt;STRONG&gt;FlowEPT&lt;/STRONG&gt;.&amp;nbsp; If it isn’t the same, then we are ending the workflow down the &lt;STRONG&gt;no&lt;/STRONG&gt; path.&amp;nbsp; Setting the &lt;STRONG&gt;IsWorkflowCompleted&lt;/STRONG&gt; doesn’t really do anything in this case and could be left out.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If the name is &lt;STRONG&gt;FlowEPT&lt;/STRONG&gt; then we take the ‘yes’ path, pull together some details from the workflow runtime by getting the runtime details and parsing it (not used for anything special in this case but could be useful for re-enabling later) then set some variables with key details from the runtime.&lt;/P&gt;
&lt;H3&gt;Set up our Project Status list&lt;/H3&gt;
&lt;P&gt;In this example a SharePoint list is used to keep status information of the workflow and progress.&amp;nbsp; It might make more sense to use Dataverse in the real world, as the list could be manipulated more easily outside of the workflow.&amp;nbsp; The list is already created, called WorkflowStatus, and has columns for Stage, Status, Additional and Project Name.&amp;nbsp; The list items are &lt;STRONG&gt;initialized&lt;/STRONG&gt; by the following flow actions, which are SharePoint &lt;STRONG&gt;Create item&lt;/STRONG&gt; actions.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The idea would be to add this list also to the Project Detail Page, filtered for the specific project (TBD), so that workflow progress could be tracked as it is for the current Project Online workflows.&lt;/P&gt;
&lt;H3&gt;Stepping into the State Engine&lt;/H3&gt;
&lt;P&gt;Once these steps are completed, we are ready to roll, and enter a &lt;STRONG&gt;Do Until&lt;/STRONG&gt; loop that completes when &lt;STRONG&gt;IsWorkflowCompleted&lt;/STRONG&gt; is set to true, but will also become disabled after 30 days, which is a Power Automate limit.&amp;nbsp; More on this later (might be much later, in a future part).&amp;nbsp; The &lt;STRONG&gt;Switch&lt;/STRONG&gt; handles what happens within each stage.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Looking at the first stage in the &lt;STRONG&gt;Switch&lt;/STRONG&gt;, &lt;STRONG&gt;Propose&lt;/STRONG&gt;, we first pull out the requester e-mail address, by making a &lt;STRONG&gt;SharePoint REST&lt;/STRONG&gt; call to get the project’s owner’s properties.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Parsing the resulting body so we can pull out the &lt;STRONG&gt;e-mail address&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Updating the list item to say that the proposal is &lt;STRONG&gt;Waiting for Submission&lt;/STRONG&gt;.&amp;nbsp; This uses the SharePoint Update Item action, using the ID output from the Initialize_stage_Propose action made earlier)&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Get Approval to submit the Proposal&lt;/H3&gt;
&lt;P&gt;The submission form itself is handled using a &lt;STRONG&gt;Start and wait for approval&lt;/STRONG&gt; action, into which we put the e-mail it is going to and a link to the project itself:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This will put an &lt;STRONG&gt;Approval&lt;/STRONG&gt; into the Power Automate Approvals page, like this example:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As well as sending an e-mail to the approver:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It can be approved in either place.&amp;nbsp; Once approved, the list item is updated again, using the &lt;STRONG&gt;SharePoint Update Item&lt;/STRONG&gt; action, to show the &lt;STRONG&gt;Propose&lt;/STRONG&gt; stage has been completed – and the time of submission is also put into the list.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Switch to the next Stage&lt;/H3&gt;
&lt;P&gt;The final part of the &lt;STRONG&gt;Propose&lt;/STRONG&gt; stage sets the &lt;STRONG&gt;WorkflowStage&lt;/STRONG&gt;&amp;nbsp;to Review using an &lt;STRONG&gt;Set variable&lt;/STRONG&gt; action – so that the switch takes us to the next column of actions&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The &lt;STRONG&gt;Review&lt;/STRONG&gt; stage in total looks like this – with some updates to the status table and another approval check, which if the response is to revise the request is sent back to the &lt;STRONG&gt;Propose&lt;/STRONG&gt; stage – otherwise the workflow moves to &lt;STRONG&gt;Finished&lt;/STRONG&gt; and concludes.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Stage Status Updates&lt;/H3&gt;
&lt;P&gt;Let’s look deeper at the individual steps.&amp;nbsp; The first it to update the stage status, using the now familiar &lt;STRONG&gt;SharePoint Update Item&lt;/STRONG&gt; action – and we set the status to &lt;STRONG&gt;Waiting for Review&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Sending for Review&lt;/H3&gt;
&lt;P&gt;The review of the proposed project is sent out to a named user in this case, Megan, with options to &lt;STRONG&gt;Approve, Revise &amp;amp; Resubmit or Reject&lt;/STRONG&gt;.&amp;nbsp; An item link is again constructed to be a link to the project.&amp;nbsp; As before, this uses a &lt;STRONG&gt;Start and wait for approval&lt;/STRONG&gt; action, this time waiting for all responses (even if in this case there is just Megan):&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Megan also sees the approvals both in her e-mail and the Approvals page in Power Automate, and can return the workflow to propose for revision, approve it or reject it:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Receive and format Review Response&lt;/H3&gt;
&lt;P&gt;Once the review is actioned, the next step formats the response from the approval step and adds to the Workflow Status list.&amp;nbsp; In this case we take the Responses and format an &lt;STRONG&gt;HTML table&lt;/STRONG&gt;, which the following step will put into our status list:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The &lt;STRONG&gt;Output&lt;/STRONG&gt; from this step goes into the column called &lt;STRONG&gt;Additional&lt;/STRONG&gt;&amp;nbsp;in the &lt;STRONG&gt;Edit item&lt;/STRONG&gt; step next:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;An example of the Workflow status list, for a project that has been sent back for revision before finally being approved is below:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Are we there yet?&lt;/H3&gt;
&lt;P&gt;Finally in this stage, a condition action is used, to set the next appropriate stage – &lt;STRONG&gt;Propose&lt;/STRONG&gt;, if the approval suggested revision was needed, or &lt;STRONG&gt;Finished&lt;/STRONG&gt; if it was either Approve or Reject.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If it goes back to Propose it just goes around the loop again, if it goes to Finished then the &lt;STRONG&gt;IsWorkflowCompleted&lt;/STRONG&gt; is set to true (which will break out of the Do Until at the end of the cycle) and the &lt;STRONG&gt;SharePoint Edit item&lt;/STRONG&gt; is used again to update the status to &lt;STRONG&gt;Completed&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The Workflow Status list can be added to the Project Details PDP, so that it is available much the same as the existing workflow has its lists.&amp;nbsp; Currently this list would contain all statuses for all projects so would need to be filtered. Feels like a new web part that can filter down to the project (by GUID) to make this easier.&lt;/P&gt;
&lt;H2&gt;Closing Statement&lt;/H2&gt;
&lt;P&gt;Wow, that’s a lot to take in, and more coming in a ‘Part 2’ soon, to talk over some ways of using Power Automate, Teams and Adaptive Cards to gather data for custom fields in Project Online, during the workflow.&amp;nbsp; I'm sure there will be further parts after that too.&amp;nbsp; What do you want to hear about?&lt;/P&gt;
&lt;P&gt;We would also love to hear from you on how you feel this would work for you – or if you are a partner, your customers.&amp;nbsp; Are you already doing something much better than this?&amp;nbsp; We’d love to hear that too.&amp;nbsp; As mentioned earlier, we do have some plans for investment on the engineering side to make some of these steps easier and more efficient – feedback from you will help focus this investment.&amp;nbsp; Either comment here, or reach out to us at &lt;A href="mailto:PJOQueries@microsoft.com" target="_blank" rel="noopener"&gt;PJOQueries@microsoft.com&lt;/A&gt; and let us know&lt;/P&gt;
&lt;P&gt;For customers who believe the above approach using Power Automate is not addressing their requirements, and are seeking extension of workflows for genuine scenarios, also please reach out to us on &lt;A href="mailto:PJOQueries@microsoft.com" target="_blank" rel="noopener"&gt;PJOQueries@microsoft.com&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Thanks to Divya Tiwari for the original concepts for these workflows, and also to Ramesh Maruthupandiyan (both of whom will be eager to get your feedback at the above addresses) and Jason Rhoades for feeding in his real-world experiences.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 06 Mar 2024 22:45:30 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/using-power-automate-for-project-lifecycle-workflows-in-project/ba-p/4077594</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2024-03-06T22:45:30Z</dc:date>
    </item>
    <item>
      <title>Project Server: Project Subsite Lists Lack Essential Forms</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/project-server-project-subsite-lists-lack-essential-forms/ba-p/3894593</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Limited Functionality: Project Subsite Lacks Essential Forms&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;** Edit 8/9/23 Although this was initially reported with 2016, I understand the same could occur with 2019 or the Subscription Edition.&amp;nbsp; The mitigation would be the same **&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Problem Description:&amp;nbsp;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Consider the following scenario,&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A new site template is created.&lt;/LI&gt;
&lt;LI&gt;The site template is associated with an Enterprise Project Type (EPT)&lt;/LI&gt;
&lt;LI&gt;A new project is published using this EPT, for which a &lt;STRONG&gt;new SharePoint site&lt;/STRONG&gt; is created.&lt;/LI&gt;
&lt;LI&gt;While working within this new site, a user attempts to add a new list item to deliverables, issues, or risks.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;In this situation, instead of seeing the new form, they may see the following error message: &lt;SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "Sorry, something went wrong. Unable to find the default new form for &amp;lt;list name&amp;gt;."&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Root cause:&amp;nbsp;&amp;nbsp;&lt;/STRONG&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This issue began after installing the January 2022 public update (PU) for SharePoint Server 2016. It specifically affects custom project site templates, while the out-of-the-box template functions properly. Moreover, the problem only arises when creating the Project Site automatically during project publish.&lt;/P&gt;
&lt;P&gt;This issue can be seen if the Service Account with which the Project Server Queue Service is running is not added to the Local Built-in Administrators group on all the servers or the server where the Project Server Queue Service is running.&lt;SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Solution&lt;/STRONG&gt;: &amp;nbsp;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;BR /&gt;If you encounter this issue, please follow these steps to resolve it. The following changes need to be done in all server machines that runs the Project Server Queue Service, &lt;SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Go to the following file: &amp;nbsp;C:\inetpub\wwwroot\wss\VirtualDirectories\80\web.config&lt;SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;If you have other defined web applications on other ports, then you’ll need to modify them as well. For instance, you may have a virtual directory on port 90 and so you’ll go to folder C:\inetpub\wwwroot\wss\VirtualDirectories\90 to edit the web.config file.&lt;SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;In Explorer right click on the file to display the short-cut mention and then select Properties.&lt;/LI&gt;
&lt;LI&gt;Click the Security Tab, click the Edit button and click the Add button.&lt;/LI&gt;
&lt;LI&gt;Add your service account as new user and click Ok.&lt;/LI&gt;
&lt;LI&gt;Once the service account is added -&amp;gt; select and apply Read permissions&lt;/LI&gt;
&lt;LI&gt;Restart IIS and the Project Server Queue service.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Related document&lt;/STRONG&gt;: &lt;SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/project/plan-for-administrative-and-service-accounts-in-project-server-2013-beta-2" target="_blank" rel="noopener"&gt;Plan for administrative and service accounts in Project Server 2013 - Project Server | Microsoft Learn&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 09 Aug 2023 14:25:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/project-server-project-subsite-lists-lack-essential-forms/ba-p/3894593</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2023-08-09T14:25:22Z</dc:date>
    </item>
    <item>
      <title>Understanding Assignment Schedules in Project for the Web</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/understanding-assignment-schedules-in-project-for-the-web/ba-p/3882824</link>
      <description>&lt;P&gt;I this example, the customer was confused when changing the dates for a task that it moved the start date back a day, yet for exactly the same resource it moved the finish forward a day?&amp;nbsp; What was going on?&amp;nbsp; The help understand this I'll give some background first, and it is to do with the time zones of the project and of the resource.&amp;nbsp; The project is set to use PST (GMT-8) and to also respect the time zone of any assigned resources - and in this case our resource, Henrietta Mueller works in GMT+5. I also happen to be running under en-GB - so my dates are showing as dd/MM.&lt;/P&gt;
&lt;P&gt;Before any assignment is made the tasks have a 9am start time, and a 5pm end time:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Once I assign Henrietta, then the earliest they can start is 9pm PST (21:00), which is 9am in Henrietta's time zone:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;If I now make a change to the start date or end date, what will happen?&amp;nbsp; If I change the start date of Task 1 to August 3rd, I get a message saying the start date was move to the NEXT working day, which would be August 4th - yet the date is actually set as August 6th.&amp;nbsp; Why?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;To understand what happened we need to remember that there are two things at play here - the task and the assignment.&amp;nbsp; When we change the date, we are doing this to the task, yet the date, and more importantly the time, is being driven by the assignment.&amp;nbsp; So when we change the date to August 3rd, the start time is 9pm, or 21:00.&amp;nbsp; This is after the project day ends, at 5pm, so it goes back to the next day.&amp;nbsp; As luck would have it (or my convenient choice of which dates to choose), the next day is Friday 4th, but for Henrietta, their Friday has already finished, the next working day for her appears as August 6th on the project plan, at 9pm, but is their Monday morning.&lt;/P&gt;
&lt;P&gt;What happens when we change the finish date?&amp;nbsp; In this case I'll select Wednesday 2nd August as the next finish - and I get a pop-up that the task finish was moved to the previous working day:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The logic here is very similar.&amp;nbsp; The time element of the finish is 5am, the end of Henrietta's working day.&amp;nbsp; As this is before the project day starts in the PST time zone, then this is pushed back to the previous day - then actually starts at 9pm on August 1st.&lt;/P&gt;
&lt;P&gt;The logic for both of these is the same; the assignment times are being used to find the new task start/finish, then this sets the day, then the assignment is moved which may also change the day if working time isn't available in the day where the task now lands.&lt;/P&gt;
&lt;P&gt;In both of these cases a constraint is added to the task which can be seen as a star in the corner of the calendar - then opening the calendar will detail the precise constraint.&amp;nbsp; You can also remove the constraint if you need to.&amp;nbsp; Please note that constraints also get added if you move a task start or finish in the timeline view by dragging the tasks.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you are driving the schedule using the project start date, and then using the dependencies between the tasks then you may find that you don't really want constraints.&amp;nbsp; Also taking a look at the Assignments tab may help you understand where the work is being carried out.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 24 Jul 2023 21:03:43 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/understanding-assignment-schedules-in-project-for-the-web/ba-p/3882824</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2023-07-24T21:03:43Z</dc:date>
    </item>
    <item>
      <title>Upgrading your Workflow Manager for Project Server</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/upgrading-your-workflow-manager-for-project-server/ba-p/3779836</link>
      <description>&lt;P&gt;There was a recent release of a new Workflow Manager for all versions of SharePoint on-premises, so also therefore, for Project Server. Josh Roark, one of my SharePoint colleagues, put together this great blog post on the steps required for upgrading SharePoint and Workflow Manager together.&amp;nbsp;&lt;A href="https://joshroark.com/upgrading-sharepoint-and-wfm-at-the-same-time/" target="_blank"&gt;https://joshroark.com/upgrading-sharepoint-and-wfm-at-the-same-time/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;I'll also include here the Project Server upgrade document links - as Josh's blog post concentrates on the SharePoint side of the farm.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A title="Upgrade to Project Server Subscription Edition" href="https://learn.microsoft.com/en-us/project/upgrade-project-server-subscription-edition" target="_blank" rel="noopener"&gt;Upgrade to Project Server Subscription Edition&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;A title="Upgrade to Project Server 2019" href="https://learn.microsoft.com/en-us/project/upgrade-to-project-server-2019" target="_blank" rel="noopener"&gt;Upgrade to Project Server 2019&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;A title="Upgrade to Project Server 2016" href="https://learn.microsoft.com/en-us/project/upgrade-to-project-server-2016" target="_blank" rel="noopener"&gt;Upgrade to Project Server 2016&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Mon, 27 Mar 2023 15:34:46 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/upgrading-your-workflow-manager-for-project-server/ba-p/3779836</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2023-03-27T15:34:46Z</dc:date>
    </item>
    <item>
      <title>Reading Project Online OData with Azure Data Factory</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/reading-project-online-odata-with-azure-data-factory/ba-p/3616300</link>
      <description>&lt;P&gt;The first problem we hear from customers moving to Azure Data Factory (ADF), who have been using SQL Server Integration Services (SSIS) to get their Project Online OData, is that the authentication and authorization is not straightforward.&amp;nbsp; There isn't a simple choice to login to Project Online, so you have to make a call to get a token which can then be used in the REST calls to OData.&amp;nbsp; The following post steps through the process.&amp;nbsp; I'm not going deep into the details of ADF and won't cover all the steps of making an App Registration - there are plenty of resources out there, and this concentrates on the authentication then pulls in some Project level data.&amp;nbsp; It gets more complicated obviously when you also want tasks and assignments, but the same approaches used with SSIS will work just as well in ADF.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;TL;DR - if you know all about ADF and Project Online and App Registrations and just want the auth piece - jump to the&amp;nbsp;M365Login section - just about halfway down, or just take a look at&amp;nbsp;&lt;A href="https://github.com/LunchWithaLens/adf" target="_blank" rel="noopener"&gt;https://github.com/LunchWithaLens/adf&lt;/A&gt;&amp;nbsp;which has definitions for the whole pipeline.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;What you will need:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;An App Registration in Azure Active Directory that allows you to read the Project reporting data.&amp;nbsp; You will need your Tenant ID and also the Client ID and registered secret of the App Registration&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A user account that just needs Access to Project Server reporting service.&amp;nbsp; You will need the account name and password.&amp;nbsp; The authentication will use the Resource Owner Password Credential (ROPC).&amp;nbsp; This method of authentication is not recommended when other approaches are available (see&amp;nbsp;&lt;A title="ROPC" href="https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth-ropc" target="_blank" rel="noopener"&gt;Microsoft identity platform and OAuth 2.0 Resource Owner Password Credentials&lt;/A&gt;&amp;nbsp;) but as there is no "app-only" authentication options for Project Online this is one such occasion when this is the only way.&amp;nbsp; To ensure this is as secure as possible we will be storing the username and password in Azure Key Vault (AKV).&amp;nbsp;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;In this example they are also a team member, but that is not necessary.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;An Azure Data Factory resource in Azure&lt;/LI&gt;
&lt;LI&gt;Somewhere to write the data.&amp;nbsp; In this example I cover both saving out as Json to blob storage in Azure, as well as saving to SQL Server (in this case hosted in Azure.&amp;nbsp; You will need connection strings for whatever storage you are using&lt;/LI&gt;
&lt;LI&gt;If using SQL Server you will need stored procedures that will do the data handling - more details later&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Once you have all these pieces in place, we can continue with ADF to:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Add Linked Services&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Add Datasets&lt;/LI&gt;
&lt;LI&gt;Build a pipeline&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Linked Services&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;We need 4 linked services&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;An Azure Key Vault where we will be storing our account details and App Registration secret&lt;/LI&gt;
&lt;LI&gt;A REST linked service - basically our OData endpoint&lt;/LI&gt;
&lt;LI&gt;Azure Blob Storage (not necessary - but I found it useful in debugging before I added it all into SQL Server)&lt;/LI&gt;
&lt;LI&gt;SQL Server&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;To keep this blog relatively short, I'm not going into all the details of setting up AKV, just that using a managed identity makes it fairly easy to use in AFD.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The REST linked literally just needs the base URL configured - and this will be the URL for your PWA instance's OData feed, along with any select options to limit the returned fields.&amp;nbsp; As an example, I used:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;A href="https://&amp;lt;tenantname&amp;gt;.sharepoint.com/sites/pwa/_api/ProjectData/Projects?$select=ProjectId,ProjectActualCost,ProjectActualDuration,ProjectActualFinishDate,ProjectActualStartDate,ProjectActualWork,ProjectCost,ProjectCreatedDate,ProjectCurrency,ProjectDescription,ProjectDuration,ProjectFinishDate,ProjectIdentifier,ProjectLastPublishedDate,ProjectModifiedDate,ProjectName,ProjectPercentCompleted,ProjectPercentWorkCompleted,ProjectStartDate,ProjectStatusDate,ProjectWork" target="_blank" rel="noopener"&gt;https://&amp;lt;tenantname&amp;gt;.sharepoint.com/sites/pwa/_api/ProjectData/Projects?$select=ProjectId,ProjectActualCost,ProjectActualDuration,ProjectActualFinishDate,ProjectActualStartDate,ProjectActualWork,ProjectCost,ProjectCreatedDate,ProjectCurrency,ProjectDescription,ProjectDuration,ProjectFinishDate,ProjectIdentifier,ProjectLastPublishedDate,ProjectModifiedDate,ProjectName,ProjectPercentCompleted,ProjectPercentWorkCompleted,ProjectStartDate,ProjectStatusDate,ProjectWork&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This limited the columns returned to just those I needed.&amp;nbsp; The authentication type was left as anonymous as I was handling this latter with a bearer token.&lt;/P&gt;
&lt;P&gt;The Azure Blog storage isn't a necessity - if you want to use one then easy to configure but I won't go into the full details here.&amp;nbsp; Ping me in the comments if you can't find good resources to help.&lt;/P&gt;
&lt;P&gt;Finally the SQL Server, and mine was a database I was already using for something else to which I just added a couple of tables and sprocs.&amp;nbsp; In an earlier attempt I'd configured a more expensive SQL Server instance than I'd realised - and blown through my monthly allowance...&amp;nbsp; The SQL Server linked service allows easy connectivity to an AKV to get the connection string - for a secure configuration.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Datasets&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;The datasets match up to 3 of the linked services.&amp;nbsp; My "RestResource1" to link to my REST, my "ProjectTable" to match up to my SQL database and a specific table, and my "json1" that I use to connect to my blob storage to save a file.&amp;nbsp; Again, configuring these I leave as an exercise for the reader &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt; , but the GitHub repo has definitions for all of these so you can see how they hang together.&amp;nbsp; The pipeline will help them make more sense too - which comes next.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;The Pipeline&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;To help visualize where we are headed, first we can look at the final short pipeline:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The first column of activities is reading the required data from AKV.&amp;nbsp; The names should make it obvious what the data is, the username and password, the ClientId and secret for the app registration, then finally the scope for the authentication call.&amp;nbsp; This isn't strictly a 'secret' but I put in in the AKV as it helps when demonstrating (or recording) the solution to be able to show the values.&amp;nbsp; Exposing the scope is no big deal and avoids having to redact stuff in any recording I do.&lt;/P&gt;
&lt;P&gt;The only part defined for these activities are the settings - and the scope one is a good example:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The most interesting step, and maybe the only one you are interested in, is the one I called M365Login - and that is just my name - there isn't a special activity, it is just a web activity.&amp;nbsp; The settings for this one are as follows:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The URL is of the form&amp;nbsp;&lt;A href="https://login.microsoftonline.com/&amp;lt;tenantid&amp;gt;/oauth2/v2.0/token" target="_blank" rel="noopener"&gt;https://login.microsoftonline.com/&amp;lt;tenantid&amp;gt;/oauth2/v2.0/token&lt;/A&gt;&amp;nbsp;and the method is POST and the headers configured as shown above with Content-Type application/x-www-form-urlencoded, Accept */* and Connection keep-alive.&amp;nbsp; The Body is the key part - and is using the concatenation function and brings in the values from the previous calls to AKV.&amp;nbsp; The full form looks something like the following, where I have used specific names for my AKV activities - yours may vary.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;@&lt;/SPAN&gt;&lt;SPAN&gt;concat(&lt;/SPAN&gt;&lt;SPAN&gt;'grant_type=password&amp;amp;client_id='&lt;/SPAN&gt;&lt;SPAN&gt;,activity(&lt;/SPAN&gt;&lt;SPAN&gt;'AKVPjoClientId'&lt;/SPAN&gt;&lt;SPAN&gt;).&lt;/SPAN&gt;&lt;SPAN&gt;output&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;value&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;'&amp;amp;client_secret='&lt;/SPAN&gt;&lt;SPAN&gt;,activity(&lt;/SPAN&gt;&lt;SPAN&gt;'AKVPjoODataSecret'&lt;/SPAN&gt;&lt;SPAN&gt;).&lt;/SPAN&gt;&lt;SPAN&gt;output&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;value&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;'&amp;amp;scope='&lt;/SPAN&gt;&lt;SPAN&gt;,activity(&lt;/SPAN&gt;&lt;SPAN&gt;'AKVPjoScope'&lt;/SPAN&gt;&lt;SPAN&gt;).&lt;/SPAN&gt;&lt;SPAN&gt;output&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;value&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;'&amp;amp;username='&lt;/SPAN&gt;&lt;SPAN&gt;,activity(&lt;/SPAN&gt;&lt;SPAN&gt;'AKVUserName'&lt;/SPAN&gt;&lt;SPAN&gt;).&lt;/SPAN&gt;&lt;SPAN&gt;output&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;value&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;'&amp;amp;password='&lt;/SPAN&gt;&lt;SPAN&gt;,activity(&lt;/SPAN&gt;&lt;SPAN&gt;'AKVUserPassword'&lt;/SPAN&gt;&lt;SPAN&gt;).&lt;/SPAN&gt;&lt;SPAN&gt;output&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;value&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;Basically it is using the output.value property of the previous steps to complete the "grant_type" body needed for an ROPC call.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;I then use a Set variable action to take the response and keep the token for later use.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;SPAN&gt;The full string used in the Value is&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;@&lt;/SPAN&gt;&lt;SPAN&gt;activity(&lt;/SPAN&gt;&lt;SPAN&gt;'M365Login'&lt;/SPAN&gt;&lt;SPAN&gt;).&lt;/SPAN&gt;&lt;SPAN&gt;output&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;access_token&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;Now I have my token I can use that to make my REST call to Project Online's OData endpoint using a Copy data activity.&amp;nbsp; First I use a Stored procedure activity to clear out my staging table.&amp;nbsp; Take a look at the GitHub&amp;nbsp;for more details, but it is just a 'delete from' call.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;The copy data activity has a source and sink (destination) and I use one to read and then write to blob storage, then another to read and write to SQL.&amp;nbsp; I'll concentrate on the second, which has Source settings configured like this:&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;SPAN&gt;The source dataset is my REST dataset, I add the header Authorization with a Value of&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;@&lt;/SPAN&gt;&lt;SPAN&gt;concat(&lt;/SPAN&gt;&lt;SPAN&gt;'Bearer '&lt;/SPAN&gt;&lt;SPAN&gt;,variables(&lt;/SPAN&gt;&lt;SPAN&gt;'token'&lt;/SPAN&gt;&lt;SPAN&gt;))&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;which gets the token from my variable called token, and I have also set the Pagination rulesRFC5988 with a Value True (although that isn't in the above screenshot.&lt;/DIV&gt;
&lt;DIV&gt;The Sink settings are as follows:&lt;/DIV&gt;
&lt;DIV&gt;&lt;img /&gt;&lt;/DIV&gt;
&lt;DIV&gt;with the sink dataset as my SQL dataset 'ProjectsTable'.&amp;nbsp; The magic happens on the Mappings tab - and I had created a table that matched the columns I was returning from REST - so just a 1:1 mapping.&amp;nbsp; You can get more adventurous here if you need to do anything fancy:&lt;/DIV&gt;
&lt;DIV&gt;&lt;img /&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;Once that is complete, we have a populated Project staging table with the current projects read from OData.&amp;nbsp; The final steps are then just 3 stored procedure steps that remove deleted projects from the live project table (by deleting if they do not now exist in staging). also deleting any projects that have been updated (the modified date is newer in the staging table) and then finally copying in the updated and new plans from staging to the live table.&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;As mentioned, this is just the basics and only looks at Projects - but the main focus here was the authentication steps of getting the token with ROPC, then using the token in the REST call.&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;I appreciate I have glossed over a lot of the detail here so happy to fill in some of the gaps if required in the comments section or another blog if needed.&amp;nbsp; However, if you know ADF and already use SSIS - the authentication piece was probably all you came for.&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Fri, 02 Sep 2022 22:53:40 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/reading-project-online-odata-with-azure-data-factory/ba-p/3616300</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2022-09-02T22:53:40Z</dc:date>
    </item>
    <item>
      <title>Guest Users and Project for the web</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/guest-users-and-project-for-the-web/ba-p/3367735</link>
      <description>&lt;P&gt;We now have guest access in Project for the web, but in the early testing we have seen some anomalies raised by customers (and MVPs - thanks Erik and Paul).&amp;nbsp; There are a lot of settings across M365 that control what guests can do - but none appeared to explain the difference we were seeing from tenant to tenant.&amp;nbsp; So, what was different and what can you do about it?&amp;nbsp; First, I'll explain the difference I was seeing.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In one tenant (see screenshot above) I could add an existing guest (you can't invite new guests from Project - that is expected) and it allowed me to choose between adding them to the group or just making an assignment.&amp;nbsp; I could also add them manually to the members list.&amp;nbsp; All good!&amp;nbsp; In my other test tenant, I could add them to a task, and they were assigned - but not added to the group - and listed instead as "other people" - and I couldn't see them listed to add them to a group - at least in Project (I could in Outlook or AAD).&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;On the face of it everything looked the same about the guest user (it was the same account) and even the tenant.&amp;nbsp; A quick play around with F12 developer tools and I could see when I browsed to add a new member and it was not finding the guest, the actual query had a filter - "&lt;SPAN&gt;userType%20ne%20%27Guest%27" - so not suprising that my guest wasn't found!&amp;nbsp; I then tried Ctrl-F5 to fully refresh the page and look through the other calls going to the service, to see if there was any clue to why it wasn't looking for guests.&amp;nbsp; These few calls looked like they were getting various settings that might impact the page:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;and without too much looking I found that "GroupSettings" looked interesting.&amp;nbsp; It was calling out to an API to get TenantSetting/GroupSettings.&amp;nbsp; The response it got was&amp;nbsp;&lt;STRONG&gt;{"value":[]}&lt;/STRONG&gt; - basically a NULL array.&amp;nbsp; Odd.&amp;nbsp; I tried the same thing on my working tenant and saw the response as this:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;{"value":[{"displayName":"Group.Unified","templateId":"62375ab9-6b52-47ed-826b-58e47e0e304b","id":"3c4adb15-25c8-48a5-b060-106e025803a2","values":[{"name":"NewUnifiedGroupWritebackDefault","value":"True"},{"name":"EnableMIPLabels","value":"True"},{"name":"CustomBlockedWordsList","value":""},{"name":"EnableMSStandardBlockedWords","value":"False"},{"name":"ClassificationDescriptions","value":""},{"name":"DefaultClassification","value":""},{"name":"PrefixSuffixNamingRequirement","value":""},{"name":"AllowGuestsToBeGroupOwner","value":"False"},{"name":"AllowGuestsToAccessGroups","value":"True"},{"name":"GuestUsageGuidelinesUrl","value":""},{"name":"GroupCreationAllowedGroupId","value":""},{"name":"AllowToAddGuests","value":"True"},{"name":"UsageGuidelinesUrl","value":"&lt;A href="https://guideline.example.com" target="_blank" rel="noopener"&gt;https://guideline.example.com&lt;/A&gt;"},{"name":"ClassificationList","value":""},{"name":"EnableGroupCreation","value":"True"}]}]}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;This looked familiar as I'd set some of these values in the past using PowerShell.&amp;nbsp; A great article that describes all this can be found at&amp;nbsp;&lt;A title="Azure Active Directory cmdlets for configuring group settings" href="https://docs.microsoft.com/en-us/azure/active-directory/enterprise-users/groups-settings-cmdlets" target="_blank" rel="noopener"&gt;Azure Active Directory cmdlets for configuring group settings&lt;/A&gt;&amp;nbsp;.&amp;nbsp; I looked at both of my tenants to see what settings were present, using Get-AzureADDirectorySetting -All $true.&amp;nbsp; My tenant that didn't resolve the guest came back empty:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;In my tenant that did show some settings I saw what I expected:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;It appeared that I had no specific settings configured, and in that case the NULL array returned didn't give Project the information it needed to know that guests were ok to resolve.&amp;nbsp; I'm not sure at this point whose bug this is - Azure AD for not having any defaults show up - or Project for not filling in the gaps.&amp;nbsp; We will see who gets to fix it.&amp;nbsp; But to fix it yourself you just need your tenant admin to follow steps in the article listed above to set the settings they want - and assuming they don't block guests you should then be able to assign and add guests to your projects and they will be members.&amp;nbsp; CTRL-F5 once the Group Settings are present, and then I can add my guest to members:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 12 May 2022 22:37:13 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/guest-users-and-project-for-the-web/ba-p/3367735</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2022-05-12T22:37:13Z</dc:date>
    </item>
    <item>
      <title>Project Server Subscription Edition Public Updates</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/project-server-subscription-edition-public-updates/ba-p/3043464</link>
      <description>&lt;P&gt;Here are all the articles for fixes released for Project Server Subscription Edition from its launch to date.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="June 2024 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/june-2024-updates-for-microsoft-office-aed13a2a-3629-4d83-974f-fa9121601663" target="_self" rel="noreferrer"&gt;June 2024&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-june-11-2024-kb5002603-2bf5fb1a-0322-44ce-b420-ce1b8bbf7f06" target="_blank"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-june-11-2024-kb5002603-2bf5fb1a-0322-44ce-b420-ce1b8bbf7f06&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This&amp;nbsp;security update also contains a fix&amp;nbsp;for the following nonsecurity issue&amp;nbsp;in Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an issue in which the connected&amp;nbsp;SharePoint site displays as not created with specific Unicode characters in URL.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.17328.20362&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="May 2024 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/may-2024-updates-for-microsoft-office-4a6a9970-be68-47f6-9270-62b221d3fcb3" target="_self" rel="noreferrer"&gt;May 2024&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-may-14-2024-kb5002599-3e38ec3d-3d59-40d4-8807-0002f89d9ab8" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-may-14-2024-kb5002599-3e38ec3d-3d59-40d4-8807-0002f89d9ab8&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.17328.20292&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="March 2024 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/march-2024-updates-for-microsoft-office-d85bade8-44b4-4d80-900d-f1fd3fcc5e6b" target="_self" rel="noreferrer"&gt;March 2024&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-march-12-2024-kb5002564-11110625-a13c-4f09-9a60-d1176d9769ba" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-march-12-2024-kb5002564-11110625-a13c-4f09-9a60-d1176d9769ba&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.17328.20136&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="February 2024 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/february-2024-updates-for-microsoft-office-e4fd637b-865a-47b7-b72f-a44766a217e4" target="_self" rel="noopener noreferrer"&gt;February 2024&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/february-13-2024-update-for-sharepoint-server-subscription-edition-kb5002560-d2b9cb2a-a35c-46f3-b863-30f69b8f0b39" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/february-13-2024-update-for-sharepoint-server-subscription-edition-kb5002560-d2b9cb2a-&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/february-13-2024-update-for-sharepoint-server-subscription-edition-kb5002560-d2b9cb2a-a35c-46f3-b863-30f69b8f0b39" target="_blank" rel="noopener"&gt;a35c-46f3-b863-30f69b8f0b39&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;16.0.16731.20526&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="January 2024 updates for Microsoft Office" href="https://support.microsoft.com/en-au/topic/january-2024-updates-for-microsoft-office-4f822b78-091e-4a8a-80e1-d6310796ffda" target="_blank" rel="noopener noreferrer"&gt;January 2024&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-au/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-january-9-2024-kb5002540-a34c5764-cd4a-484b-8bf1-cefd033f8d7e" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-au/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-january-9-2024-kb5002540-a34c5764-cd4a-484b-8bf1-cefd033f8d7e&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version:&amp;nbsp;16.0.16731.20462&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This&amp;nbsp;security update also contains a fix&amp;nbsp;for the following nonsecurity issue&amp;nbsp;in Microsoft Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an issue in which the edited field value in a list is automatically deleted after you press&amp;nbsp;Enter while you're in the classic experience of the document library.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="September 2023 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/september-2023-updates-for-microsoft-office-c56c7c0e-0e3c-4f04-9d54-c688dd9ce54e" target="_blank" rel="noopener noreferrer"&gt;September 2023&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-september-12-2023-kb5002474-c5869260-56d1-439b-a159-45fa38935276" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-september-12-2023-kb5002474-c5869260-56d1-439b-a159-45fa38935276&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.16731.20180&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This&amp;nbsp;security update also contains a fix&amp;nbsp;for the following nonsecurity issue&amp;nbsp;in Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an issue in which you cannot update the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="ocpCodeInline"&gt;FixedCostAccrual&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;property on DraftTask, PublishedTask, and ProjectSummaryTask objects by using the client-side object model (CSOM).&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;A title="August 2023 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/august-2023-updates-for-microsoft-office-796da43e-4310-4eab-ba9d-2908bbfe16d5" target="_blank" rel="noopener noreferrer"&gt;August 2023&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-august-8-2023-kb5002437-9487a2bf-0010-4f41-93b7-4ab8e8526737" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-august-8-2023-kb5002437-9487a2bf-0010-4f41-93b7-4ab8e8526737&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.16130.20684 &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="July 2023 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/july-2023-updates-for-microsoft-office-827d5944-24f9-41ea-ae02-0fa02f837e8f" target="_blank" rel="noopener noreferrer"&gt;July 2023&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-july-11-2023-kb5002424-a5880c63-1550-4f63-b788-9c8e79d05f47" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-july-11-2023-kb5002424-a5880c63-1550-4f63-b788-9c8e79d05f47&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.16130.20642&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This&amp;nbsp;security update also contains fixes for the following nonsecurity issues that occur when you use the client-side object model (CSOM) in Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;You cannot set a project or task calendar for a project.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;You cannot update the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="ocpCodeInline"&gt;ScheduledFromStart&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;property for a project.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="June 2023 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/june-2023-updates-for-microsoft-office-f466c8b3-d320-4844-b97b-16c825d80963" target="_blank" rel="noopener noreferrer"&gt;June 2023&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-june-13-2023-kb5002416-30534b01-588b-422e-8b87-865d22244a83" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-june-13-2023-kb5002416-30534b01-588b-422e-8b87-865d22244a83&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.16130.20548&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="May 2023 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/may-2023-updates-for-microsoft-office-ae1f273c-e093-4482-bc83-f6b48d3244ac" target="_blank" rel="noopener noreferrer"&gt;May 2023&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-may-9-2023-kb5002390-5d150cf3-e42d-4a0e-b015-0b4357b8e5ea" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-may-9-2023-kb5002390-5d150cf3-e42d-4a0e-b015-0b4357b8e5ea&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.16130.20420&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="April 2023 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/april-2023-updates-for-microsoft-office-107b1ed4-1cec-45a2-bace-c065e7434840" target="_blank" rel="noopener noreferrer"&gt;April 2023&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-april-11-2023-kb5002375-1bbdc497-d120-4f43-a0d2-e9392d62dd1f" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-april-11-2023-kb5002375-1bbdc497-d120-4f43-a0d2-e9392d62dd1f&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.16130.20314&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="March 2023 updates for Microsoft Office" href="https://support.mihttps://support.microsoft.com/en-us/topic/march-2023-updates-for-microsoft-office-9a711380-cb37-45b0-ba7b-9e03babd7906crosoft.com/en-us/topic/february-2023-updates-for-microsoft-office-fb1b6ab1-d4af-4fba-a4fe-060f7a24bfd8" target="_blank" rel="noopener noreferrer"&gt;March 2023&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-march-14-2023-kb5002355-9a893845-0b9b-40af-ac82-6f3cd252c378" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-march-14-2023-kb5002355-9a893845-0b9b-40af-ac82-6f3cd252c378&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.16130.20206&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This&amp;nbsp;security update also contains fixes for the following nonsecurity issues in Microsoft Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an issue in which you&lt;STRONG class="ocpLegacyBold"&gt;&lt;I class="ocpItalic"&gt;&amp;nbsp;&lt;/I&gt;&lt;/STRONG&gt;might&amp;nbsp;not be able to update resources by using the client-side object model (CSOM) if a remote event handler is attached to&lt;STRONG class="ocpLegacyBold"&gt;&amp;nbsp;&lt;/STRONG&gt;a resource event, such as&amp;nbsp;Resource Changing.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Fixes the following issues that you might&amp;nbsp;encounter&amp;nbsp;when you publish&amp;nbsp;projects:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Logging on and connecting to the server that contains the Project client might&amp;nbsp;be blocked.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Opening projects that have no relationship to the publishing projects&amp;nbsp;might&amp;nbsp;not be possible.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Loading projects in the Schedule web part might&amp;nbsp;be slow.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Team members might&amp;nbsp;not be able to access the Tasks page.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Going to the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;Force Check-in Enterprise Objects&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;administrative page might&amp;nbsp;be blocked.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="February 2023 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/february-2023-updates-for-microsoft-office-fb1b6ab1-d4af-4fba-a4fe-060f7a24bfd8" target="_blank" rel="noopener noreferrer"&gt;February 2023&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-february-14-2023-kb5002353-837bb6b7-4b8d-4974-a2ee-015b0d72d408" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-february-14-2023-kb5002353-837bb6b7-4b8d-4974-a2ee-015b0d72d408&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-february-14-2023-kb5002352-97afbca4-650d-43c1-be2e-b1842452a019" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-february-14-2023-kb5002352-97afbca4-650d-43c1-be2e-b1842452a019&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.15601.20478&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This&amp;nbsp;security update also contains fixes for the following nonsecurity issues in Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an issue in which you&lt;STRONG class="ocpLegacyBold"&gt;&lt;I class="ocpItalic"&gt;&amp;nbsp;&lt;/I&gt;&lt;/STRONG&gt;might&amp;nbsp;not be able to update resources by using the client-side object model (CSOM) if a remote event handler is attached to&lt;STRONG class="ocpLegacyBold"&gt;&amp;nbsp;&lt;/STRONG&gt;a resource event, such as&amp;nbsp;Resource Changing.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;​​​​​​​Fixes an issue in which the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;Save&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;Cancel&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;buttons are disabled on the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;Add dependency&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;page of a Portfolio Analysis.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="January 2023 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/january-2023-updates-for-microsoft-office-0d7e22c4-64dc-44a0-a899-cf2df6fbb07b" target="_blank" rel="noopener noreferrer"&gt;January 2023&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-january-10-2023-kb5002331-816d71a6-ffa3-4978-9d87-cb22c74d9aa1" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-january-10-2023-kb5002331-816d71a6-ffa3-4978-9d87-cb22c74d9aa1&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/january-10-2023-update-for-sharepoint-server-subscription-edition-language-pack-kb5002326-a76c92b4-a264-439f-82c2-c08c9208f5fb" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/january-10-2023-update-for-sharepoint-server-subscription-edition-language-pack-kb5002326-a76c92b4-a264-439f-82c2-c08c9208f5fb&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.15601.20418&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This&amp;nbsp;security update also contains a fix&amp;nbsp;for the following nonsecurity issue&amp;nbsp;in Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Occasionally, administrators may have to restore server metadata, such as the Enterprise custom fields. Although the restore process starts the Reporting Database Refresh queue job,&amp;nbsp;the following items might occur:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;The queue job fails.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;When you access&amp;nbsp;reporting data either directly from the reporting schema or through Open Data Protocol (OData), no data is returned.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;In the Universal Logging Service logs, the following error is reported:&lt;/P&gt;
&lt;DIV class="ocpAlert"&gt;
&lt;P&gt;SPValidatingBinder: blocked type Microsoft.Office.Project.Server.BusinessLayer.ReportingLayer.RefreshStorageData denied.&lt;/P&gt;
&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This update fixes the problem so that the Reporting Database Refresh job finishes successfully.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="December 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/december-2022-updates-for-microsoft-office-3b14c6cc-c158-4e17-8bf7-589c2e63332d" target="_blank" rel="noopener noreferrer"&gt;December 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-december-13-2022-kb5002327-eb4896cd-681b-4756-8c60-f33c9ac2af47" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-december-13-2022-kb5002327-eb4896cd-681b-4756-8c60-f33c9ac2af47&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.15601.20316&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This&amp;nbsp;security update also contains a fix&amp;nbsp;for the following nonsecurity issue&amp;nbsp;in Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an issue on Project Web App (PWA) pages, such as the Project Center, in which&amp;nbsp;the keyboard focus is lost when you select any item&amp;nbsp;through the keyboard from the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;View&lt;/STRONG&gt;,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;Filter&lt;/STRONG&gt;, and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;Group by&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;menus.&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;A title="November 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/november-2022-updates-for-microsoft-office-e6b5a7c3-6d58-49fc-abf3-bfee61caba68" target="_blank" rel="noopener noreferrer"&gt;November 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-november-8-2022-kb5002296-f6c47ad6-692f-4617-ae12-9ca05fa96e39" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-november-8-2022-kb5002296-f6c47ad6-692f-4617-ae12-9ca05fa96e39&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-november-8-2022-kb5002291-cd7749b3-0293-4d70-b836-eabf28ab5995" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-november-8-2022-kb5002291-cd7749b3-0293-4d70-b836-eabf28ab5995&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version: 16.0.15601.20238&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This security update also contains&amp;nbsp;fixes for the following nonsecurity issues in Project Server. Consider the following scenario:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;You have the Content Editor web part placed on a Project Detail Page (PDP).&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;You edit&amp;nbsp;a project in Project Web App (PWA).&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;While you are editing, the SharePoint web page security validation times out.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;You close the project, and you try to check in the project.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In this situation, the "Processing" toast appeared, but it never went away. Additionally, the project didn't get checked in. This issue is fixed so that now the following expected message appears:&lt;/P&gt;
&lt;DIV class="ocpAlert"&gt;
&lt;P&gt;The security validation for this page has timed out. Click Back in your Web browser, refresh the page, and try your operation again.&lt;/P&gt;
&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;On Project Web App (PWA) pages, such as the Project Center, fixes an issue in which you cannot use voice to access the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;View&lt;/STRONG&gt;,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;Filter&lt;/STRONG&gt;, and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;Group By&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;buttons.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="October 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/october-2022-updates-for-microsoft-office-4ebed600-ca67-4182-9377-59bf9b8650f0" target="_blank" rel="noopener noreferrer"&gt;October 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-october-11-2022-kb5002290-29091e4f-76fc-461e-abf0-233875cc1c69" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-october-11-2022-kb5002290-29091e4f-76fc-461e-abf0-233875cc1c69&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;DB Version: &lt;SPAN&gt;16.0.15601.20158&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="September 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/september-2022-updates-for-microsoft-office-c2275c44-52c0-4dde-8a04-98ee418a7bb8" target="_blank" rel="noopener noreferrer"&gt;September 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-september-13-2022-kb5002270-a5150614-316f-45d3-8126-340a3237d662" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-september-13-2022-kb5002270-a5150614-316f-45d3-8126-340a3237d662&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-september-13-2022-kb5002271-9b21704b-ce7b-4da8-93e4-b0d6f9dbbd8d" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-september-13-2022-kb5002271-9b21704b-ce7b-4da8-93e4-b0d6f9dbbd8d&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;DB Version: &lt;SPAN&gt;16.0.15601.20052&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="August 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-gb/topic/august-2022-updates-for-microsoft-office-9746a7c8-0c3e-4f4f-85d4-7ee3b29c80db" target="_blank" rel="noopener noreferrer"&gt;August 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-gb/topic/august-9-2022-update-for-sharepoint-server-subscription-edition-kb5002247-11f577a7-53b6-4e1d-a077-00c2aca9f584" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-gb/topic/august-9-2022-update-for-sharepoint-server-subscription-edition-kb5002247-11f577a7-53b6-4e1d-a077-00c2aca9f584&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-gb/topic/august-9-2022-update-for-sharepoint-server-subscription-edition-language-pack-kb5002233-fe2642f8-bdf3-47e0-b8ba-3b2d0d790ff4" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-gb/topic/august-9-2022-update-for-sharepoint-server-subscription-edition-language-pack-kb5002233-fe2642f8-bdf3-47e0-b8ba-3b2d0d790ff4&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;DB Version: 16.0.14931.20612&lt;/P&gt;
&lt;P&gt;This update also contains the following&amp;nbsp;fixes in Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an issue in which&amp;nbsp;the actual hour totals in timesheets are not always recalculated correctly.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an accessibility issue in which the name property of&amp;nbsp;the various cards in the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;Track your work&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;section isn't correct on the Project Web App home page.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an accessibility issue for the outline menu buttons in which the elements don't&amp;nbsp;have unique IDs.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="July 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-au/topic/july-2022-updates-for-microsoft-office-6449a9c6-3c9a-44de-a41c-dbe7a8e7ea3f" target="_blank" rel="noopener noreferrer"&gt;July 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-au/topic/july-12-2022-update-for-microsoft-sharepoint-server-subscription-edition-kb5002234-66a3e5c3-9696-460d-84f6-27cd44470026" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-au/topic/july-12-2022-update-for-microsoft-sharepoint-server-subscription-edition-kb5002234-66a3e5c3-9696-460d-84f6-27cd44470026&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;DB Version:&amp;nbsp;&lt;SPAN&gt;16.0.14931.20502&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="June 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-gb/topic/june-2022-updates-for-microsoft-office-d94d40c4-fea1-47a7-a376-6abd34397ae8" target="_blank" rel="noopener noreferrer"&gt;June 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-gb/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-june-14-2022-kb5002224-79a58952-d8be-40c4-b7b9-32c50f9198f8" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-gb/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-june-14-2022-kb5002224-79a58952-d8be-40c4-b7b9-32c50f9198f8&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-gb/topic/june-14-2022-update-for-sharepoint-server-subscription-edition-language-pack-kb5002225-e2ff6519-9350-418a-870c-c22a0067a3cd" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-gb/topic/june-14-2022-update-for-sharepoint-server-subscription-edition-language-pack-kb5002225-e2ff6519-9350-418a-870c-c22a0067a3cd&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version:&amp;nbsp;16.0.14931.20418&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="May 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-gb/topic/may-2022-updates-for-microsoft-office-54837d4f-8f41-4afb-bacd-aeecc22f0ae1?msclkid=8130166ed0e711ec940b11a40291d0ab" target="_blank" rel="noopener noreferrer"&gt;May 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-gb/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-may-10-2022-kb5002194-058d68b3-727b-4725-bb2b-589d8481dcd5" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-gb/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-may-10-2022-kb5002194-058d68b3-727b-4725-bb2b-589d8481dcd5&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-gb/topic/may-10-2022-update-for-sharepoint-server-subscription-edition-language-pack-kb5002144-d07dcb4c-6ffe-43bd-a54d-b23f1ba76ec4" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-gb/topic/may-10-2022-update-for-sharepoint-server-subscription-edition-language-pack-kb5002144-d07dcb4c-6ffe-43bd-a54d-b23f1ba76ec4&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;DB Version:&amp;nbsp;&lt;SPAN&gt;16.0.14931.20286&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="April 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-gb/topic/april-2022-updates-for-microsoft-office-da055139-678c-45f7-865b-8e9a8a556a70" target="_blank" rel="noopener noreferrer"&gt;April 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-gb/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-april-12-2022-kb5002191-93b96ecf-aeb6-42a3-8e3f-fc43d1ad4a86" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-gb/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-april-12-2022-kb5002191-93b96ecf-aeb6-42a3-8e3f-fc43d1ad4a86&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version:&amp;nbsp;16.0.14931.20196&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This security update also contains fixes and improvements for the following nonsecurity issues&amp;nbsp;in Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;Fixes the&amp;nbsp;&lt;STRONG class="ocpLegacyBold"&gt;DatabaseUndefinedError&amp;nbsp;&lt;/STRONG&gt;and&amp;nbsp;&lt;STRONG class="ocpLegacyBold"&gt;System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'pk_lt_uids' in the database&lt;/STRONG&gt;&amp;nbsp;errors that occur when you query lookup tables by using the SharePoint client-side object model (CSOM).&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P class="x-hidden-focus"&gt;Fixes an issue in which the language of the values inflag-type custom fields within an online analytical processing (OLAP) cube do not match the Project Server language.For example, the flag values appear as "True"&amp;nbsp;or "False"&amp;nbsp;in English, and they are "Vero"&amp;nbsp;or "Falso"&amp;nbsp;in Italian, but the values are always displayed&amp;nbsp;in the English form.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Fixes an issue in which upgrading from Project Server 2019 to Project Server Subscription Edition fails and generates an&amp;nbsp;"Object too new"&amp;nbsp;error message in some cases.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="March 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-gb/topic/march-2022-updates-for-microsoft-office-253cf85c-f5fd-48cf-8805-a2773c08a6ee" target="_blank" rel="noopener noreferrer"&gt;March 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-gb/topic/march-8-2022-update-for-microsoft-sharepoint-server-subscription-edition-kb5002165-151c658b-37e3-486b-bd83-8e3e69a37403" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-gb/topic/march-8-2022-update-for-microsoft-sharepoint-server-subscription-edition-kb5002165-151c658b-37e3-486b-bd83-8e3e69a37403&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version:&amp;nbsp;16.0.14326.20796&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This update also contains a fix&amp;nbsp;in Project Server:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P class=""&gt;Fixes the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG class="ocpLegacyBold"&gt;DatabaseUndefinedError&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;and&amp;nbsp;&lt;STRONG class="ocpLegacyBold"&gt;System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'pk_lt_uids' in the database&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;errors that occur when you query lookup tables by using the SharePoint client object model (CSOM).&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="February 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-gb/topic/february-2022-updates-for-microsoft-office-4b323baf-6213-40ab-81b2-aa37d83f7296" target="_blank" rel="noopener noreferrer"&gt;February 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-gb/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-february-8-2022-kb5002145-e15e1bdd-e28d-4027-85f3-747d3c24b450" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-gb/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-february-8-2022-kb5002145-e15e1bdd-e28d-4027-85f3-747d3c24b450&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version:&amp;nbsp;16.0.14326.20742&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This security update also contains a fix for the following nonsecurity issue&amp;nbsp;in Project Server.&amp;nbsp;Consider the following scenario:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;On a task, you set the Status Manager.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;You publish the project.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Later in the same editing session, you change the Status Manager&amp;nbsp;to a different manager.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;You publish the project.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In this situation, the Status Manager property does not get updated in reporting. Instead of reflecting the new Status Manager, the old one is still observed.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="January 2022 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/january-2022-updates-for-microsoft-office-c47975ca-64a8-4514-b0b2-175ab9715930" target="_blank" rel="noopener noreferrer"&gt;January 2022&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-january-11-2022-kb5002111-ff855b0d-f4f7-41e9-a03e-2912cd7f2bb1" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-january-11-2022-kb5002111-ff855b0d-f4f7-41e9-a03e-2912cd7f2bb1&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-january-11-2022-kb5002110-196ee39c-c32c-4af1-9400-50c4bc546c1d" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-january-11-2022-kb5002110-196ee39c-c32c-4af1-9400-50c4bc546c1d&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version:&amp;nbsp;16.0.14326.20714&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="December 2021 updates for Microsoft Office" href="https://support.microsoft.com/en-us/topic/december-2021-updates-for-microsoft-office-25d5edf1-0907-43a2-8e95-2c116583bd16" target="_self"&gt;December 2021&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-december-14-2021-kb5002045-2766a574-8f5e-43c1-9b15-a7c08d1cab18" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-december-14-2021-kb5002045-2766a574-8f5e-43c1-9b15-a7c08d1cab18&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-december-14-2021-kb5002047-d8284466-a5d7-4fc6-b45c-c753ee168b3e" target="_blank" rel="noopener"&gt;https://support.microsoft.com/en-us/topic/description-of-the-security-update-for-sharepoint-server-subscription-edition-language-pack-december-14-2021-kb5002047-d8284466-a5d7-4fc6-b45c-c753ee168b3e&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;DB Version:&amp;nbsp;16.0.14326.20620&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;RTM&amp;nbsp;&lt;SPAN&gt;DB Version:&amp;nbsp;16.0.14326.20450&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 09 Jul 2024 04:51:26 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/project-server-subscription-edition-public-updates/ba-p/3043464</guid>
      <dc:creator>bdiana</dc:creator>
      <dc:date>2024-07-09T04:51:26Z</dc:date>
    </item>
    <item>
      <title>Constraints, Calendars and Time Zones in Project</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/constraints-calendars-and-time-zones-in-project/ba-p/2758476</link>
      <description>&lt;P&gt;The idea for this posting came from some support questions that landed with some of my Dynamics 365 colleagues from users of Project Operations, but an interesting topic for any user of Project.&amp;nbsp; When facing a static screenshot and being asked why the duration is what it is, or why did my start date move the answer will always be "it depends" but in the vast majority of cases Project is doing exactly what it should - and based on the order of actions - exactly what you asked it to do!&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I'll start with an example - two tasks, in a fixed units based project, both assigned to me and they are apparently identical.&amp;nbsp; But are they?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Next I will add Alex Wilber to my twin tasks and see what happens.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Whoa!&amp;nbsp; These twins obviously are not identical!&amp;nbsp; It is a fixed units project, so it added 16h of work on each task for Alex, and that is ok - but why did the dates change?&amp;nbsp; And 3.25d duration? The first one was pushed out to finish 9/23 and the second says it needs to start 9/10 - and was marked as running late (the yellow highlight shows that if I hover over).&amp;nbsp; To understand the difference let's take a deeper look at the original tasks - and also understand how I created them.&lt;/P&gt;
&lt;P&gt;The first task I created as a 2d task, I did not set the dates, I just assigned myself (I started creating this blog post 9/16).&amp;nbsp; Both the project default working template and my resource calendar are Pacific Time.&amp;nbsp; The task start time is 9am.&lt;/P&gt;
&lt;P&gt;The second task I created with the start date set for today (9/16) and the finish date set for 9/17.&amp;nbsp; Then I also assigned myself.&amp;nbsp; At this point they appear identical, apart from the calendar icon on the finish date of the 2nd task, which only shows if the cell is either selected or I hover over.&amp;nbsp; Here I selected the cell then hovered over the other finish date to show the difference.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The star in the lower right corner indicates that there is a constraint.&amp;nbsp; If I open up the calendar dialog this shows me exactly what is set.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The task is constrained to finish no earlier than 9/17/21.&amp;nbsp; This happened because I chose the finish date by making an explicit selection, whereas in the first task the finish date was scheduled by project, as the end of the 2 day task that started on the project start date.&amp;nbsp; Best practice when scheduling is to not set any dates that do not explicitly need to be set.&amp;nbsp; The project will flow based on the project start date, the durations, and any tasks set to depend on other tasks.&amp;nbsp; That way if the project needs to be pushed back a week I can just change the project start date and all dates will move.&amp;nbsp; If have constrained any dates they will not move.&lt;/P&gt;
&lt;P&gt;Now we know why the tasks behaved differently we can look at why the duration changed to 3.25d when I added Alex, and why it didn't just stay at 2 days.&amp;nbsp; The answer lies in Alex's calendar, and his working day in 9am to 12pm daily - so only 3 hours of work can be completed each day.&amp;nbsp; If I hover over the finish date of the first task I see it completes at 10am.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Alex works 3h per day on the 16th, 17th, 20th, 21st and 22nd, then completes his 16h of effort on the 23rd by working from 9am to 10am.&amp;nbsp; The 3.25d is the calculated duration for the task - with the first two days seeing me complete 16h work and Alex 6h (22h total) then the remaining 10h is another 1.25 * 8 hour days.&amp;nbsp; Currently this is a hard-coded hours per day calculation that Project uses.&lt;/P&gt;
&lt;P&gt;The calculation is the same for the 2nd task, except that the finish date is constrained - so it would need Alex to start his assignment at 11am on 9/10 to do the remaining 5 * 3h days to complete by 9/17.&amp;nbsp; As Alex does not have a time machine the PM will need to intervene here and probably removing the constraint is the best solution.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let's take a look at adding a different resource in place of Alex, and this time I'll choose Lidia.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Interesting!&amp;nbsp; We know why the 2nd task starts earlier as the finish still has the constraint, but that 4 day duration is intriguing - as the task actually looks shorter than the 3.5 day duration we saw earlier?&amp;nbsp; What gives?&amp;nbsp; Time to look at Lidia's calendar.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;I've included the left hand part to show what I see in her calendar in my time zone display, as well as the dialog of the calendar settings which shows Lidia's time zone (GMT +1) and the actual local hours she works.&amp;nbsp; In my time zone, which is where the project was created, Lidia can start at midnight, has a 1h break at 3am, then works 4.5h in the afternoon - making a 7.5 hour day.&amp;nbsp; So how does this project get worked?&amp;nbsp; Let's look at the first task, and if I hover over I see the start time as 8am.&amp;nbsp; This 'may' be a bug, and I'd normally expect it to be 9am - still investigating exactly why this is...&amp;nbsp; But we'll go with it for now.&amp;nbsp; On 9/16 I work 8h from 9 to 5, and Lidia works from 8am to her finishing time of 8:30 am, so just 0.5h.&amp;nbsp; On 9/17 I work 8h from 9 to 5 and Lidia works 7.5h, from midnight to 8:30am, less 1h.&amp;nbsp; On 9/20 Lidia also works 7.5h so at that point has completed 15.5h of the 16 - with the final 30 minutes completed on the 21st at 12:30am - and this is confirmed by the finish time if I hover over:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;This all turns into a 4 day duration as we have 8.5h on 9/16 (Lidia's 8am to 8:30 plus my 9 to 5) then on 9/17 we have midnight to 5pm, less 1.5h for Lidia's break and the gap between 8:30 and 9am - so 15.5 hours, then 7.5h on 9/20 and finally 0.5h on 9/21.&amp;nbsp; That makes 32.&amp;nbsp; 32 divided by 8 = 4.&amp;nbsp; In this case working across time zones extends the day so the duration calculation can be a little counter intuitive.&amp;nbsp; Two people working concurrently can have 1 day duration and work 16h if each has an 8h calendar - but if they are in time zones that do not overlap then it could be 2 days instead!&lt;/P&gt;
&lt;P&gt;With the Project client previously, and Project Online the working time was not taking account of time zones, and customers would need to be creative with setting all working calendars on a consistent time zone.&amp;nbsp; Now Project for the web supports time zones it makes that a lot easier to manage in some ways, but just be careful to understand the different calendars that may come into play - from the initial working time that the Project gets created in - which will drive the overall start time - to all the resources and their calendars.&amp;nbsp; If my plan also had dependencies between resources working on different time zones then you can see how that would have added another layer of complexity.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 21 Sep 2021 12:00:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/constraints-calendars-and-time-zones-in-project/ba-p/2758476</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2021-09-21T12:00:00Z</dc:date>
    </item>
    <item>
      <title>Schedule Modes, and task and resource usage in Project for the web</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/schedule-modes-and-task-and-resource-usage-in-project-for-the/ba-p/2656738</link>
      <description>&lt;P&gt;The ability to choose different scheduling modes was one of the recent features to be added to Project.&amp;nbsp; This means that at the project level you can choose:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Fixed Duration (out-of-the-box default)&lt;/LI&gt;
&lt;LI&gt;Fixed Effort (work)&lt;/LI&gt;
&lt;LI&gt;Fixed Units&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;You can also choose at the organization level if you&amp;nbsp; want to have a different default, and if you want to allow anything other than the default to be used.&amp;nbsp; Once you change the setting then all future projects will have that default (or a set mode if you allow it).&amp;nbsp; There is no change to existing projects.&amp;nbsp; (8/19/2021 - I added a note on how to navigate to the setting - scroll right to the end of the document)&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;As you can see, I have left my default as fixed duration, but changed the other option to allow Project Level Schedule Mode Overrides.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once the schedule Mode Override is allowed, you can then choose the schedule mode when creating a new project.&amp;nbsp; Here I have changed the project to use Fixed units.&amp;nbsp; Once set it cannot be changed:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The behavior is the same as in previous versions of Project and obeys the expected 'Effort&amp;nbsp; = Duration x Units' formulae, so the article at&amp;nbsp;&lt;A href="https://support.microsoft.com/en-us/office/change-the-task-type-for-more-accurate-scheduling-b0b969ad-45bc-4e9e-8967-435587548a72" target="_blank" rel="noopener"&gt;Change the task type for more accurate scheduling - Project (microsoft.com)&lt;/A&gt;&amp;nbsp;is still very much applicable.&amp;nbsp; (Note: This article uses the term 'Work' to refer to 'Effort'.&amp;nbsp; One difference to earlier versions currently, is that the mode is set for the complete project and cannot be set on a task-by-task basis.&amp;nbsp; I'll give examples of each, and also explain what is happening behind the scenes (and show how to 'see' behind the scenes), as there are some scenarios where it might not initially be obvious what is going on.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;I've created 3 projects, one of each mode, and so far they have no tasks.&amp;nbsp; I have actually opened the tasks pane for each plan - and this action has set the Finish Date and Earliest Start Date values - which when the plan is initially created are not populated in this view.&lt;/P&gt;
&lt;P&gt;Lets start with the default, a fixed duration plan.&amp;nbsp; I'm going to add a task of 5 days:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If this is 5 day task maybe the first question is why does it start 'today' (I'm writing this on 8/16) but not finish until next Monday?&amp;nbsp; Shouldn't it finish on Friday?&amp;nbsp; One clue to what's going on here can be found on the Summary tab, where we also see the time as well as the date:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Next I make an assignment and add myself to that task and as expected I see 40h effort (work) as I work the default 8h day.&amp;nbsp; If my calendar was different from the project calendar I might see the start times change.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;If I add another resource then my duration is fixed at 5 days, and my work increases to 80h.&amp;nbsp; 80h = 5 days * 2 units (8h/day).&amp;nbsp; All looks good!&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Now the same steps for fixed effort:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Looks the same.&amp;nbsp; But lets re-run that, but I'll make the assignment and save, and then set the duration to 5 days:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;What was the difference?&amp;nbsp; It is a fixed effort task, and the effort gets fixed when there is effort added, so in the 2nd task the effort was 'fixed' at 8h then the duration increased to 5 days, whereas the first one I have 5 days already, so it adds 5 full days of effort before 'fixing' the effort.&amp;nbsp; One thing I found useful in looking behind the scenes is to use Power BI and look at the project, task and assignment data - which gives a sort of 'task usage' or 'resource usage' view, but without the timephased part.&amp;nbsp; This shows that my assignment dates match the tasks so my work is spread over the 5 days:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Adding a second resource to the fixed effort task results in the fixed amount of work being shared between Lidia and me - but what's with the odd durations?&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The 2.5 days makes sense - lets see how project shared the work for that 0.83 day assignment:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The first assignment is shared quite neatly, but the 2nd is split in a 5 to 1 ratio, due to the way the duration and assignments were set for each one.&amp;nbsp; For those who think the sky is falling right now - here are the exact same steps executed in the Project desktop client to show that this is working EXACTLY as Microsoft Project always has! The scheduling engine behind the new Project is the same as it has always been.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;On to the last mode, fixed units.&amp;nbsp; Same steps.&amp;nbsp; Cut to the chase, as the work is not fixed in this case the order of adding the assignment and extending the duration makes no difference - both tasks show the same 40h work:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;If we add another resource we again see the exact same behavior as in the desktop client of Project, and the effort increases to 80 hours as we now have 2 units (people) for 5 * 8 h.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;In the desktop client there is an addition option to allow 'effort driven' Fixed Unit tasks - and in that case the worked would have stayed at 40h.&amp;nbsp; That option is not available here.&lt;/P&gt;
&lt;P&gt;Increasing the duration at this point will also increase the work, as our units are fixed (at 2).&amp;nbsp; As a double check I also show the Power BI view of things at this stage:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;These examples have been quite straightforward with only the fixed effort needing a little more explanation, but it can get more complicated in an active project with assignments added while tasks are actively being worked and effort already recorded, so that it is less obvious what is going on.&amp;nbsp; I think that is when Power BI might help with the ability to see the tasks and assignment data so you will be able to confirm why dates are as they are.&amp;nbsp; One common example might be a task not showing complete when all the work is apparently done - but it could be that the duration is not complete yet - and the assignments may all finish before the end date of the tasks.&amp;nbsp; As an example, if some effort is completed and then duration extended and another assignment made - you can get something like this - which from the tasks view in Project it will not be obvious that the 2nd assignment does not start until the 2nd day - but Power BI shows us the details:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;One final point to mention before I explain the duration calculation that gave us the 0.83d earlier - is that it is possible to set the schedule mode options for the default environment of Project for the web, as well as named environments, but as your users will likely be living in the 'project.microsoft.com' experience and not the Dynamics one, they will not be seeing the 'Summary' tab and therefore not aware of the schedule more that has been set.&amp;nbsp; This could get confusing for users - so just be aware that it could happen.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So how did that 0.83d duration for the Fixed Effort task calculation work?&amp;nbsp; Initially I was assigned and that triggered 8h effort for my default day.&amp;nbsp; The duration was increased, but with effort fixed the work was spread out to 1.6 hours each day for 5 days, or 0.2 hours (12 minutes) of effort for each hour.&amp;nbsp; When Lidia was also assigned she could do 8h per day, or 1h of effort for each hour.&amp;nbsp; For the first hour of the day we therefore have 1h work from Lidia and 12 minutes from me - so 1.2h.&amp;nbsp; After 6 hours we have completed 7.2h of the 8h effort required, so at the same rate in the next hour it only takes 40 minutes to complete the remaining 0.8h (48 minutes) with me contributing 8 minutes to Lidia's 40.&amp;nbsp; 6h 40m = 6.67h.&amp;nbsp; 6.67/8 = 0.83 (to 2 decimal places).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As a final validation I also used the 'export user data from Project for the web' PowerShell sample (&lt;A href="https://docs.microsoft.com/en-us/project-for-the-web/export-user-data-from-project-for-the-web" target="_blank" rel="noopener"&gt;Export user data from Project for the Web - Project for the web | Microsoft Docs)&amp;nbsp;&lt;/A&gt;on a fresh example of the Fixed Effort project - and in this specific repro the start times was 4pm, so I actually see 1h of time available on the first day - but I can see the task usage view exactly the same as if I'd created the plan in Project:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;I hope you have found this post useful, and certainly in my many years of supporting Project when a customer comes in with a "Project is calculating this incorrectly' case the answer is usually that there is a good (logical?) explanation and Project is working as designed!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Admins - To get to the Project parameters setting to change the organization default go to the lower left corner when in your Project Power App and click &lt;STRONG&gt;Project&lt;/STRONG&gt; (where you see the blue '&lt;STRONG&gt;P&lt;/STRONG&gt;' and in the &lt;STRONG&gt;Change Area&lt;/STRONG&gt; menu that appears select &lt;STRONG&gt;Settings&lt;/STRONG&gt;. Click the long GUID in the Default Organizational Unit column, then under the &lt;STRONG&gt;Related &lt;/STRONG&gt;tab select Project Parameters,&amp;nbsp; Click the word &lt;STRONG&gt;Parameter&amp;nbsp;&lt;/STRONG&gt;in the description column and you will then see the options to choose and set the &lt;STRONG&gt;Schedule Mode&lt;/STRONG&gt; and &lt;STRONG&gt;Project Level Schedule Mode Override Permitted&lt;/STRONG&gt; option. (and thanks to Chad Olson - the proper navigation is select the row with the log GUID and then &lt;STRONG&gt;Edit&lt;/STRONG&gt;&amp;nbsp;- this will save a couple of steps).&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 20 Aug 2021 17:04:13 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/schedule-modes-and-task-and-resource-usage-in-project-for-the/ba-p/2656738</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2021-08-20T17:04:13Z</dc:date>
    </item>
    <item>
      <title>Getting M365 Admin Center info with the Graph API</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/getting-m365-admin-center-info-with-the-graph-api/ba-p/2653539</link>
      <description>&lt;P&gt;I wrote the original message center to Planner integration using the Office 365 Communications API, but this has now moved over to the Graph API, and the older API will no longer be available past the end of the year.&amp;nbsp; The built-in Message Center to Planner will have no issues of course, but if you used my code, or the additional Service Health Dashboard code I added a while back then you will need to update.&amp;nbsp; The code now fully uses MSAL for authentication and Graph to read both Message Center and Service Health Dashboard data.&amp;nbsp; It didn't need much changing, but I did notice that the MC posts now have a new reference type of 'Roadmap ID' which I am not using and it broke my code as I was only expecting an external link.&amp;nbsp; I just filter for the external links for now, but I'll likely come back and add Roadmap info and hopefully tie this into details from the M365 Roadmap too.&lt;/P&gt;
&lt;P&gt;The code can be found at&amp;nbsp;&lt;A href="https://github.com/LunchWithaLens/AdminCenterAutomation" target="_blank"&gt;LunchWithaLens/AdminCenterAutomation: Updated code to use MSAL, as well as simplifying to loop on products not tasks - hence fewer queue items. Also added a function for SHD posts into Teams channels. (github.com)&lt;/A&gt;&amp;nbsp;and I won't walk-through it here as the basics haven't changed since the last walk-through blog post.&lt;/P&gt;
&lt;P&gt;The code does two things:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The original message center to Planner sync - not as convenient as the built-in code, but useful if you need to push into different plans or assign to various different people.&amp;nbsp; This writes a queue entry for each workload then another Azure function pulls these off and writes to Planner&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 2.&amp;nbsp; Pushes service incident data into Teams, and will also&amp;nbsp;@mention someone too.&amp;nbsp; Subsequent updates will add to the thread.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;This code might also be useful just to see how to write into a teams channel and a thread and&amp;nbsp;@ mention.&lt;/P&gt;
&lt;P&gt;I might get around to porting these to C# at some point, and I really ought to tidy up the posts that have HTML formatting in them too!&lt;/P&gt;</description>
      <pubDate>Mon, 16 Aug 2021 18:33:04 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/getting-m365-admin-center-info-with-the-graph-api/ba-p/2653539</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2021-08-16T18:33:04Z</dc:date>
    </item>
    <item>
      <title>For those Microsoft 365 changes that need a project to implement</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/for-those-microsoft-365-changes-that-need-a-project-to-implement/ba-p/2157127</link>
      <description>&lt;P&gt;*** 4/27/2021 - If you have used this and get the "Resource not found for segment" error, then this means you are using the new Dataverse connector which expects the OData format for the record and not just the GUID.&amp;nbsp; I've updated below to reflect this ***&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This blog post grew out of a conversation with one of my Microsoft colleagues about how one would push a Planner task to Azure DevOps - and the scenario was that they are very happy with the Message Center to Planner integration as a means to triage changes as they come through - but to actually execute on the changes they would normally use Azure DevOps.&amp;nbsp; So I got my thinking cap on and took a look at what was available in Power Automate.&lt;/P&gt;
&lt;P&gt;Planner is somewhat limited in direct actions and triggers, but of course you can use the Graph API too once you get a Flow started - but the trigger is what you need here and I wanted to avoid a timer job just looking in Planner.&amp;nbsp; The "On completed" trigger seemed like the best approach, as if you were carrying out the work in Azure DevOps (or Project) then the plan task could be closed.&amp;nbsp; Then with the number of supported labels increasing in the very near future I thought that, combined with a complete task, would get me started.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Power Automate then has an action to read the Planner labels, so I could check if the task needed to go to Azure DevOps - and if so use the "Create a work item" action.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this example I decided to create as a Feature - and in the description I crafted a link that would navigate back to the Planner task to get the full information.&amp;nbsp; A proper job here would probably involve a few more steps to read the information and populate it into Azure DevOps, but as a quick proof of concept it worked for what I needed.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And here is my newly created Azure DevOps feature.&lt;/P&gt;
&lt;P&gt;My next thought was - that nice - but what if I want to use Project Online or the new Project to manage a Microsoft 365 change?&amp;nbsp; (The eagle eyed may have already seen the :Send to Project Online and Send to PfW in my labels list) so I extended my Flow to also look at those labels and react accordingly.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It is important to mention here that I am creating these as projects in Project Online and Project for the web - and not as tasks - as the assumption is that you would use this when you needed more than just a task (otherwise why not leave in Planner?).&amp;nbsp; Likewise for Azure DevOps - I created a feature but there may well be other entities added to deliver the change.&lt;/P&gt;
&lt;P&gt;For the examples I've used I'll admit that these could probably just have been handled in Planner - as I can't imagine our adding of text predictions justifies a complete project plan to ready users...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;And in the new Project we see the other task turned to a plan - in this case in a different environment than the default using the new flexible deployments option.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The Flow was pretty basic adding these two too - just a condition driven by the label that was applied, then the Create a new Project for Project Online (as the description doesn't support HTML I didn't create the href):&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;and for the new Project in the Dataverse environment I used the following:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;(updated 4/27/201 with new Dataverse connector details)&amp;nbsp; With the new Dataverse connector the "add a new row" option expects the OData format, so I used the Get a new row by ID to get the 4 required fields:&lt;/P&gt;
&lt;DIV id="tinyMceEditorBrian Smith_0" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Then for each field in the dynamic content section I can get the OData id which is the right format.&amp;nbsp; I think I could also hard-code to the plural table name and the GUID - which might save some calls.&amp;nbsp; Note that the 4 OData id's are different - and selected from the appropriate section in the dynamic content.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The tricky piece here was working out what the GUIDs needed to be, and I used the option to open the datasets in Excel to get a good look at the GUIDs so I could test out and confirm what these needed to be.&amp;nbsp; You can do this (permissions allowing) by going to make.powerapps.com, selecting the environment, then under Data, Tables select the table of interest (set filter to "All") then use the "Edit data in Excel option (don't get too excited - you can't really edit the data for this Project stuff in Excel).&lt;/P&gt;
&lt;P&gt;Calendar Id can be found from the Calendar column of the Work template table – in my case I only had one work template, the default – so not problem using just this one – you might need to have some way to choose if your config is more complex.&lt;/P&gt;
&lt;P&gt;Contracting Unit can be found as the Contracting Unit column in the Project table – and again I just had one so ok to hard code – your mileage may vary (Don’t confuse it with the Contracting Unit (Lookup) field…).&lt;/P&gt;
&lt;P&gt;Project Manager comes from the Project Manager column in the Project table, and has its origins in the User table and the User column.&amp;nbsp; It is NOT the same as the AAD GUID.&lt;/P&gt;
&lt;P&gt;Like the Azure DevOps example you'd probably want to add a few more steps to pull more information in - and I did skip a big "gotcha" on the Project Online side - as Project Online does not allow certain characters in a Project name I chose my example carefully.&amp;nbsp; You'd need to swap out any occurenace of the following characters -&amp;nbsp;: .(period) \ " / : ; | ? ' &amp;lt; &amp;gt; * # ~ % { } +.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Finally - a screenshot of the whole Flow (before the new Dataverse connector stuff which is shown above):&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let me know what you think - and what would make managing Microsoft 365 changes easier?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 27 Apr 2021 18:15:19 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/for-those-microsoft-365-changes-that-need-a-project-to-implement/ba-p/2157127</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2021-04-27T18:15:19Z</dc:date>
    </item>
    <item>
      <title>Enterprise Global not loading after migration to Project Server 2019</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/enterprise-global-not-loading-after-migration-to-project-server/ba-p/1950834</link>
      <description>&lt;P&gt;Great to see so many people upgrading to the latest - but one issue we have heard is that the Enterprise Global template (EGT) cannot be opened in Project Server 2019 after the migration.&amp;nbsp; The problem appears to be that the Project UID for the EGT is changed - then it cannot be found under its new GUID.&amp;nbsp; Often this is seen to be happening when migrations start at an earlier release - like 2010 or 2013, but from the reports we have the problem only occurs at the final stage - and the EGT opened just fine in 2016.&lt;/P&gt;&lt;P&gt;The solution requires a bit of work in SQL Server, so if you are not comfortable working in SQL then either work with the database administrator for Project Server - or of course open a support ticket.&amp;nbsp; Always best too - if you either take a SQL backup before making any changes - or make the changes just after your normal backups occur - in case you need to revert.&lt;/P&gt;&lt;P&gt;To detect the issue you would first run a query like this one - substituting your content database name for dbname:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;use dbname&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;select PROJ_UID, PROJ_NAME from pjpub.msp_projects where proj_name like '%eglobal%'&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This may return a result similar to the following:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;PROJ_UID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROJ_NAME&lt;/P&gt;&lt;P&gt;75CDD7DB-1B68-4B70-A8D6-2FE52DA83ACD&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EGlobal&lt;/P&gt;&lt;P&gt;87537CC3-5AF6-421E-A42F-A27CB2A2EFA2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EGlobal-20150320041555&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here, the EGlobal has the proper association to PROJ_UID = 75CDD7DB-1B68-4B70-A8D6-2FE52DA83ACD (this is the static GUID) and an older version of the EGlobal is shown here (the second row).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;If the EGlobal has a different UID, then it’ll need to be updated to use the proper one.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For example, suppose the returned result looks like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;PROJ_UID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROJ_NAME&lt;/P&gt;&lt;P&gt;DF59652B-073D-4FB1-A16E-1F7233C439AE&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EGlobal&lt;/P&gt;&lt;P&gt;87537CC3-5AF6-421E-A42F-A27CB2A2EFA2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EGlobal-20150320041555&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You’d need to run an update query that looks similar to this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;use dbname&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Update pjpub.msp_projects&lt;/P&gt;&lt;P&gt;Set PROJ_UID = '75CDD7DB-1B68-4B70-A8D6-2FE52DA83ACD'&lt;/P&gt;&lt;P&gt;where PROJ_UID = 'DF59652B-073D-4FB1-A16E-1F7233C439AE'&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Use the GUID (in this example starting 'DF59,,,' that is the incorrect GUID returned from the previous select statement.&lt;/P&gt;&lt;P&gt;If this doesn't solve the problem - or if the GUID looks to be ok, then you have a different problem and would need to open a support ticket.&lt;/P&gt;&lt;P&gt;Thanks to Adrian and Ajith for help with putting these details together - and Dale and Paul for alerting us to the issue.&lt;/P&gt;&lt;P&gt;My suspicion is that this is a 2019 client issue - as just changing the GUID to try and repro the issue in 2016 does not give any problems - the EGT opens just fine whatever GUID it has...&lt;/P&gt;</description>
      <pubDate>Wed, 02 Dec 2020 23:30:15 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/enterprise-global-not-loading-after-migration-to-project-server/ba-p/1950834</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2020-12-02T23:30:15Z</dc:date>
    </item>
    <item>
      <title>App + User authentication and Project Online development</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/app-user-authentication-and-project-online-development/ba-p/1925443</link>
      <description>&lt;P&gt;With the most recent updates to the SharePoint client object model (CSOM) libraries it is now possible to authenticate to SharePoint and Project Online with the MSAL libraries rather than ADAL - and this opens up the use of .NET Standard rather than needing the .NET Framework.&amp;nbsp; This DOES NOT however mean that Project Online supports App ID only authentication.&amp;nbsp; SharePoint Online does support app only - but the additional authorisation level in Project to understand who the user is and what they can do requires app + user.&amp;nbsp; See more information here -&amp;nbsp;&lt;A href="https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/using-csom-for-dotnet-standard" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/using-csom-for-dotnet-standard&lt;/A&gt;&amp;nbsp;and the API permissions you can choose are shown here. Im my example I've just selecting the Project.Write which allows me to create and update a project.&lt;/P&gt;&lt;DIV class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;&lt;P&gt;&lt;img /&gt;&lt;/P&gt;&lt;P&gt;You application would need to reference the Application (Client) ID associated with these permissions when requesting token - but would also need to pass in the credentials of a user with permissions and license to Project Online.&amp;nbsp; This could be an interactive login - or using a securely stored username and password (not recommended) or using a stored token that is refreshed periodically.&amp;nbsp; Attempting to connect by with the application ID will fail with an "unauthorized" response.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;As an example, the following code would get the token and set for project context to make further CSOM calls:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;            string domainName = "brismith.onmicrosoft.com";
            string PJOAccount = "brismith@brismith.onmicrosoft.com";
            string scope = "https://brismith.sharepoint.com/Project.Write";
            string redirectUri = "http://localhost";
            string pwaInstanceUrl = "https://brismith.sharepoint.com/sites/pwa/";         // your pwa url
            int DEFAULTTIMEOUTSECONDS = 300;
            

            HttpClient Client = new HttpClient();
            var TenantId = ((dynamic)JsonConvert.DeserializeObject(Client.GetAsync("https://login.microsoftonline.com/" + domainName + "/v2.0/.well-known/openid-configuration")
                .Result.Content.ReadAsStringAsync().Result))
                .authorization_endpoint.ToString().Split('/')[3];

            // This client ID just has project.write
            PublicClientApplicationBuilder pcaConfig = PublicClientApplicationBuilder.Create("87edf46a-466d-4241-8afc-b9650d7fb0d7")
            .WithTenantId(TenantId);

            pcaConfig.WithRedirectUri(redirectUri);

            // This section uses the interactive flow for auth
            var TokenResult = pcaConfig.Build().AcquireTokenInteractive(new[] { scope })
                .WithPrompt(Prompt.NoPrompt)
                .WithLoginHint(PJOAccount).ExecuteAsync().Result;


            //The following section uses the username and password - this would be best pulled from Azure Key Vault or use another auth flow
            //This also requires the app registration to be set as a public client
            //SampleConfiguration config = SampleConfiguration.ReadFromJsonFile("appsettings.json");
            //string text1 = config.Text1;
            //var sc = new SecureString();
            //foreach (char c in text1) sc.AppendChar(c);

            //var TokenResult = pcaConfig.Build().AcquireTokenByUsernamePassword(new[] { scope }, PJOAccount, sc).ExecuteAsync().Result;

            // Load ps context
            csom.ProjectContext psCtx = new csom.ProjectContext(pwaInstanceUrl);
            psCtx.ExecutingWebRequest += (s, e) =&amp;gt;
            {
                e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + TokenResult.AccessToken;
            };&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;- using the latest MSAL (Microsoft.Identity.Client v4.22) and Microsoft.ProjectServer.Client from Microsoft.SharePointOnline.CSOM 16.1.20616.12000 at the time of writing.&amp;nbsp; These will also work with legacy auth disabled which is a setting that may break some existing custom applications.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;To check if legacy auth is disabled you can open the SharePoint Online Management shell, connect to your admin Url and run Get-SPOTenent.&amp;nbsp; Look in the returned properties for:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;LegacyAuthProtocolsEnabled : False&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;which in my case shows that legacy auth is disabled.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Hopefully we will get the sample on Github updated with this latest information.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Nov 2020 22:43:50 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/app-user-authentication-and-project-online-development/ba-p/1925443</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2020-11-23T22:43:50Z</dc:date>
    </item>
    <item>
      <title>Project Online: Adding tasks where you want them with Power Automate</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/project-online-adding-tasks-where-you-want-them-with-power/ba-p/1148542</link>
      <description>&lt;P&gt;This is a guest post from Daniel Partridge - who answered an internal enquiry at Microsoft, for a colleague who needed to add a task under a summary using Power Automate (Flow).&amp;nbsp; Great timing as Daniel was also looking at the same challenge.&lt;/P&gt;
&lt;P&gt;In Daniel's words and pictures:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In order to accomplish this, I used the “Send and HTTP Request to SharePoint” action in my Power Automate flow, and the&amp;nbsp;end result appears in the schedule as shown in this image:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The flow process would be as follows (*IMPORTANT: The REST API to use for this would be &lt;STRONG&gt;ProjectServer&lt;/STRONG&gt; vs. &lt;STRONG&gt;ProjectData&lt;/STRONG&gt; in the URL).&amp;nbsp; ProjectData is used for reporting - OData.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Get the Project Id (GUID)&lt;/LI&gt;
&lt;LI&gt;Get the Id (GUID) of the Summary task&lt;/LI&gt;
&lt;LI&gt;Checkout Project - Power Automate Project Online Action&lt;/LI&gt;
&lt;LI&gt;Send HTTP Request to SharePoint - Power Automate SharePoint Action&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;HTTP POST: _api/ /Draft/Update()/Projects('ProjectGUID')/Draft/Tasks/Add()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Header JSON&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "Accept": "application/json;odata=nometadata",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "Content-Type": "application/json"&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Body JSON&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; "parameters":&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Name": "task title",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Notes": "task notes",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Duration": "2d",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "ParentId": "summaryTaskGUID"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Send HTTP Request to SharePoint - Power Automate SharePoint Action&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;HTTP POST: _api/&lt;STRONG&gt;ProjectServer&lt;/STRONG&gt;/Projects('ProjectGUID')/Draft/Update()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Header JSON&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "Accept": "application/json;odata=nometadata",&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "Content-Type": "application/json"&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Body JSON&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Leave blank&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Check-in and publish Project - Power Automate Project Online Action&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The images below show an example using the Power Automate Project Online Action for “Creates new task” which is unnecessary if you are using the Project Summary task or some other task that already exists to link to as the parent task:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks Daniel for sharing, and I hope this helps other people using Power Automate and Project Online to get their tasks flowing into their projects just where they want them!&amp;nbsp;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 03 Feb 2020 18:46:37 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/project-online-adding-tasks-where-you-want-them-with-power/ba-p/1148542</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2020-02-03T18:46:37Z</dc:date>
    </item>
    <item>
      <title>My holiday gift to you - update posts are up to date!</title>
      <link>https://techcommunity.microsoft.com/t5/project-support-blog/my-holiday-gift-to-you-update-posts-are-up-to-date/ba-p/1082023</link>
      <description>&lt;P&gt;I'd let these slip a bit - but I just updated the Project 2016, Project Server 2016 and Project Server 2019 posts with the updates through to December 2019.&amp;nbsp; For the 2019 client - the updates can be found at&amp;nbsp;&lt;A href="https://docs.microsoft.com/en-us/officeupdates/monthly-channel-2019" target="_blank"&gt;https://docs.microsoft.com/en-us/officeupdates/monthly-channel-2019&lt;/A&gt;&amp;nbsp;or&amp;nbsp;&lt;A href="https://docs.microsoft.com/en-us/officeupdates/semi-annual-channel-2019" target="_blank"&gt;https://docs.microsoft.com/en-us/officeupdates/semi-annual-channel-2019&lt;/A&gt;&amp;nbsp;depending on the channel you get Office through (Monthly or Semi Annual - other channels are available)&lt;/P&gt;
&lt;P&gt;&lt;A title="Project 2016 updates - from January 2017 to December 2019" href="https://techcommunity.microsoft.com/t5/Project-Support-Blog/Project-2016-Public-Updates-January-2017-to-date/ba-p/387755" target="_blank" rel="noopener"&gt;Project 2016&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="Project Server 2016 public updates" href="https://techcommunity.microsoft.com/t5/Project-Support-Blog/Project-Server-2016-Public-Updates/ba-p/387845" target="_blank" rel="noopener"&gt;Project Server 2016&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A title="Project Server 2019 public updates" href="https://techcommunity.microsoft.com/t5/Project-Support-Blog/Project-Server-2019-Public-Updates/ba-p/627952" target="_self"&gt;Project Server 2019&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 27 Dec 2019 22:01:28 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/project-support-blog/my-holiday-gift-to-you-update-posts-are-up-to-date/ba-p/1082023</guid>
      <dc:creator>Brian-Smith</dc:creator>
      <dc:date>2019-12-27T22:01:28Z</dc:date>
    </item>
  </channel>
</rss>

