Create Site Columns on Host Web from App Web in SharePoint 2013 using JavaScript

Add a button on page which creates Site Columns.

  1. <asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server">  
  2.     <div>  
  3.         <input type="button" id="btnSiteColumns" value="Create Site Columns" onclick="createSiteColumns()" />  
  4.     </div>  
  5. </asp:Content>  

Add following code to App.js.

  1. 'use strict';  
  2.   
  3. var context = SP.ClientContext.get_current();  
  4. var hostWebUrl, hostWebContext, hostWeb;  
  5.   
  6. $(document).ready(function () {  
  7.     hostWebUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));  
  8.     //Get Host Web Context using App web  
  9.     hostWebContext = new SP.AppContextSite(context, hostWebUrl);  
  10.     hostWeb = hostWebContext.get_web();  
  11. });  
  12.   
  13. // Retrieve a query string value.  
  14. function getQueryStringParameter(paramToRetrieve) {  
  15.     var params = document.URL.split("?")[1].split("&");  
  16.     for (var i = 0; i < params.length; i = i + 1) {  
  17.         var singleParam = params[i].split("=");  
  18.         if (singleParam[0] == paramToRetrieve) return singleParam[1];  
  19.     }  
  20. }  
  21.   
  22. //Create Site Columns on Host Web  
  23. function createSiteColumns() {  
  24.     var fields;  
  25.     var createFields;  
  26.     //Get Host Web Fields Collection  
  27.     fields = hostWeb.get_fields();  
  28.     //Define the fields schema  
  29.     var fieldSchema = new Array(  
  30.                      '<Field Name="EmployeeId" DisplayName="Employee ID" Type="Text" EnforceUniqueValues ="TRUE" Indexed="TRUE"  Required="True" Group="EmployeeDetails"/>',  
  31.                      '<Field Name="EmployeeName" DisplayName="Employee Name"  Type="User" Required="FALSE" Group="EmployeeDetails"/>');  
  32.   
  33.     for (var iFieldsCounter = 0; iFieldsCounter < fieldSchema.length; iFieldsCounter++) {  
  34.         //Parameters to pass  
  35.         //fields.addFieldAsXml(string schemaXml,bool addToDefaultView, AddFieldOptions options)  
  36.         createFields = fields.addFieldAsXml(fieldSchema[iFieldsCounter], false, SP.AddFieldOptions.addFieldCheckDisplayName);  
  37.     }  
  38.     context.load(fields);  
  39.     context.load(createFields);  
  40.     context.executeQueryAsync(  
  41.             function () {  
  42.                 alert('Site Columns Created Successfully.')  
  43.             },  
  44.             function (sender, args) {  
  45.                 alert('Failed to create Site Columns. Error:' + args.get_message() + '\n' + args.get_stackTrace());  
  46.             });  
  47.   
  48. }