列表中的Sharepoint自动编号

时间:2016-03-11 06:17:24

标签: sharepoint-2010

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

三江源

1 个答案:

答案 0 :(得分:0)

好吧,好消息是你可以用JavaScript做些什么,但它不会很漂亮。

您可以编辑SharePoint列表的“新项目”表单,并在默认表单Web部件下添加内容编辑器Web部件。

编辑内容编辑器Web部件属性,并将其“内容链接”属性设置为站点上文档库中的文本文件。

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

在下面的代码中,将“示例列表”替换为列表标题,将“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>

这种方法有一个明显的缺点:如果两个人同时开始创建项目,他们将使用相同的数字创建。您可以随时进入并编辑这些项目,根据需要为它们提供不同的数字,如果不经常使用多人创建的新项目更新此列表,则可能没问题。