Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

É possível criar um arquivo no SharePoint através do Flow e realizar o Check-in automaticamente?

Instrutor Guilherme Matheus, Criei um fluxo no Microsoft Flow que copia os novos arquivos criados em uma pasta para outra dentro de uma biblioteca de documentos no SharePoint, porém ao criar os arquivos na pasta destino, eles ficam com Check-out na primeira versão e para que eles sejam disponibilizados para outros usuários é necessário realizar o Check-in manualmente. Haveria alguma forma de realizar o Check-in automaticamente assim que os arquivos são copiados/criados para na pasta destino, sem desabilitar o check-out obrigatório no SharePoint? Desde já, obrigado pela ajuda.

8 respostas

Olá, Célio.

Atualmente, o Microsoft Flow não oferece ação de check-in.

Uma alternativa sem código seria criar um Workflow que realiza o check-in na criação de um novo documento.

Outras formas de atingir este objetivo seriam com o uso de Remote Event Receiver ou a criação de um WebHook. Mas, estas soluções são bem mais complexas e exigem o desenvolvimento de código.

Olá Instrutor, obrigado pelo retorno!

A primeira alternativa eu não consegui, não sei qual o tipo de conflito que pode estar ocorrendo mas não consigo criar um workflow no SharePoint Designer 2013. Sobre usar uma Remote Event Receiver, eu acredito estar no caminho, mas não sei qual a validação eu utilizo no código.

Ao criar o Remote Event Receiver o código abaixo foi inserido automaticamente:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.EventReceivers;

namespace SharePointAutoCheckin2Web.Services
{
    public class RemoteEventReceiver1 : IRemoteEventService
    {
        /// <summary>
        /// Handles events that occur before an action occurs, such as when a user adds or deletes a list item.
        /// </summary>
        /// <param name="properties">Holds information about the remote event.</param>
        /// <returns>Holds information returned from the remote event.</returns>
        public SPRemoteEventResult ProcessEvent(SPRemoteEventProperties properties)
        {
            SPRemoteEventResult result = new SPRemoteEventResult();

            using (ClientContext clientContext = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
            {
                if (clientContext != null)
                {
                    clientContext.Load(clientContext.Web);
                    clientContext.ExecuteQuery();
                }
            }

            return result;
        }

        /// <summary>
        /// Handles events that occur after an action occurs, such as after a user adds an item to a list or deletes an item from a list.
        /// </summary>
        /// <param name="properties">Holds information about the remote event.</param>
        public void ProcessOneWayEvent(SPRemoteEventProperties properties)
        {
            using (ClientContext clientContext = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
            {
                if (clientContext != null)
                {
                    clientContext.Load(clientContext.Web);
                    clientContext.ExecuteQuery();
                }
            }
        }
    }
}

Qual seria o método para fazer o check-in? Pesquisei em algumas páginas mas não encontrei, talvez eu esteja buscando da forma errada. Poderia me ajudar mais uma vez Instrutor? Obrigado.

Existem 2 tipos de eventos a serem manipulados no SharePoint: eventos -ing e eventos -ed.

Os eventos -ing representam algo que está acontecendo e você pode cancelar: creating, saving, deleting, etc.. Para tratar estes eventos, você implementa o método ProcessEvent da interface IRemoteEventService.

Os eventos -ed representam algo que aconteceu e você poderá mais cancelar: created, saved, deleted, etc.. Para tratar estes eventos, você implementa o método ProcessOneWayEvent.

Então em seu caso, você usará um evento ed e o tratará em ProcessOneWayEvent.

Com a propriedade do argumento properties.ItemEventProperties você poderá acessar o ListId e o ListItemId do item copiado para a sua lista.

Com isso, você poderá obter o arquivo representado na classe Microsoft.SharePoint.Client.File e usar o método File.CheckIn.

No fim, você terá algo assim:

public SPRemoteEventResult ProcessOneWayEvent(SPRemoteEventProperties properties)
{
    SPRemoteEventResult result = new SPRemoteEventResult();

    using (ClientContext clientContext = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
    {
        if (clientContext != null)
        {
            clientContext.Load(clientContext.Web);
            clientContext.ExecuteQuery();

            var file = clientContext.Web.GetFileById(properties.ItemEventProperties.ListItemId);
            clientContext.Load(file);
            clientContext.ExecuteQuery();

            file.CheckIn("CheckIn automático", CheckinType.MajorCheckIn);
            clientContext.ExecuteQuery();
        }
    }

    return result;
}

Show Instrutor! Tenho uma dúvida rápida, para a criação do RemoteEventReceiver, o Visual Studio só permite a criação relacionado à Lista, nesse caso essa opção também serve para biblioteca de documentos, certo?

Estou tentando realizar as configurações no código conforme orientou, mas estou pegando um erro de tipos incompatíveis, pois ao tentar pegar o arquivo pelo properties.ItemEventProperties.ListTitle que do tipo int porém o tipo que o método GetFileById espera é Guid.Tentei converter o retorno intcom a criação do método abaixo mas sem sucesso:

public static Guid ToGuid(int value)
{
    byte[] bytes = new byte[16];
    BitConverter.GetBytes(value).CopyTo(bytes, 0);
    return new Guid(bytes);
}

Uma outra observação é que ao inserir o código é ele apresenta um pequeno erro e também o seguinte fix:

void IRemoteEventService.ProcessOneWayEvent(SPRemoteEventProperties properties)
        {
            throw new NotImplementedException();
        }

Poderia me ajudar com mais algumas dicas Instrutor? Obrigado!

Na resposta anterior, acabei escrevendo a assinatura errada para o método. Então, no lugar de public SPRemoteEventResult ProcessOneWayEvent(SPRemoteEventProperties properties) o correto seria public void ProcessOneWayEvent(SPRemoteEventProperties properties)!

Sobre a conversão de INT para Guid, não podemos fazer a conversão desta forma. O Guid de um documento é criado de forma randômica, independente do ID. Uma alternativa que encontrei foi buscar o arquivo por meio de sua URL:

var file = clientContext.Web.GetFileByUrl(properties.ItemEventProperties.BeforeUrl);

E manter o restante do código como mencionei acima.

No SharePoint, tudo é lista! Uma biblioteca de documentos é uma lista especializada.

Olá instrutor, tudo joia?

Realizei as alterações conforme orientou, mas no fim tomei um erro de permissão.

"Error occurred in deployment step 'install SharePoint Add-in': o sideload de aplicativos não está habilitado neste site".

Considero que vou precisar entrar em contato com o Admin do office 365 para autorizar esse tipo implementação.

Antes de falar com o Admin, encontrei um tutorial no link abaixo:

https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/deploy-and-install-a-sharepoint-hosted-sharepoint-add-in

Você considera que esse tutorial possa ser útil caso ele precise?

Mais uma vez obrigado pelo retorno!

solução!

Sideload é a feature site-level que permite a instalação de um app sem antes ser adicionado ao catálogo de aplicativos (tarefa do administrador Sharepoint do Office365) e instalado no site (tarefa do administrador de site).

A única razão deste recurso existir é para debug e desenvolvimento. Essa feature vem ativada por padrão em sites criados com o template de "Site de desenvolvimento" e em outros templates é necessário habilitar (somente por powershell).

O artigo que você enviou não é exatamente o que você está buscando. Sugiro este https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/create-a-remote-event-receiver-in-sharepoint-add-ins .

De qualquer maneira, tenha em mente que um Remote Event Receiver é ativado à partir de uma chamada do servidor do SharePoint. Isso significa que o host de sua aplicação deve ser visível ao servidor do Sharepoint e no artigo que eu linkei temos algumas restrições como: necessidade de SSL e porta 443.

Como estamos falando de SharePoint Online, será necessário uma aplicação publicada e visível na internet para os servidores da Microsoft poderem chamar sua aplicação quando o evento de alteração/criação de documentos acontecer.

A criação de aplicativos no SharePoint é um assunto bem complicado mesmo.

Célio, se seu objetivo for desenvolver para SharePoint, sugiro que você leia sobre:

  • Desenvolvimento e debug de addins no Sharepoint Online;
  • CSOM;
  • Catálogo de aplicativos;
  • Fluxo e eventos durante a instalação de um addin;
  • Tipos de addin: Sharepoint-hosted addin vs. Provider-hosted addin;

De qualquer modo, não quero perder o foco da pergunta deste tópico e vamos perceber que todo este processo está sendo caro demais (consumo de tempo, custo de servidor para hospedagem, certificado ssl etc.) para o objetivo que você quer atingir. Considere conversar com o usuário sobre desabilitar o recurso de checkin/checkout desta biblioteca.

Falou tudo Instrutor! Vou validar essa possibilidade, muito obrigado pela resposta e orientação!