user3476088
user3476088

Reputation: 85

Programmatically access files in Document set in sharepoint using Javascript

I want to access files in a particular document set in a document library .

So far i was able to get the particular document set name and ID using JSOM as below . How to read all the files inside the document set

<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js"></script>
<script type="text/javascript" src="_layouts/15/sp.runtime.js"></script>
<script type="text/javascript" src="_layouts/15/sp.js"></script>
 
<script type="text/javascript">
   ExecuteOrDelayUntilScriptLoaded(MainFunction, "sp.js");
 
    function MainFunction() {
        var clientContext = new SP.ClientContext.get_current();
        var oList = clientContext.get_web().get_lists().getByTitle('Planner Session');
 
        var camlQuery = new SP.CamlQuery(); //initiate the query object
 
        camlQuery.set_viewXml('<View><Query><Where><Lt><FieldRef Name="ID" /><Value Type="Counter">3</Value></Lt></Where><OrderBy><FieldRef Name="ID" Ascending="FALSE"/></OrderBy></Query><RowLimit>1</RowLimit></View>');
 
        this.collListItem = oList.getItems(camlQuery);
 
        clientContext.load(collListItem);
        clientContext.executeQueryAsync(
            Function.createDelegate(this, this.onQuerySucceeded),
            Function.createDelegate(this, this.onQueryFailed)
        );
    }
 
    function onQuerySucceeded(sender, args) {
        var DocSet = "";
        var listItemEnum = collListItem.getEnumerator();
 
        while (listItemEnum.moveNext()) {
            var oListItem = listItemEnum.get_current();
            DocSet += '\n\nID: ' + oListItem.get_id() + '\nName: ' + oListItem.get_item('FileLeafRef');
        }
 // Here i would like to get the file inside the documentSet 
        alert(DocSet.toString());
    }
 
    function onQueryFailed(sender, args) {
        alert('Request failed. ' + args.get_message() +
            '\n' + args.get_stackTrace());
    }
</script>​
 
<input type="button" value="Get Products" onclick="MainFunction()"/>

Upvotes: 2

Views: 10407

Answers (2)

user3476088
user3476088

Reputation: 85

Please find the complete code which does the following 1. Gets the required docset based on my conditions 2. gets all the files in that particular document set by checking the value in the custom column

<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js"></script>
<script type="text/javascript" src="_layouts/15/sp.runtime.js"></script>
<script type="text/javascript" src="_layouts/15/sp.js"></script>
 
<script type="text/javascript">
   ExecuteOrDelayUntilScriptLoaded(MainFunction, "sp.js");
 
    function MainFunction() {
	var currentListID = getQueryStringValue("List");
	
        var clientContext = new SP.ClientContext.get_current();

	this.ListId = "{" + currentListID + "}";
	var oList = clientContext.get_web().get_lists().getById(ListId);
 
        var camlQuery = new SP.CamlQuery(); //initiate the query object
		var currentDocSetID = getQueryStringValue("ID");
        camlQuery.set_viewXml('<View><Query><Where><Lt><FieldRef Name="ID" /><Value Type="Counter">' + currentDocSetID + '</Value></Lt></Where><OrderBy><FieldRef Name="ID" Ascending="FALSE"/></OrderBy></Query><RowLimit>1</RowLimit></View>');
 
        this.collListItem = oList.getItems(camlQuery);
 
        clientContext.load(collListItem);
        clientContext.executeQueryAsync(
            Function.createDelegate(this, this.onQuerySucceeded),
            Function.createDelegate(this, this.onQueryFailed)
        );
    }
 
    function onQuerySucceeded(sender, args) {
        var DocSet = "";
        var listItemEnum = collListItem.getEnumerator();
 
        while (listItemEnum.moveNext()) {
            var oListItem = listItemEnum.get_current();
            DocSet += oListItem.get_item('FileLeafRef');
        }
		// Here i would like to get the file inside the documentSet 
       // alert(DocSet.toString());

		var fsoType = oListItem.get_fileSystemObjectType(); 
        
        if(oListItem.FileSystemObjectType == SP.FileSystemObjectType.Folder)
		{
           
		//var folderUrl =  "/" + listName + "/" + DocSet.toString();

		var RawFolderUrl = getQueryStringValue("RootFolder");

		var pos = RawFolderUrl.lastIndexOf('/');

		var folderUrl = RawFolderUrl.substring(0,pos) + "/" + DocSet.toString();

		GetFilesFromFolder(folderUrl);

		}
		
    }
	
	
    var allItems;
    function GetFilesFromFolder(folderUrl)
    {
        var context = new SP.ClientContext.get_current();
        var web = context.get_web();
        var list = web.get_lists().getById(ListId);
        // Use createAllItemsQuery to get items inside subfolders as well. Otherwise use new SP.CamlQuery() to get items from a single folder only
        var query = SP.CamlQuery.createAllItemsQuery();
        query.set_folderServerRelativeUrl(folderUrl);
        allItems = list.getItems(query);
          context.load(allItems, 'Include(File, FileSystemObjectType,Document_x0020_Type,Title)');
        context.executeQueryAsync(Function.createDelegate(this, this.OnSuccess), Function.createDelegate(this, this.OnFailure));
    }
    function OnSuccess()
    {                                              
        var listItemEnumerator = allItems.getEnumerator();
        while(listItemEnumerator.moveNext())
        {
            var currentItem = listItemEnumerator.get_current();                                                                                                                     
            if(currentItem.get_fileSystemObjectType() == "0")
            {
                var file = currentItem.get_file();
                if(file != null && currentItem.get_item("Document_x0020_Type") == "03. Minutes")
                {
                   // alert('File Name: ' + file.get_name() + '\n' + 'File Url: ' + file.get_serverRelativeUrl());  
 		   // alert(currentItem.get_item("Title"));   
 		    var link = document.getElementById("prvMinutes");
  	            link.href= file.get_serverRelativeUrl();  
                   // link.innerHTML = currentItem.get_item("Title");                                                     
		     link.innerHTML = file.get_name();
                }
		
            }
        }                                              
    }


    function OnFailure(sender, args) {
        alert("Failed. Message:" + args.get_message());
    }
 
    function onQueryFailed(sender, args) {
        alert('Request failed. ' + args.get_message() +
            '\n' + args.get_stackTrace());
    }

	function getQueryStringValue (key) {  
  return unescape(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + escape(key).replace

(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));  
}
</script>
<a id="prvMinutes" href="#" target="_blank"> </a> 

Upvotes: 0

Vadim Gremyachev
Vadim Gremyachev

Reputation: 59358

How to get files of Document Set via SharePoint CSOM

Assume the following structure:

Documents (library)
    |
    2013 (Document set)

Query based approach

The following example demonstrates how to return Files located in Document Set using CAML query:

function getListItems(listTitle,folderUrl,success,error)
{
   var ctx = SP.ClientContext.get_current();
   var web = ctx.get_web();
   var list = web.get_lists().getByTitle(listTitle);
   var qry = SP.CamlQuery.createAllItemsQuery();
   qry.set_folderServerRelativeUrl(folderUrl);
   var items = list.getItems(qry);
   ctx.load(items,'Include(File)');
   ctx.executeQueryAsync(
      function() {
          success(items); 
      },
      error);
}

Key points:

Usage

var listTitle = 'Documents';
var docSetUrl = '/Documents/2013';  
getListItems(listTitle,docSetUrl, 
     function(items){
        for(var i = 0; i < items.get_count();i++) {
            var file = items.get_item(i).get_file();
            console.log(file.get_title());
        }
     },
     function logError(sender,args) 
     {
        console.log(args.get_message());
     });

Using SP.Web.getFolderByServerRelativeUrl method

Use SP.Web.getFolderByServerRelativeUrl Method to get Document Set object located at the specified server-relative URL and then SP.Folder.files property to gets the collection of all files contained in the Document Set

Complete example:

function getFiles(folderUrl,success,error)
{
    var ctx = SP.ClientContext.get_current();
    var files = ctx.get_web().getFolderByServerRelativeUrl(folderUrl).get_files();
    ctx.load(files);
    ctx.executeQueryAsync(
      function() {
          success(files); 
      },
      error);
}

Usage

var docSetUrl = '/Documents/2013';  //<-- '2013'
getFiles(docSetUrl, 
     function(files){
        for(var i = 0; i < files.get_count();i++) {
            var file = files.get_item(i);
            console.log(file.get_title());
        }
     },
     function logError(sender,args) 
     {
        console.log(args.get_message());
     });

Upvotes: 2

Related Questions