Crear campos personalizados de Project Server mediante el API CSOM con Powershell

Me ha parecido de interés generar una serie de scripts para desplegar estructuras en Project Server / Online: campos personalizados, vistas, importación de flujos… De esta forma, podría desplegar entornos de un servidor a otro o reaprovechar estructuras para varios proyectos. Y, para ello, he elegido Powershell como herramienta de desarrollo.

En esta ocasión, voy a comentar cómo generar campos personalizados de empresa (Enterprise custom fields). Me ha costado encontrar algún ejemplo y ninguno en Powershell, así que, con más razón, creo que le puede ser de utilidad a alguien.

Para empezar, hay que regitrar las dlls del Api de cliente (CSOM) tanto de Project Server como de Sharepoint. Esto es así ya que para la conexión con el sitio de PWA es necesario usar el modelo de objetos de Sharepoint. Las dlls suelen estar en la instalación estandar del producto, pero si no se van a utilizar desde un servidor, simplemente hay que copiarlas a cualquier ruta del equipo y cambiar la referencia a las mismas en el script:

#Project CSOM
Add-Type -Path ‘C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.ProjectServer.Client.dll’
#Sharepoint CSOM
Add-Type -Path ‘C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll’

A continuación, conectaremos con nuestra instancia de PWA con las credenciales de un usuario administrador:

$PWAInstanceURL = “http://miservidor/pwa”
$PWAUserName = “dominio\usuario”
$PWAUserPassword = Read-Host -AsSecureString “cuál es la contraseña del usuario?”
$projContext = New-Object Microsoft.ProjectServer.Client.ProjectContext($PWAInstanceURL)

Lo siguiente es abrir la conexión con el sitio de PWA utilizando las credenciales proporcionadas. En el ejemplo se abre una conexión utilizando credenciales de red para conectar con un sitio de Project Server:

[System.Net.NetworkCredential]$spocreds = New-Object System.Net.NetworkCredential($PWAUserName, $PWAUserPassword); $projContext.Credentials = $spocreds

Si se quiere conectar con una instancia en Project Online, simplemente hay que cambiar el tipo de credenciales:

[Microsoft.SharePoint.Client.SharePointOnlineCredentials]$spocreds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($PWAUserName, $PWAUserPassword);

Para generar un nuevo campo personalizado, lo primero es cargar los campos existentes, para poder añadir a esa colección el nuevo elemento:

$projContext.Load($projContext.CustomFields)

También es necesario cargar el tipo de entidades disponibles (proyecto, recurso, tarea…) para poder indicar de qué tipo será el nuevo campo que vamos a crear:

 [Microsoft.ProjectServer.Client.EntityTypes] $entityTypes = $projContext.EntityTypes
$projContext.Load($entityTypes)

$projContext.ExecuteQuery()

Con todo esto, ya podemos crear el nuevo campo, en este caso, uno de tipo numérico:

$customFieldInfo = New-Object Microsoft.ProjectServer.Client.CustomFieldCreationInformation;
$customFieldInfo.Name = “MiCampo”
$customFieldInfo.FieldType = [Microsoft.ProjectServer.Client.CustomFieldType]::Number
$customFieldInfo.EntityType = $entityTypes.ResourceEntity
$customFieldInfo.Id = “0000783f-de84-434b-9564-284e5b7b3f42”

A destacar unas cuantas cosas:

  • El objeto para crear el nuevo campo es de tipo CustomFieldCreationInformation
  • La propiedad “FieldType” es una enumeración cuyos valores pueden ser, por ejemplo: COST, DATE, FINISHDATE, DURATION, FLAG, NUMBER, o TEXT.
  • El valor de la propiedad EntityType se obtiene de los tipos de entidades que cargamos en la variable $entityTypes: ProjectEntity,TaskEntity o ResourceEntity.
  • El campo se creará con el Id que se le asigne, lo cuál es imprescindible a la hora de mantener la integridad de los flujos de Project Server entre entornos.

Finalmente, se añade el nuevo campo a la lista de campos personalizados (custom fields) existentes, la actualizamos y lanzamos la ejecución de estos comandos:

$newCustomField = $projContext.CustomFields.Add($customFieldInfo);
$projContext.CustomFields.Update()
$projContext.ExecuteQuery()

Todo junto tiene este aspecto:

Powershell_CreateCustomField1

Y el resultado es este:

Powershell_CreateCustomField2

Conclusión

En esta entrada hemos visto como crear un nuevo campo personalizado. No hemos generado todas las propiedades posibles ya que muchas de las que faltan son campos booleanos (IsRequired, IsMultilineText…):

Powershell_CreateCustomField3

Las únicas de interés serían LookupTable y Formula: como ayuda, indicar que para obtener el valor de la propiedad LookupTable habría que buscar el objeto correspondiente en la colección de tablas empresariales de búsqueda y asignárselo. Por otro lado, la propiedad “Formula” es de tipo cadena, así que parece que bastaría con asignar la fórmula tal y como se introduciría de forma manual.

Anuncios

2 comentarios en “Crear campos personalizados de Project Server mediante el API CSOM con Powershell

Los comentarios están cerrados.