One of the new challenges facing SharePoint professionals is adding JavaScript files to SharePoint online. The most direct and simple approach that I have found is to use the UserCustomAction class to add a ScriptLink. To make the deployment a snap, use the SharePointOnlineCredentials class within a console application. The SharePointOnlineCredentials class allows you to access the site using your credentials. You will need full control permission to run this solution.
WARNING, improper use use of a UserCusomAction to add a ScriptLink WILL break your site/site collection in a very disturbing fashion. SharePoint will gladly serve you an absolutely blank page with no error. Therefore, it is recommended to test this solution prior to a production deployment.
Create a new Console App
Add references to SharePoint
Microsoft.SharePoint.ClientC:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll
Microsoft.SharePoint.Client.Runtime
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll
Use SharePointOnlineCredentials
First, collect the url, logon and user password from the console. Create a new client context and set the credentials of the context to a new SharePointOnlineCredentials class.static void Main(string[] args) { Console.WriteLine("Enter SharePoint online url:"); string url = Console.ReadLine(); Console.WriteLine("Enter SharePoint online Login : "); string logon = Console.ReadLine(); Console.WriteLine("Enter your password."); SecureString password = GetPasswordFromConsoleInput(); using (var context = new ClientContext(url)) { context.Credentials = new SharePointOnlineCredentials(logon, password); } Console.WriteLine("Press Enter to End"); Console.ReadLine(); } private static SecureString GetPasswordFromConsoleInput() { ConsoleKeyInfo info; //Get the user's password as a SecureString SecureString securePassword = new SecureString(); do { info = Console.ReadKey(true); if (info.Key != ConsoleKey.Enter) { securePassword.AppendChar(info.KeyChar); } } while (info.Key != ConsoleKey.Enter); return securePassword; }
Use the Utility Functions
The downloadable code has a few functions built to list, add and remove ScriptLinks. I would start by just listing them out. The functions are executed directly after SharePointOnlineCredentials./// <summary> /// adds a scriptlink to the site /// </summary> /// <param name="ctx"></param> /// <param name="file"></param> /// <param name="seq"></param> private static void AddScriptLink(ClientContext ctx, string file, int seq) { // Register Custom Action var customAction = ctx.Site.UserCustomActions.Add(); customAction.Location = "ScriptLink"; customAction.ScriptSrc = file; customAction.Sequence = seq; customAction.Update(); ctx.ExecuteQuery(); Console.WriteLine("ScriptLink Added : {0}", file); } /// <summary> /// remove all customactions from the site /// </summary> /// <param name="ctx"></param> private static void ClearAllScriptLinks(ClientContext ctx) { var customActions = ctx.Site.UserCustomActions; ctx.Load(customActions); ctx.ExecuteQuery(); customActions.Clear(); ctx.ExecuteQuery(); Console.WriteLine("All SriptLinks removed"); } /// <summary> /// list the scriptlinks on the site /// </summary> /// <param name="ctx"></param> private static void ListScriptLinks(ClientContext ctx) { var customActions = ctx.Site.UserCustomActions; ctx.Load(customActions); ctx.ExecuteQuery(); foreach(UserCustomAction ua in customActions) { if (string.Compare(ua.Location, "ScriptLink", true) == 0) { Console.WriteLine("Script Source : {0}, Sequence : {1}", ua.ScriptSrc, ua.Sequence); } } if(customActions.Count == 0) { Console.WriteLine("No ScriptLinks found for {0}", ctx.Url); } } /// <summary> /// remove a scriptlink matching script source /// </summary> /// <param name="ctx"></param> private static void RemoveScriptLink(ClientContext ctx, string scriptsource) { var customActions = ctx.Site.UserCustomActions; ctx.Load(customActions); ctx.ExecuteQuery(); foreach (UserCustomAction ua in customActions) { if (string.Compare(ua.ScriptSrc, scriptsource, true) == 0) { Console.WriteLine("Removing Script Src : {0}, Sequence : {1}", ua.ScriptSrc, ua.Sequence); ua.DeleteObject(); } } if(ctx.HasPendingRequest) { ctx.ExecuteQuery(); } }
Download Source Code
https://github.com/spkrby/SriptLinkUtilReferences
http://blogs.msdn.com/b/kaevans/archive/2014/02/23/call-o365-using-csom-with-a-console-application.aspx
http://blog.mastykarz.nl/deploying-custom-actions-app-model/
http://www.ashokraja.me/post/Refer-Scripts-and-CSS-Style-Sheet-in-SharePoint-2013-Visual-Web-Part-and-Master-Page.aspx