Thursday, February 28, 2013

Sync list with user group using jquery

Requirement: To get all the user names from the SharePoint group "Deliverable Owners" and sync with a custom list called "Team Members" in a button click.

Solution: This is done using jquery and SharePoint web services.

Code:

<script type="text/javascript" src="https://siteurl/Documents/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="https://siteurl/Documents/jquery.SPServices-0.7.2.min.js"></script>
<script  type="text/javascript">
    $(document).ready(function() {
 
     $("#syncUsers").click(function()  //'syncUsers' is the ID of button control added in the CEWP
{
var errorOccured  = DeleteUsersFromTeamMembersList();
if(!errorOccured)
{
AddUsersToTeamMembersList();
}
 });
});

      // to delete the existing users from the custom list
function DeleteUsersFromTeamMembersList()
{

var errorOccured = false;

$().SPServices({
            operation: "GetListItems",
            async: false,
            debug: true,
            listName: "Team Members",
            CAMLViewFields: "<ViewFields></ViewFields>",
            completefunc: function (xData, Status) {
                $(xData.responseXML).SPFilterNode("z:row").each(function() {
                    $().SPServices({
                        operation: "UpdateListItems",
                        async: false,
                        debug: true,
                        batchCmd: "Delete",
                        listName: "Team Members",
                        ID: $(this).attr("ows_ID"),
                        completefunc: function (xData, Status) {
                        msgData = xData.responseText;
isError = msgData.indexOf("ErrorText");
           if (isError > 0) {
               // Error creating fields!
               alert("Error deleted user names from Team Member list!");
               errorOccured = true;
           }
                        }
                    });
                });
            }
        });
         return errorOccured;
}
//add all the users from the sharepoint group to custom list.
function AddUsersToTeamMembersList()
{

var alreadyProcessed = false;
var userName ;
var iD;
var userID;
var errorOccured = false;

$().SPServices({
operation: "GetUserCollectionFromGroup",
groupName: "Deliverable Owners",
completefunc: function (xData, Status) {
$("#results").text(xData.responseXML.xml);
$(xData.responseXML).find("User").each(function () {
  userName = $(this).attr("LoginName");
  iD = $(this).attr("ID");
  userID = iD +";#"+userName;
  $().SPServices({
operation: "UpdateListItems",
async: false,
batchCmd: "New",
listName: "Team Members",
valuepairs: [["User",userID  ]],
completefunc: function(xData, Status)
{
msgData = xData.responseText;
isError = msgData.indexOf("ErrorText");
if (isError > 0) {
// Error creating fields!
alert("Error synchronizing user names!");
errorOccured = true;
}
}
});
});

if( errorOccured == false)
{
alert("User name synchronized successfully.");
$(window.location).attr('href', 'currentpagename.aspx');
}                    
}
});
}
</script>


P.S:
- The performance of this code will get affected based on the size of the user group.
- The Team Members custom list must have "User" field with people and group type.


3 comments:

  1. I just need the list of users from Group. So, I tried to use GetUserCollectionFromGroup part from above code. But the results are not coming. xData.responseXML is value showing as undefined. Can you suggest me to resolve this.

    Regards,
    Subba Reddi.

    ReplyDelete
  2. Thanks for the logic, but what changes should be done if I have to sync between to lists lets assume 'Deliverable Owners' is another list in a sub site.

    Best regards
    Balaji

    ReplyDelete