,我需要构建一些东西(使用沙盒解决方案?)来证明 SharePoint 能够让用户将文档(及其属性)从一个网站的文档库复制到另一个网站(同一网站集、如果重要的话)无需外部应用程序。这样,跨多个站点的用户就可以访问我的库,选择一个单词模板,然后将任意数量的模板复制到他们自己的库中。

我知道这可能会因人员选择器和查找字段而变得复杂,但即使是最基本的功能现在也是合适的。我们最初认为有一个 OOTB 功能可以做到这一点,但这似乎没有多大帮助,所以我愿意在这一点上学习任何东西。

我只是在寻找最佳方法的建议,然后再可能过度考虑解决方案。

编辑:Explorer 和 Designer 已被排除在我们最终用户的选项之外。我正在寻找的最接近的示例是“发送到其他位置”选项,该选项允许您将文件及其元数据复制到另一个库。但我希望用户能够批量执行此操作(例如,在一个实例中制作某个模板的 20 个副本)。我可以修改这个工具还是需要创建自己的工具?谢谢!

有帮助吗?

解决方案


我没有在你的帖子中说过 “无需外部应用程序” 但这包括js库吗?
下面是一个简单的解决方案,它将文档从一个 SP 库复制到任何其他 SP 库。我尚未验证其跨站点脚本功能,但理论上它应该可以跨场、域和不同的 SP 版本工作。(它 100% 在同一网站集中跨网站工作)
只需将此代码复制到 .html 文件中,将 path/to/jquery* 替换为 jquery 和 spservices 文件的路径,然后将内容编辑器 Web 部件添加到您想要托管界面的页面并设置其内容链接到您创建的 .html 文件的位置。

由于您希望允许发送到多个目的地,因此我建议使用文本区域代替目的地网址,然后按行解析它们,即: $("textarea").val().split("\n").each(myfunc);

您还可以扩展它以利用 当前选择的 文档作为源,甚至使用列表项下拉列表 网址标记 将查询字符串参数发送到另一个页面,其值将为您提供检索源文档信息所需的信息。

笔记: 此示例使用 Jquery 和 SP服务
参考: 在CEWP中使用JS

<label>Copy From:</label><input type="text" value="" id="copyFrom" maxlength="255">
<label>Copy To:</label><input type="text" value="" id="copyTo" maxlength="255">
<input type="button" onclick="copyItem();" value="Copy">
<script type="text/javascript" src="/path/to/jquery.ver"></script>
<script type="text/javascript" src="/path/to/jquery.SPServices.ver"></script>
<script type="text/javascript">
    function copyItem(){
        var itemurl = $("#copyFrom").val();
        var dst = $("#copyTo").val();
        $().SPServices({
            operation: "GetItem",
            Url: itemurl,
            async: false,
            completefunc: function (xData, Status) {
                itemstream = $(xData.responseXML).find("Stream").text();
                       console.log(itemstream);
                itemfields = "";
                $(xData.responseXML).find("FieldInformation").each(function(){
                    itemfields+=$(this).get(0).xml;
                });

            }
        });
        $().SPServices({
            operation: "CopyIntoItems",
            SourceUrl: itemurl,
            async: false,
            DestinationUrls: [dst],
            Stream: itemstream,
            Fields:itemfields,
            completefunc: function (xData, Status) {
                var error = $(xData.responseXML).find("CopyResult").first().attr("ErrorCode");
                       console.log(error);
            }
        });
    }
    //to run in console uncomment line below
    //copyItem();
</script>

更新

您实际上可以将它们存储在一个数组中并将其传递给 DestinationUrls 接受目标 url 数组的参数。

另外,我已经在包含 spservices 和 jquery 库的页面上的控制台中成功测试了此函数,使用硬编码的绝对 url dstitemurl 变量。

更新2

我忘记提及我在复制字段时遇到问题。我最终做的是检索源列表字段并使用下面的函数删除任何只读字段。
我忽略了这一点,因为我的特定实现使我可以通过查询字符串轻松访问源 listguid。如果您需要找到您的,请查看 $().SPServices.SPListNameFromUrl 我所使用的功能有好有坏。

var fieldstocopy = '';
    var itemfieldsxml = $.parseXML(itemfields);
    $().SPServices({
      operation: "GetList",
      listName: ListGUID,
      async: false,
      completefunc: function(xData, Status) {
        $(xData.responseXML).find("Fields > Field").not("[ReadOnly='TRUE']").each(function() {
          var $node = $(this);
          fieldstocopy+=$(itemfieldsxml).find("FieldInformation[InternalName='"+$node.attr("Name")+"']").first().get(0).xml;
        });
      }
    });

其他提示

我可以想到2个非常简单的选项:

1)用户可以在Windows资源管理器中打开的列表/库复制项目

2)用户可以用“内容和结构”复制文档:

http://yoursite/_Layouts/sitemanager.aspx?Source={WebUrl}_layouts/settings.aspx
.

选项不会将所有文档的元数据带到新位置(例如,创建,修改等)。

我可能会丢失一些东西,但为什么不仅仅将原始文档设置为网站内容类型?通过将它们设置为内容类型,您可以包含元数据字段并将默认模板(原始文档)分配给类型。设置内容类型后,您可以在用户的文档库中包含它,以便不必是可以来回复制。 此外,如果您碰巧更改原始文档,您只需更新内容类型,并且模板将为包含在内的任何地方,而不是您必须将文档重新复制到每个单独的目的地。

许可以下: CC-BY-SA归因
scroll top