Pregunta

Necesito crear algo (¿usando una solución de espacio aislado?) para demostrar que SharePoint tiene la capacidad para que los usuarios copien un documento (con sus atributos) de una biblioteca de documentos en un sitio a una biblioteca de documentos en otro sitio (la misma colección de sitios, si es importante) sin una aplicación externa.Esto será para que los usuarios de varios sitios puedan ir a mi biblioteca, elegir una plantilla de Word y luego copiar cualquier cantidad de ellas en su propia biblioteca.

Entiendo que esto puede resultar complicado con el selector de personas y los campos de búsqueda, pero incluso la funcionalidad más básica es apropiada ahora.Originalmente pensábamos que había una función OOTB que podría hacer eso, pero no parece ser de mucha ayuda, así que estoy dispuesto a aprender cualquier cosa en este momento.

Solo estoy buscando una recomendación sobre la mejor manera de hacer esto antes de pensar demasiado en la solución.

editar:Explorer y Designer han sido descartados como opciones para nuestros usuarios finales.El ejemplo más cercano de lo que estoy buscando es la opción "Enviar a otra ubicación" que le permite copiar archivos con sus metadatos a otra biblioteca.Pero me gustaría que los usuarios pudieran hacer esto de forma masiva (por ejemplo, hacer 20 copias de una determinada plantilla en una sola instancia).¿Puedo modificar esta herramienta o necesitaría crear la mía propia?¡Gracias!

¿Fue útil?

Solución


Yo no en tu publicación dijiste "sin una aplicación externa" pero ¿eso incluye las bibliotecas js?
A continuación se muestra una solución sencilla que copiará un documento de una biblioteca de SP a cualquier otra biblioteca de SP.No he verificado sus capacidades de secuencias de comandos entre sitios, pero en teoría debería funcionar en granjas, dominios y diferentes versiones de SP.(Funciona al 100% en todas las webs de la misma colección de sitios)
Simplemente copie este código en un archivo .html, reemplace la ruta/a/jquery* con la ruta a sus archivos jquery y spservices, y agregue un elemento web Editor de contenido a cualquier página en la que desee alojar la interfaz y configure su enlace de contenido. a la ubicación del archivo .html que creó.

Como desea permitir el envío a múltiples destinos, recomiendo usar un área de texto para las URL de destino y luego analizarlas por línea, es decir: $("textarea").val().split("\n").each(myfunc);

También puede ampliar esto para utilizar el actualmente seleccionado documento como fuente o incluso usar una lista desplegable de elementos con fichas de URL para enviar un parámetro de cadena de consulta a otra página cuyos valores le brindarían la información necesaria para recuperar la información del documento fuente.

Nota: Este ejemplo utiliza Jquery y SPServicios
Referencias: Usando JS en CEWP

<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>

ACTUALIZAR

En lugar de analizar las URL de destino una por una, puedes almacenarlas en una matriz y pasarlas al DestinationUrls parámetro que acepta una serie de URL de destino.

Además, probé esta función con éxito en la consola en una página que contiene spservices y la biblioteca jquery usando URL absolutas codificadas para el dst y itemurl variables.

ACTUALIZACIÓN 2

Olvidé mencionar que tuve problemas al copiar los campos.Lo que terminé haciendo fue recuperar los campos de la Lista de origen y eliminar los de solo lectura usando la siguiente función.
Olvidé mencionar esto porque mi implementación particular me brinda fácil acceso al listguid fuente a través de una cadena de consulta.Si necesitas encontrar el tuyo consulta el $().SPServices.SPListNameFromUrl función con la que he tenido un éxito desigual.

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

Otros consejos

Puedo pensar en 2 opciones muy simples:

1) Los usuarios pueden copiar elementos con listas / bibliotecas abiertas en Windows Explorer

2) Los usuarios pueden copiar documentos con "contenido y estructura":

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

Opción One no traerá todos los metadatos del documento a través de la nueva ubicación (por ejemplo, creado, modificado, etc.).

Puede que me falte algo, pero ¿por qué no solo configurar los documentos originales como tipos de contenido del sitio?Al configurarlos como un tipo de contenido, puede incluir los campos de metadatos y asignar una plantilla predeterminada (su documento original) al tipo.Una vez que se haya configurado el tipo de contenido, puede incluirlo en la biblioteca de documentos de los usuarios, por lo que no tiene que haber copiado de un lado a otro.

Además, si cambia el documento original, simplemente puede actualizar el tipo de contenido y la plantilla cambiará para todas partes, en lugar de que tenga que volver a copiar el documento a cada destino separado.

Licenciado bajo: CC-BY-SA con atribución
scroll top