将文档从一个站点复制到另一个站点..?
-
10-12-2019 - |
题
,我需要构建一些东西(使用沙盒解决方案?)来证明 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 dst
和 itemurl
变量。
更新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
.
选项不会将所有文档的元数据带到新位置(例如,创建,修改等)。
我可能会丢失一些东西,但为什么不仅仅将原始文档设置为网站内容类型?通过将它们设置为内容类型,您可以包含元数据字段并将默认模板(原始文档)分配给类型。设置内容类型后,您可以在用户的文档库中包含它,以便不必是可以来回复制。 此外,如果您碰巧更改原始文档,您只需更新内容类型,并且模板将为包含在内的任何地方,而不是您必须将文档重新复制到每个单独的目的地。