User Profile
johnjohn-Peter
Iron Contributor
Joined 2 years ago
User Widgets
Recent Discussions
Get-PnPSiteTemplate: The remote server returned an error: (403) Forbidden
I want to copy one site collection from one tenant to another, so on the source tenant, I created this App Registering and I grant it full control on SharePoint:- And I define to use secret for the authentication:- Then I run this command:- Connect-PnPOnline -Url "https://****.sharepoint.com/sites/****Integration" -ClientId "***" -ClientSecret "ptv**" Connecting with Client Secret uses legacy authentication and provides limited functionality. We can for instance not execute requests towards the Microsoft Graph, which limits cmdlets related to Microsoft Teams, Microsoft Planner, Microsoft Flow and Microsoft 365 Groups. You can hide this warning by using Connect-PnPOnline [your parameters] -WarningAction Ignore then i got this error, when i tried to Get the site template:- Get-PnPSiteTemplate -Out "Integration.xml" Get-PnPSiteTemplate : The remote server returned an error: (403) Forbidden. Any advice? i remember i did this operation 1 year ago and it worked well. Thanks69Views0likes3CommentsLevel of customization in the new SharePoint Forms
Recently I got the new Forms feature inside our lists:- And seems it provides a better layout compared to the built-in forms. and more options for customization. but I am not sure if those forms can totally replace customizing forms using Power Apps, such as :- Hiding a field based on other field value? Make a field optional/mandatory based on other field value? Wrap certain fields under sections? something as follow:- in other words, does this form provide the same level of customization which we can do using Power Apps? ThanksSolved68Views1like2CommentsHow i can reOrder the Channel Tabs using graph API inside our Teams apps
I am working on a Teams App >> which creates a new SharePoint modern Teams Site + new Channels + tabs inside the channels. The final result will be as follow: - Now I want to reorder the tabs inside the General channel, mainly by moving the Notes tab to be the last tab, here is the method i have which mainly sets the sortOrderIndex for the Notes tab to be "6": - //ReOrder General Channel Tabs public async reorderTabs(graph: any, teamGroupId: any, channelID: string, tabName: string) { try { //get URL for the tab const tabsGraphEndPoint = graphConfig.teamsGraphEndpoint + "/" + teamGroupId + graphConfig.channelsGraphEndpoint + "/" + channelID + graphConfig.tabsGraphEndpoint; const tabs = await this.getGraphData(tabsGraphEndPoint, graph) // Find the "Notes" tab const notesTab = tabs.value.find((tab: any) => tab.displayName === "Notes"); if (notesTab) { // Update the orderHint to move the "Notes" tab to the end const updateTabEndpoint = graphConfig.teamsGraphEndpoint + "/" + teamGroupId + graphConfig.channelsGraphEndpoint + "/" + channelID + graphConfig.tabsGraphEndpoint + "/"+ notesTab.id; const lastOrderHint = tabs.value[tabs.value.length - 1].orderHint; // Set the orderHint to something greater than the last tab's orderHint const newOrderHint = "6"; await this.sendGraphPatchRequest(updateTabEndpoint, graph, { sortOrderIndex: newOrderHint }); return notesTab.displayName; } } catch (error) { console.error( constants.errorLogPrefix + "CommonService_getTabURL \n", JSON.stringify(error) ); throw error; } } Here is the main method inside the .tsx file:- // wrapper method to perform teams related operations private async createTeamAndChannels(incidentId: any) { try { console.log(constants.infoLogPrefix + "M365 group creation starts"); // call method to create Teams group const groupInfo = await this.createTeamGroup(incidentId); try { console.log(constants.infoLogPrefix + "M365 group created"); // create associated team with the group const teamInfo = await this.createTeam(groupInfo); if (teamInfo.status) { //log trace this.dataService.trackTrace(this.props.appInsights, "Incident Team created ", incidentId, this.props.userPrincipalName); //Send invitations to the guest users let returnInvitationObj: any; if (this.state.toggleGuestUsers) returnInvitationObj = this.sendInvitation(groupInfo.id, teamInfo.data.displayName, teamInfo.data.webUrl) // create channels await this.createChannels(teamInfo.data); this.setState({ loaderMessage: this.props.localeStrings.createPlanloaderMessage }); //Get General channel id const generalChannelId = await this.dataService.getChannelId(this.props.graph, groupInfo.id, constants.General); //Add TEOC app to the Incident Team General channel's Active Dashboard Tab await this.dataService.createActiveDashboardTab(this.props.graph, groupInfo.id, generalChannelId, this.props.graphContextURL, this.props.appSettings); //Create planner with the Group ID const planID = await this.dataService.createPlannerPlan(groupInfo.id, incidentId, this.props.graph, this.props.graphContextURL, this.props.tenantID, generalChannelId, false); //added for GCCH tenant if (this.props.graphBaseUrl !== constants.defaultGraphBaseURL) { // wait for 5 seconds to ensure the SharePoint site is available via graph API await this.timeout(5000); } // graph endpoint to get team site Id const teamSiteURLGraphEndpoint = graphConfig.teamGroupsGraphEndpoint + "/" + groupInfo.id + graphConfig.rootSiteGraphEndpoint; // retrieve team site details const teamSiteDetails = await this.dataService.getGraphData(teamSiteURLGraphEndpoint, this.props.graph); //get the team site managed path const teamSiteManagedPathURL = teamSiteDetails.webUrl.split(teamSiteDetails.siteCollection.hostname)[1]; console.log(constants.infoLogPrefix + "Site ManagedPath", teamSiteManagedPathURL); // create news channel and tab const newsTabLink = await this.createNewsTab(groupInfo, teamSiteDetails.webUrl, teamSiteManagedPathURL,groupInfo.id); // create assessment channel and tab // await this.createAssessmentChannelAndTab(groupInfo.id, teamSiteDetails.webUrl, teamSiteManagedPathURL); // call method to create assessment list //await this.createAssessmentList(groupInfo.mailNickname, teamSiteDetails.id); //Reorder Tabs const tabname = await this.dataService.reorderTabs(this.props.graph,teamInfo.data.id,generalChannelId,"Notes"); console.log(constants.infoLogPrefix + "Reorder General channel Tabs"); //log trace this.dataService.trackTrace(this.props.appInsights, "Assessment list created ", incidentId, this.props.userPrincipalName); //change the M365 group visibility to Private for GCCH tenant if (this.props.graphBaseUrl !== constants.defaultGraphBaseURL) { this.graphEndpoint = graphConfig.teamGroupsGraphEndpoint + "/" + groupInfo.id; await this.dataService.sendGraphPatchRequest(this.graphEndpoint, this.props.graph, { "visibility": "Private" }) console.log(constants.infoLogPrefix + "Group setting changed to Private"); } //Update Team details, Plan ID, NewsTabLink in Incident Transation List const updateItemObj = { IncidentId: incidentId, TeamWebURL: teamInfo.data.webUrl, PlanID: planID, NewsTabLink: newsTabLink }; await this.updateIncidentItemInList(incidentId, updateItemObj); console.log(constants.infoLogPrefix + "List item updated"); let roles: any = this.state.roleAssignments; roles.push({ role: constants.incidentCommanderRoleName, userNamesString: this.state.incDetailsItem.incidentCommander.userName, userDetailsObj: [this.state.incDetailsItem.incidentCommander] }); //post incident message in General Channel await this.postIncidentMessage(groupInfo.id); // create the tags for incident commander and each selected roles await this.createTagObject(teamInfo.data.id, roles); //log trace this.dataService.trackTrace(this.props.appInsights, "Tags are created ", incidentId, this.props.userPrincipalName); Promise.allSettled([returnInvitationObj]).then((promiseObj: any) => { this.setState({ showLoader: false, formOpacity: 1 }); // Display success message if incident updated successfully this.props.showMessageBar(this.props.localeStrings.incidentCreationSuccessMessage, constants.messageBarType.success); // Display error message if guest invitations if ((promiseObj[0]?.value !== undefined && !promiseObj[0].value?.isAllSucceeded)) this.props.showMessageBar( ((promiseObj[0]?.value !== undefined && !promiseObj[0]?.value?.isAllSucceeded) ? " " + promiseObj[0]?.value?.message + ". " : ""), constants.messageBarType.error); this.props.onBackClick(constants.messageBarType.success); }); } else { // delete the group if some error occured await this.deleteTeamGroup(groupInfo.id); // delete the item if error occured await this.deleteIncident(incidentId); this.setState({ showLoader: false, formOpacity: 1 }) this.props.showMessageBar(this.props.localeStrings.genericErrorMessage + ", " + this.props.localeStrings.errMsgForCreateIncident, constants.messageBarType.error); } } catch (error) { console.error( constants.errorLogPrefix + "CreateIncident_createTeamAndChannels \n", JSON.stringify(error) ); // Log Exception this.dataService.trackException(this.props.appInsights, error, constants.componentNames.IncidentDetailsComponent, 'CreateIncident_createTeamAndChannels', this.props.userPrincipalName); // delete the group if some error occured await this.deleteTeamGroup(groupInfo.id); // delete the item if error occured await this.deleteIncident(incidentId); this.setState({ showLoader: false, formOpacity: 1 }) this.props.showMessageBar(this.props.localeStrings.genericErrorMessage + ", " + this.props.localeStrings.errMsgForCreateIncident, constants.messageBarType.error); } } catch (error: any) { console.error( constants.errorLogPrefix + "CreateIncident_createTeamAndChannels \n", JSON.stringify(error) ); // Log Exception this.dataService.trackException(this.props.appInsights, error, constants.componentNames.IncidentDetailsComponent, 'CreateIncident_createTeamAndChannels', this.props.userPrincipalName); // delete the item if error occured this.deleteIncident(incidentId); this.setState({ showLoader: false, formOpacity: 1 }); // Display error message if M365 group creation fails with access denied error if (error?.statusCode === 403 && error?.code === constants.authorizationRequestDenied && error?.message === constants.groupCreationAccessDeniedErrorMessage) { this.props.showMessageBar(this.props.localeStrings.genericErrorMessage + ", " + this.props.localeStrings.m365GroupCreationFailedMessage, constants.messageBarType.error); } /* Display error message if M365 group creation fails with group already exists error or any other error */ else { this.props.showMessageBar(this.props.localeStrings.genericErrorMessage + ", " + this.props.localeStrings.errMsgForCreateIncident, constants.messageBarType.error); } } } But after calling the above method during the site and channel creation the Notes will stay the 3rd tab. any advice?163Views0likes0CommentsReorder Teams Channel tabs, move a 3rd tab to be the last tab?
I have an automate power automate flow which Create a Teams site, channels & tabs. now inside the General channel, we add the following custom tabs (Active DashBoard, Incident -12: Tasks and Template & training), as follow:- but i will get those 3 built-in tabs; Posts, Files and Notes.. now how i can move the Notes tab to be last tab ? using Graph API? Thanks58Views0likes0CommentsReorder Channel Tabs using Graph API
I have an automate flow which Create a Teams site, channels & tabs. now inside the General channel, we add the following custom tabs (Active DashBoard, Incident -12: Tasks and Template & training), as follow:- but i will get those 3 built-in tabs; Posts, Files and Notes.. now how i can move the Notes tab to be last tab ? using Graph API? Thanks129Views0likes0CommentsRe: Maximum requests users with seeded license + Premium license can do in power platform per day
vlecerfAlso the Capacity reports provide the 48,000 requests limits for the service account, for each environment,, but i think this requests quota is for the whole environments??, also the report always show 0 requests for power apps.. now sure whyRe: Maximum requests users with seeded license + Premium license can do in power platform per day
vlecerfPer my knowledge this is a grey area, most developers are not aware of. and Microsoft is providing grace periods so most developers think they are fine.. looks like a trap to me for most developers ... just sayingRe: Steps to redeploy a Teams Apps after applying some changes and deploy it to local GIT repo
Meghana-MSFTdid not you read the question ? i am asking about Teams App not SharePoint App.. also those are 2 different forums,, so why you are linking both ??? instead of just providing general comments please try to help, if you are willing to101Views0likes0CommentsSteps to redeploy a Teams Apps after applying some changes and deploy it to local GIT repo
We already have a Teams Apps installed inside our Microsoft Teams Admin Center, the apps is inside GitHub @ https://github.com/OfficeDev/microsoft-teams-emergency-operations-center. Now we want to do some changes that will not be deployed to the upstream. So i did those steps:- 1) Clone the GitHub code locally 2) Do the modifications using Visual Studio code. 3) then push the changes to our BitBucket repository which is public 4) Now I will redeploy the manifest.json + the resources images to the Microsoft Teams Admin center. 5) I will modify the "Git Repo URL" field inside the existing custom deployment template , to reference our custom Repo inside Bitbucket instead of the upstream GitHub? My first question, are my above steps valid? and all the required steps? and can i modify existing template to change the "GIT Repo URL"? Second question, now inside our public Bitbucket repo we will have the ClientID and appdomain inside the manifest.json .. so can we hide them? or they will need to be there for the "Git Repo Url" to reference them? or those values are only needed inside the manifest .json uploaded inside our Microsoft Teams admin center? and doe snot require to be inside the public bitbucket repository? Thanks184Views0likes2CommentsCan i get the Manifest.JSON file for a Teams app that is already installed our Microsoft Teams Admin
We have a Teams App already installed inside our tenant and users are using it:- Now i downloaded the code from this GitHUb site https://github.com/OfficeDev/microsoft-teams-emergency-operations-center >> and i modified the code using visual studio code to apply some customization based on our needs. Now to be able to deploy the updated Teams app, i need the following information inside the Manifest.json file:- AppDomain Website url ClientID now those should be already defined inside the current app which is already installed inside our Microsoft Teams admin center. but i can not find any option to download the current Teams App from our Teams admin center.. so how i can get these info to be able to upload my updated version of the app and replace the current version? Also i need the current app files, incase my updated app had some issues so i can revert back the old version of the app.. any advice? Thanks204Views0likes1CommentHow I can access a current Teams Apps that has been added to our Office 365 tenant, to apply some ch
I am working on a client tenant, and they have installed this Teams Apps inside their tenant:- https://github.com/OfficeDev/microsoft-teams-emergency-operations-center now when i open my Teams i can see this tab been added automatically:- And it is added inside the Apps list:- Now they asked to do some changes, so i clone the code from GitHub >> modify the code using visual studio.. now i want to reupload the updated Teams app to the tenant .. but when i went to the SharePoint app catalog , i only found this app:- so my first question is where i need to upload the apps? and can i run those commands to generate .sppkg file:-gulp clean gulp build gulp bundle --ship gulp package-solution --ship Second question, inside the deployment steps for the Teams app @ https://github.com/OfficeDev/microsoft-teams-emergency-operations-center/wiki/Deployment-Guide#7-create-the-teams-app-packages they mentioned to define the <<appDomain>> & <<clientId>> .. So this means i need to get those from the current Teams apps that is already installed? i do not have to generate new ones? am I correct? If this is the case, then is there a way to get those from any where inside our tenant ? i am global office365 admin. Thanks in advance for any help.163Views0likes0CommentsRe: "Create New Folder" error "The system cannot find the path specified" incase the Path contain "#"
Rob_ElliottThanks for the reply,,, if you can convince the client then i will be more than happy :). but they have folders inside Z drive that they upload them in bulk... Now i tried to Encode the value before defining it inside the Create Folder action, but this raised the same error.. now for a reason or another power automate is encoding the # as %2523 ... this is the value i get when i pass the # inside "Get Folder Metadata using Path" action, check the Id field inside the Output section 999999999#43 has been encoded as999999999%252343 . as follow:-"Create New Folder" error "The system cannot find the path specified" incase the Path contain "#"
I have a workflow, that will create some folder structures when a main folder get added:- Here is the main action to create those sub-folders:- Now everything is working well, but when i added a folder with a name that contain "#" such as "Invoice #100" , the action will fail with this error:- { "error":{ "code":502, "source":"flow-apim-msmanaged-na-centralus-01.azure-apim.net", "clientRequestId":"6295d836-eda6-4f8c-b1bf-281f321705a7", "message":"BadGateway", "innerError":{ "status":500, "message":"Thesystemcannotfindthepathspecified.(ExceptionfromHRESULT:0x80070003)\r\nclientRequestId:6295d836-eda6-4f8c-b1bf-281f321705a7\r\nserviceRequestId:b3715ba1-a0da-0000-3d3b-9a38139b0dee" } } } Any advice?Re: Maximum requests users with seeded license + Premium license can do in power platform per day
vlecerf Thanks again. So my service account has an official request limit of 40K ??? and i am currently given 500K during grace period? is this our current case? Now on average my service account consumption is around 55K per day for all days (except weekends it can go down to 20K) and can go up to 150K on the first 2 days of each month, since we have a lot of work orders been automatically generated for us on the first 2 days of each month,,, so what could replace our current Power Automate Premium license to have more requests?Re: Maximum requests users with seeded license + Premium license can do in power platform per day
vlecerf Thanks for the table and the very helpful replies i got from your side, now numbers are easy to find, but hard to understand (Microsoft documentation fails again).. now the service account i am using has these licenses:- From your table the service account should have officially 40K .. so Microsoft gave this account 500K during the grace period .. so i got 460K additional requests per day? or the service account i am using has more than 40K as an official requests? Second question, when this grace period ends, so we can prepare ourselves in advance ?I am not sure why Microsoft is so mean in providing information about this.. Can you advice more on this please?