Import-Module Microsoft.Online.SharePoint.PowerShell
# Connect to SPO for native cmdlets - radi@M365x957147.onmicrosoft.com
Connect-SpoService -Url https://M365x957147-admin.sharepoint.com
# Set Hide
Get-SPOHideDefaultThemes #Returns False when default themes are visible
Set-SPOHideDefaultThemes $true
# Retrieve a Theme as JSON
Get-SPOTheme -Name "Custom 1" | ConvertTo-Json
# Remove a theme
Remove-SPOTheme -Name "Custom 2"
# Set the theme JSON
$themeJSON = @{
"themePrimary" = "#800080";
"themeLighterAlt" = "#FF00FF";
"themeLighter" = "#FBC0C3";
"themeLight" = "#808000";
"themeTertiary" = "#FFA500";
"themeSecondary" = "#00FF00";
"themeDarkAlt" = "#00FF00";
"themeDark" = "#136D80";
"themeDarker" = "#0000FF";
"neutralLighterAlt" = "#FFF7D7";
"neutralLighter" = "#DDEFF8";
"neutralLight" = "#F2C975";
"neutralQuaternaryAlt" = "#20B2AA";
"neutralQuaternary" = "#008B8B";
"neutralTertiaryAlt" = "#8B0000";
"neutralTertiary" = "#98FB98";
"neutralSecondary" = "#DAA520";
"neutralPrimaryAlt" = "#800000";
"neutralPrimary" = "#008080";
"neutralDark" = "#B3AA9B";
"black" = "#000000";
"white" = "#ffffff";
"primaryBackground" = "#ffffff";
"primaryText" = "#000000";
"bodyBackground" = "#ffffff";
"bodyText" = "#000000";
"disabledBackground" = "#CD9D7C";
"disabledText" = "#765A4F";
"blue" = "#0000FF";
"backgroundImageUri" = "https://M365x957147.sharepoint.com";
}
# Build a Theme Object with a neat for each
$themeObject = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]"
$themeJSON.Keys | %{$themeObject.Add($_, $themeJSON[$_])}
# Add theme to gallery
Add-SPOTheme -Name "Custom 2" -Palette $themeObject -IsInverted:$false
# Automate applying a theme today
Connect-PnPOnline -Url https://M365x957147-admin.sharepoint.com
# Set up site script - see https://docs.microsoft.com/en-us/sharepoint/dev/declarative-customization/site-design-overview
$siteScriptJSON = @'
{
"$schema": "schema.json",
"actions": [{
"verb": "applyTheme",
"themeName": "Custom 2"
}
],
"bindata": {},
"version": 1
}
'@
# Add script and design
$siteScript = Add-PnPSiteScript -Title "Custom 2" -Content $siteScriptJSON
$siteDesign = Add-PnPSiteDesign -Title "Custom 2" -SiteScriptIds $siteScript.Id -WebTemplate TeamSite
# Invoke the applying of the site design
Invoke-PnPSiteDesign -Identity $siteDesign -WebUrl https://M365x957147-admin.sharepoint.com