Pergunta

,Preciso criar algo (usando uma solução em área restrita?) para demonstrar que o SharePoint tem a capacidade de os usuários copiarem um documento (com seus atributos) de uma biblioteca de documentos em um site para uma biblioteca de documentos em outro site (mesmo conjunto de sites, se for importante) sem um aplicativo externo.Isso acontecerá para que usuários de vários sites possam acessar minha biblioteca, escolher um modelo do Word e copiar qualquer número deles para sua própria biblioteca.

Entendo que isso pode se tornar complicado com o seletor de pessoas e os campos de pesquisa, mas mesmo a funcionalidade mais básica é apropriada agora.Originalmente, estávamos pensando que havia um recurso OOTB que poderia fazer isso, mas isso não parece ser de muita ajuda, então estou disposto a aprender qualquer coisa neste momento.

Estou apenas procurando uma recomendação sobre a melhor maneira de fazer isso antes de pensar demais na solução.

editar:Explorer e Designer foram descartados como opções para nossos usuários finais.O exemplo mais próximo do que estou procurando é a opção "Enviar para outro local", que permite copiar arquivos com seus metadados para outra biblioteca.Mas eu gostaria que os usuários pudessem fazer isso em massa (por exemplo, fazer 20 cópias de um determinado modelo em uma instância).Posso modificar esta ferramenta ou precisarei criar a minha própria?Obrigado!

Foi útil?

Solução


Eu não no seu post você disse "sem aplicativo externo" mas isso inclui bibliotecas js?
Abaixo está uma solução simples que copiará um documento de uma biblioteca SP para qualquer outra biblioteca SP.Não verifiquei seus recursos de script entre sites, mas teoricamente deveria funcionar em farms, domínios e diferentes versões de SP.(Funciona 100% em sites no mesmo conjunto de sites)
Simplesmente copie este código em um arquivo .html, substitua o caminho/para/jquery* pelo caminho para seus arquivos jquery e spservices e adicione uma Web Part do Editor de Conteúdo a qualquer página que você deseja hospedar a interface e defina seu link de conteúdo para o local do arquivo .html que você criou.

Como você deseja permitir o envio para vários destinos, recomendo usar uma área de texto para os URLs de destino e analisá-los por linha, ou seja: $("textarea").val().split("\n").each(myfunc);

Você também pode estender isso para utilizar o Atualmente selecionado documento como fonte ou até mesmo usar um menu suspenso de itens de lista com tokens de URL para enviar um parâmetro de string de consulta para outra página cujos valores forneceriam as informações necessárias para recuperar as informações do documento de origem.

Observação: Este exemplo usa Jquery e SPServiços
Referências: Usando JS no 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>

ATUALIZAR

Em vez de analisar um URL de destino de cada vez, você pode armazená-los em uma matriz e passá-los para o DestinationUrls parâmetro que aceita uma matriz de URLs de destino.

Além disso, testei essa função com sucesso no console em uma página contendo a biblioteca spservices e jquery usando URLs absolutos codificados para o dst e itemurl variáveis.

ATUALIZAÇÃO 2

Esqueci de mencionar que tive problemas ao copiar os campos.O que acabei fazendo foi recuperar os campos da lista de origem e remover aqueles somente leitura usando a função abaixo.
Esqueci de mencionar isso porque minha implementação específica me dá acesso fácil ao listguid de origem por meio de uma string de consulta.Se você precisa encontrar o seu, confira o $().SPServices.SPListNameFromUrl função com a qual tive sucesso misto.

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

Outras dicas

Posso pensar em 2 opções muito simples:

1) os usuários podem copiar itens com listas/bibliotecas abertas no Windows Explorer

2) os usuários podem copiar documentos com “Conteúdo e estrutura”:

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

A primeira opção não trará todos os metadados do documento para o novo local (por exemplo,Criado, Modificado, etc.).

Eu posso estar faltando alguma coisa, mas por que não apenas configurar os documentos originais como tipos de conteúdo do site?Ao configurá-los como um tipo de conteúdo, você pode incluir os campos de metadados e atribuir um modelo padrão (seu documento original) ao tipo.Depois que o tipo de conteúdo tiver sido configurado, você pode incluí-lo na biblioteca de documentos dos usuários, para que não tenha que haver nenhuma cópia para frente e para frente.

Além disso, se você for alterar o documento original, poderá apenas atualizar o tipo de conteúdo e o modelo será alterado em todos os lugares que tiver sido incluído, em vez de você ter que copiar o documento para cada destino separado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top