2016-03-11 215 views
0

我已经查看了SharePoint列表中的自动编号解决方案,但这是我的问题。我没有SPD,Infopath,视觉工作室。我只有HTML webpart。我工作的公司不相信有这些工具的人,所以我必须做。无论如何,我已经将电子表格作为Sharepoint列表导入。我想继续使用该列表中的自动编号。最后一个数字是3500.我想在自动出现下一个数字的表格中输入一个新项目(3501等等)。请注意,有关SPD或任何其他工具(少java脚本 - 我可以使用,我猜)的答案将无法正常工作。我甚至无法使用工作流程,因为我只有香草工作流程,而不是SPD的一部分。SharePoint列表中的自动编号

三江源

回答

0

好了,好了,好消息是,你可以做一些工作用JavaScript,但它不会是漂亮。

您可以编辑“新项目”的形式为您的SharePoint列表,并添加下面的默认窗体Web部件内容编辑器Web部件。

编辑内容编辑器Web部件的属性,并设置它的“内容链接”特性,在您的网站上的文档库中的文本文件。

在该文本文件,你可以嵌入你想...在这种情况下,我们将添加使用SharePoint客户端对象模型(CSOM)查询列表一些JavaScript,并得到最大的任何HTML和JavaScript号码列中的号码。然后我们将覆盖PreSaveAction()函数(只要有人点击“保存”就会触发该函数),并在保存之前将项目的编号设置为该值加1。

在下面的代码中,将“示例列表”替换为列表标题,将“MyAutonumberColumn”替换为具有自动编号的列的内部名称。

<script> 
window.MyNamespace = new Object(null); 
var my = window.MyNamespace; 
my.listName = "Example List"; 
my.columnInternalName = "MyAutonumberColumn"; 

ExecuteOrDelayUntilScriptLoaded(GetAutoNumber,"SP.JS"); 
function PreSaveAction(){ 
    var fieldDictionary = new Object(null); 
    var fields = document.querySelectorAll("td.ms-formbody"); 
    for (var i=0, len = fields.length; i < len; i++){ 
     var start = fields[i].innerHTML.indexOf("FieldInternalName="); 
     if(start >= 0){ 
      start += 19; 
      var internalName = fields[i].innerHTML.substring(start); 
      internalName = internalName.substring(0,internalName.indexOf('"')); 
      fieldDictionary[internalName] = fields[i]; 
     } 
    } 
    if(fieldDictionary[my.internalColumnName]){ 
     var element = fieldDictionary[my.internalColumnName].querySelector("select, textarea, input"); 
     element.value = my.autoNumber; 
     return true; 
    } 
} 
function GetAutoNumber(){ 
    var my = window.MyNamespace; 
    var clientContext = new SP.ClientContext(); 
    var list = clientContext.get_web().get_lists().getByTitle("my.listName"); 
    var camlQuery = new SP.CamlQuery(); 
    // use a CAML query to retrieve a set of list items: 
    camlQuery.set_viewXml(
     '<View><Query>'+ 
     '<OrderBy>'+ 
      '<FieldRef Name=\'"+my.columnInternalName+"\' Ascending='FALSE' />'+ 
     '</OrderBy>'+ 
     '</Query><RowLimit>1</RowLimit></View>'); 
    var items = list.getItems(camlQuery); 
    clientContext.load(items); 
    clientContext.executeQueryAsync(
     /* code to run on success: */ 
     Function.createDelegate(this, 
      function(){ 
       var item, itemEnumerator = items.getEnumerator(); 
       while(itemEnumerator.moveNext()){ 
        item = itemEnumerator.get_current(); 
        var number = item.get_item(my.columnInternalName); 
        my.autoNumber = +(number) + 1; 
       } 
      } 
     ), 
     /* code to run on error: */ 
     Function.createDelegate(this, 
      function(sender,args){ 
       alert(args.get_message()); 
      } 
     ) 
    ); 
    </script> 

有这种方法的明显缺点:如果两个人开始创建,同时项目,他们将与同样数量的创建。您可以随时进入并编辑这些项目,以根据需要为它们提供不同的数字,如果此列表不会被多人创建的新项目频繁更新,则可能会很好。