Programmatically access files in Document set in sharepoint using Javascript

做~自己de王妃 提交于 2019-12-24 03:14:30

问题


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()"/>

回答1:


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:

  • SP.CamlQuery.folderServerRelativeUrl property is used to return only files located under specific url

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());
     });



回答2:


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> 


来源:https://stackoverflow.com/questions/29462134/programmatically-access-files-in-document-set-in-sharepoint-using-javascript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!