This post was most recently updated on February 6th, 2019.
This article explains how to enable custom scripting for any SharePoint site collection. Different instructions and solutions apply to SharePoint Online, and on-premises scenarios (SharePoint Server 2013, 2016 and probably 2019).
Different solutions resolve the issue for different target sites:
- Modern SharePoint Team Sites (attached to Office Groups if on SharePoint Online, and without one if On-Premises)
- Modern SharePoint Communication sites (after 08/2017 – at least on SharePoint Online)
- SharePoint MySites (On-Premises)
- Personal OneDrive sites (SharePoint Online)
- Any SharePoint Site Collection created through self-service site creation (both SharePoint Online and On-Premises)
- Tenant root Site Collection (SharePoint Online)
- Any Classic SharePoint site collection (all environments!)
Why enable Custom Scripts?
Most typically I run into this when trying to insert a script web part with custom JavaScript into a site, that has NoScript enabled. That’s annoying – since script webparts are incredibly useful!
However, that is the default setting on quite a few different sites – note that Microsoft explains it this way.
By default, script is allowed on sites that admins create. It is not allowed on OneDrive, on sites users create themselves, and on the root site for your organization.
That kind of makes sense. Custom scripting makes it possible to customize the sites quite extensively, and Microsoft doesn’t want that on OneDrive sites, or the good old MySites for SharePoint User Profiles.
Well, nowadays they don’t really want that anywhere, and for pretty good reasons. But let’s not get into that :)
Microsoft continues:
If SharePoint Online was set up for your organization before 2015, your custom script settings might still be set to “Not Configured” even though in the SharePoint admin center they appear to be set to prevent users from running custom script. In this case, users won’t be able to copy items between SharePoint sites and between OneDrive and SharePoint. On the settings page of the SharePoint admin center, click OK to accept the custom script settings as they appear and enable cross-site copying.
Useful information. This means we’ll need to tweak the setting not only for sites with customization, but also for some older sites.
Other situations when this might come up, is when uploading sandboxed solutions, or any of the following file types.
- .asmx
- .ascx
- .aspx
- .htc
- .jar
- .master
- .swf
- .xap
- .xsf
These are all files that could potentially include code or scripts – JavaScript, Java, ActionScript, C# – so Microsoft prefers to block or restrict them on a lot of sites. For more info about this functionality, check out this KB page by Microsoft.
What happens when you don’t enable Custom Scripting on a site?
The typical situation where this functionality comes up is this unfortunate dialog, which you could run into on your webpart pages:

It’s all different On-Premises…
Heh, because of course it is!
On-Premises (SharePoint Server 2010, 2013, 2016, 2019 and so on) the security model is slightly different. Custom Scripting is not disabled per se, but using Script Editor or Content Editor web parts might still be disabled for editors on new web application.
This means, that you’ll be severely limited with your webpart options by default!

How to get around the issue then? See below for the solutions I’ve found so far!
Solution(s)
This article explains a few different options on how to fix the issue! See below how to enable custom scripts on SharePoint Online / 2013 / 2016 / 2019:
Enable custom scripts tenant-wide
Applies to: SharePoint Online
- SharePoint MySites
- Personal OneDrive sites
- Any SharePoint site collection created based on self-service site creation
This is, of course, fairly straightforward. You can enable Custom Scripts (basically, this is equivalent of setting the “DenyAddAndCustomizePages” switch to false for the site) for the whole tenant at once.
You can do that using SharePoint Admin GUI. Here’s how to do that:
- Navigate to your O365 SharePoint Admin Portal
- Click “Settings“.
- Scroll down, down, down… A bit further down you’ll see these options – make sure they’re set to “Allow“:
This change will come into action in the next 24 hours. No – it’s not instant.
However, if you don’t have 24 hours to wait, see the next solution.
Enable custom scripts using (vanilla) PowerShell
Applies to: SharePoint Online
- Modern SharePoint Team Sites (attached to Office Groups)
- Modern SharePoint Communication sites (after 08/2017)
- Personal OneDrive sites
- Any SharePoint site collection created based on self-service site creation
- SharePoint Online tenant root site collection
- Any Classic SharePoint site collection
This makes it possible to enable the custom scripts for any SharePoint Online site collection – even Modern ones! The snippet below shows how to enable it for one site – you can modify it to loop through all sites if you need to!
Below, you can see an example of the PowerShell script required for this change.
Connect-SPOService -Url https://[yourtenant]-admin.sharepoint.com -credential admin@[tenant].onmicrosoft.com Set-SPOSite -Identity https://[yourtenant].sharepoint.com/[siteurl] -DenyAddAndCustomizePages 0
You’ll only need SharePoint Online Management Shell, no other dependencies. Nice and simple!
The best part? Unlike the switch on tenant admin site, this change should be practically instant!
Applies to: SharePoint Online
And in one or more of the listed environments, it applies to these different site collection types:
- Modern SharePoint Team Sites (attached to Office Groups if on SharePoint Online)
- Modern SharePoint Communication sites (after 08/2017)
- Personal OneDrive sites
- Any SharePoint site collection created based on self-service site creation
- SharePoint Online tenant root Site Collection
- Any Classic SharePoint Site Collection
The script below should work for all of these 4 different environments, as long as you use the right version of the PnP PowerShell module.
# If you don't already have the modules, run Install-module first! Import-Module -Name SharePointPnPPowerShellOnline -DisableNameChecking $DenyAddAndCustomizePagesStatusEnum = [Microsoft.Online.SharePoint.TenantAdministration.DenyAddAndCustomizePagesStatus] Connect-PnPOnline -Url 'https://[yourtenant]-admin.sharepoint.com/' -Credentials (Get-Credential) $context = Get-PnPContext $site = Get-PnPTenantSite -Detailed -Url 'https://[yourtenant].sharepoint.com/' $site.DenyAddAndCustomizePages = $DenyAddAndCustomizePagesStatusEnum::Disabled $site.Update() $context.ExecuteQuery() # This row should output list of your sites' URLs and the status of their custom scripting (disabled or not) Get-PnPTenantSite -Detailed -Url 'https://[yourtenant].sharepoint.com/' | select url,DenyAddAndCustomizePages Disconnect-PnPOnline
This script should be almost instant as well – we’re talking about a delay of 30 seconds or so, so quite an improvement over the switch on tenant admin site!
However, if you want to apply this change to On-Premises environments, you might want to check out the following solution…
Applies to: SharePoint 2013 | SharePoint 2016 | SharePoint 2019
And in one or more of the listed environments, it applies to these different site collection types:
- SharePoint MySites (On SharePoint Server)
- Any Classic SharePoint Site Collection
With SharePoint Server, the story is a bit different.


So you now have these options for web applications.

By selecting “Allows contributors to add or edit scriptable Web Parts.” you enable the contributor/editor/member users to add those web parts on the page.
If you don’t want to (or can’t) use the GUI to enable this, you can also use this PowerShell:
<pre lang="powershell">
$wa = get-spwebapplication "https://contoso.intranet.ch"
# Web application now has these 3 properties, that match the ones in the GUI:
$wa.AllowPartToPartCommunication
$wa.AllowAccessToWebPartCatalog
$wa.AllowContributorsToEditScriptableParts
# The last one affects the Custom Script Editor webparts:
$wa.AllowContributorsToEditScriptableParts = $true
$wa.Update()
</pre>
After applying either one of the options above (GUI or PowerShell script), you’ll have the Script Editor webpart available.

This change is practically instant.
Further reading
For a pretty good documentation about the whole NoScript stuff (on SharePoint Online), check out this page: https://support.office.com/en-us/article/allow-or-prevent-custom-script-1f2c515f-5d7e-448a-9fd7-835da935584f
Antti K. Koskela

Latest posts by Antti K. Koskela (see all)
- Fixing “An assembly specified in the application dependencies manifest [projectname].deps.json was not found” - February 13, 2019
- What is “fp.js” – and why is it snooping on your SharePoint usage? - February 6, 2019
- Google Plus is shutting down – fix your .NET OAuth flow! - February 4, 2019
- Solving yet another “Microsoft.SharePoint.Client.ServerException: Unknown Error” - January 29, 2019
Leave a Reply