Las más grandes hazañas con Power Automate

  • 20 Sep 2023
  • Microsoft Power Automate

Trabajar con los permisos de un archivo de SharePoint Online

Cómo saber si un archivo tiene una configuración de permisos únicos o si hereda los mismos permisos de su objeto padre?

  • Action: Send an HTTP request to SharePoint
  • Method: POST
  • Uri: _api/lists/getByTitle('Nombre_de_la_lista')/items(ID_del_item)/HasUniqueRoleAssignments
  • Respuesta: bool(body('Send_an_HTTP_request_to_SharePoint')?['d']?['HasUniqueRoleAssignments'])

Cambiar el role a un archivo e elemento di una lista

En SharePoint, todos estamos familiarizados con niveles de permiso como Control total, Editar y Contribuir, etc. Utilizamos estos niveles de permiso para gestionar la accesibilidad a nivel de sitio/lista/elemento. A veces, creamos permisos personalizados para las necesidades del negocio. Estos permisos se definen en SharePoint con un identificador único que se llama "SharePoint Role Definition ID".

Para conocer el ID de los roles vamos a llamar la siguiente API: url_sitio/_api/web/roledefinitions. Esto va a devolver un XML donde podremos encontrar <Name> e <Id>, por ejemplo:

<entry>
    <id>
        https://.....sharepoint.com/sites/......./_api/Web/RoleDefinitions(1073741926)
    </id>
    <category term="SP.RoleDefinition" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <link rel="edit" href="Web/RoleDefinitions(1073741926)" />
    <title />
    <updated>
        2023-09-20T21:06:24Z
    </updated>
    <author>
        <name />
    </author>
    <content type="application/xml">
        <properties>
            <BasePermissions m:type="SP.BasePermissions">
                <High m:type="Edm.Int64">
                    128
                </High>
                <Low m:type="Edm.Int64">
                    196615
                </Low>
            </BasePermissions>
            <Description>
                Can view, add, update, and delete list items and documents but not delete
            </Description>
            <Hidden m:type="Edm.Boolean">
                false
            </Hidden>
            <Id m:type="Edm.Int32">
                1073741926
            </Id>
            <Name>
                Contribute not delete
            </Name>
            <Order m:type="Edm.Int32">
                2147483647
            </Order>
            <RoleTypeKind m:type="Edm.Int32">
                0
            </RoleTypeKind>
        </properties>
    </content>
</entry>

Otro elemento que vamos a necesitar es el ID del grupo del sitio. Para conocer los grupos de un sitio podemos llamar la API url_sitio/_api/web/sitegroups. Dentro la respuesta encontraremos el nombre y el id único:

<entry>
    <id>
        https://......sharepoint.com/sites/....../_api/Web/SiteGroups/GetById(4)
    </id>
    <category term="SP.Group" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <link rel="edit" href="Web/SiteGroups/GetById(4)" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Owner" type="application/atom+xml;type=entry" title="Owner" href="Web/SiteGroups/GetById(4)/Owner" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Users" type="application/atom+xml;type=feed" title="Users" href="Web/SiteGroups/GetById(4)/Users" />
    <title />
    <updated>
        2023-09-20T21:18:11Z
    </updated>
    <author>
        <name />
    </author>
    <content type="application/xml">
        <properties>
            <Id m:type="Edm.Int32">
                4
            </Id>
            <IsHiddenInUI m:type="Edm.Boolean">
                false
            </IsHiddenInUI>
            <LoginName>
                Visitatori di .....
            </LoginName>
            <Title>
                Visitatori di .....
            </Title>
            <PrincipalType m:type="Edm.Int32">
                8
            </PrincipalType>
            <AllowMembersEditMembership m:type="Edm.Boolean">
                false
            </AllowMembersEditMembership>
            <AllowRequestToJoinLeave m:type="Edm.Boolean">
                false
            </AllowRequestToJoinLeave>
            <AutoAcceptRequestToJoinLeave m:type="Edm.Boolean">
                false
            </AutoAcceptRequestToJoinLeave>
            <Description m:null="true" />
            <OnlyAllowMembersViewMembership m:type="Edm.Boolean">
                false
            </OnlyAllowMembersViewMembership>
            <OwnerTitle>
                Proprietari di .....
            </OwnerTitle>
            <RequestToJoinLeaveEmailSetting>
            </RequestToJoinLeaveEmailSetting>
        </properties>
    </content>
</entry>

Entonces, si queremos el el grupo Visitantes del sitio (id: 4) tenga permisos solo de lectura (role id: 1073741926) para un elemento determinado de una lista:

  • Action: Send an HTTP request to SharePoint
  • Method: POST
  • Uri: _api/lists/getByTitle('Nombre_de_la_lista')/items(ID_del_item)/roleassignments/addroleassignment(principalid=id_del_grupo,roleDefId=id_del_role)

Si en cambio queremos hacer lo mismo pero en un archivo:

  • Action: Send an HTTP request to SharePoint
  • Method: POST
  • Uri: _api/web/GetFileByServerRelativeUrl('/sites/nombre_del_sitio/fullpath_del_archivo')/ListItemAllFields/roleassignments/addroleassignment(principalid=id_del_grupo,roleDefId=id_del_role)

Asignar permisos de sistema a uno o varios usuario

  • Action: Grant access to an item or a folder
  • Recipients: Una cadena con direcciones de correo separadas por ; (punto y coma)
  • Roles: Edit o View

Eliminar todos los permisos a un elemento o archivo

La siguiente acción elimina todos los enlaces que dan acceso a un elemento o un archivo y elimina a todas las personas con acceso directo, excepto los propietarios.

  • Action: Stop sharing an item or a file
  • Id: ID del elemento

Reemplazar saltos de linea de una cadena por ;

La siguiente expresión puede resultar muy útil cuando necesitamos por ejemplo transformar una lista de direcciones de correo en una cadena delimitada por un caracter como punto y coma.

replace(cadena_multi_linea, decodeUriComponent('%0A'), ';')

Enviar un correo con archivos adjuntos

1. Declara una variable para los adjuntos

  • Action: Initialize variable
  • Name: attachment
  • Type: Array
  • Value: Dejar vacío

2. Obtener el contenido de los archivos

  • Action: Get file content

3. Agregar el archivo al array

  • Action: Append to array variable
  • Name: attachment
  • Value: 
{
  "Name": FilenameWithExtension,
  "ContentBytes": Get_file_content
}