Spring til indholdet

Opret en liste og styr indholdstyperne med REST fra Power Automate

En ny liste med en pæn adresse, egne indholdstyper i stedet for Element, en visning og versionering — med Send an HTTP request to SharePoint.

Opdateret Power AutomateSharePoint Online 4 min. læsning

SharePoint-connectoren i Power Automate kan ikke oprette en liste, og den kan ikke tilføje eller fjerne indholdstyper. REST-API’et kan begge dele med Send an HTTP request to SharePoint, som hører til connectoren og ikke kræver Premium. Fremgangsmåden her følger SharePointCass’ “Create a SharePoint list and add/remove content types through REST API in Power Automate” (2020).

Kolonner på listen står for sig i Kolonner på en SharePoint-liste med REST.

En listes adresse bliver lavet af titlen, den oprettes med, og ændrer sig ikke, når listen omdøbes. Oprettes listen som “Project Tasks”, bliver adressen /Lists/Project%20Tasks. Derfor oprettes den med en titel uden mellemrum, og den rigtige titel sættes bagefter.

Name: varListTitle
Type: String
Value: triggerOutputs()?['body/ListName']
Name: varListTitleNoSpaces
Type: String
Value: replace(variables('varListTitle'), ' ', '')
Name: varContentTypeID
Type: String
Value: 0x0100A1B2C3D4E5F607080910111213

Indholdstypens id står i adressen, når indholdstypen åbnes under Webstedsindstillinger → Webstedsindholdstyper (ctype=0x0100…).

Opret listen#

Site Address: [Target SharePoint site]
Method: POST
Uri: _api/web/lists
Headers:
{
  "Accept": "application/json;odata=verbose",
  "Content-Type": "application/json;odata=verbose"
}
Body:
{
  "__metadata": { "type": "SP.List" },
  "AllowContentTypes": true,
  "BaseTemplate": 100,
  "ContentTypesEnabled": true,
  "Description": "@{variables('varListTitle')} - Created by Power Automate",
  "Title": "@{variables('varListTitleNoSpaces')}"
}

ContentTypesEnabled: true er det samme som Tillad administration af indholdstyper i listens indstillinger. BaseTemplate er listeskabelonen:

100 = Custom List
101 = Document Library
104 = Announcements
105 = Contacts
106 = Events
107 = Tasks
171 = Task List with Timeline

Derefter titlen med mellemrum, med en MERGE mod listen:

Method: POST
Uri: _api/web/lists/getbytitle('@{variables('varListTitleNoSpaces')}')
Headers:
{
  "Accept": "application/json;odata=verbose",
  "Content-Type": "application/json;odata=verbose",
  "IF-MATCH": "*",
  "X-HTTP-Method": "MERGE"
}
Body:
{
  "__metadata": { "type": "SP.List" },
  "Title": "@{variables('varListTitle')}"
}

Fra nu af hedder listen varListTitle i getbytitle. Mellemrum i titlen er ikke et problem i URI’en. Power Automate koder dem selv.

Tilføj en indholdstype#

Indholdstypen skal findes på webstedet. En indholdstype fra content type hub’en kommer ikke længere ud til webstederne af sig selv, men skal hentes til webstedet først, med addCopyFromContentTypeHub. Id’et står i adressen:

Method: POST
Uri: _api/web/lists/getbytitle('@{variables('varListTitle')}')/ContentTypes/AddAvailableContentType('@{variables('varContentTypeID')}')
Headers:
{
  "Accept": "application/json;odata=verbose",
  "Content-Type": "application/json;odata=verbose"
}

Flere på én gang med en Apply to each over et array af id’er og samme kald i løkken.

Fjern Element#

Standardindholdstypen hedder Item på et engelsk websted og Element på et dansk. Den skal fjernes efter de nye er tilføjet, ellers har listen ingen indholdstype at give nye elementer.

Hent den på listen:

Method: GET
Uri: _api/web/lists/getbytitle('@{variables('varListTitle')}')/ContentTypes?$filter=Name eq 'Item'
Headers:
{
  "Accept": "application/json;odata=verbose"
}

Id’et står i StringId:

body('Get_Item_Content_Type')?['d']?['results']?[0]?['StringId']

Det er ikke 0x01. En indholdstype på en liste er en kopi af webstedets og får sit eget id: forælderens id, 00 og en ny GUID. Element på listen hedder altså noget i retning af 0x0100 efterfulgt af 32 hextegn. Derfor slås det op i stedet for at blive skrevet ind.

Slet den:

Method: POST
Uri: _api/web/lists/getbytitle('@{variables('varListTitle')}')/ContentTypes('@{body('Get_Item_Content_Type')?['d']?['results']?[0]?['StringId']}')/deleteObject()
Headers:
{
  "Accept": "application/json;odata=verbose",
  "Content-Type": "application/json;odata=verbose",
  "IF-MATCH": "*"
}

deleteObject() er selve sletningen, så en X-HTTP-Method: DELETE oveni er ikke nødvendig. Det har jeg ikke efterprøvet uden headeren. Cass’ flow sender X-HTTP-Method: MERGE med og virker.

Visning#

Standardvisningen:

Method: GET
Uri: _api/web/lists/getbytitle('@{variables('varListTitle')}')/DefaultView

Kolonnerne i en visning kan ikke sættes med en MERGE på ViewFields. De lægges på én ad gangen:

Method: POST
Uri: _api/web/lists/getbytitle('@{variables('varListTitle')}')/Views('@{body('Get_Default_View')?['d']?['Id']}')/ViewFields/addViewField('Status')
Headers:
{
  "Accept": "application/json;odata=verbose",
  "Content-Type": "application/json;odata=verbose"
}

removeAllViewFields på samme sted tømmer visningen først. Feltnavnet er det interne navn.

Indstillinger på listen#

Samme MERGE mod listen som ved omdøbningen, med en anden body. Versionering:

1{
2  "__metadata": { "type": "SP.List" },
3  "EnableVersioning": true,
4  "MajorVersionLimit": 500
5}

Godkendelse af indhold:

1{
2  "__metadata": { "type": "SP.List" },
3  "EnableModeration": true
4}

Skjult liste:

1{
2  "__metadata": { "type": "SP.List" },
3  "Hidden": true
4}

Fejl#

“List does not exist”. Titlen i getbytitle passer ikke til listen. Efter omdøbningen er det den nye titel.

“The request ETag value does not match the object’s ETag value”. IF-MATCH: * mangler.

“Content type is still in use”. Der ligger elementer med indholdstypen. De skal have en anden indholdstype eller slettes først. På en liste, der lige er oprettet, sker det ikke.

Indholdstypen findes ikke. Id’et er forkert, eller indholdstypen er ikke på webstedet endnu. En indholdstype fra content type hub’en skal være hentet til webstedet, før listen kan få den.

Listen findes allerede. Et flow, der kører to gange, fejler på oprettelsen. En GET på getbytitle først, eller en Configure run after på fejlen, gør flowet sikkert at køre igen.

Det der driller#

  • Adressen følger den første titel. Den eneste måde at få /Lists/ProjectTasks er at oprette listen sådan og omdøbe den bagefter.
  • Element har ikke id 0x01 på listen. Og navnet er på webstedets sprog, så Name eq 'Item' finder formentlig intet på et dansk websted, hvor den hedder Element. Det sidste har jeg ikke efterprøvet. Uafhængigt af sproget: listens kopi af en indholdstype har et id, der begynder med webstedets id, så Element er den af listens indholdstyper, hvis StringId ikke begynder med varContentTypeID. En Filter array med not(startsWith(item()?['StringId'], variables('varContentTypeID'))) finder den. Er Folder (0x0120…) med i svaret, skal den blive.
  • Rækkefølgen. Tilføj først, fjern bagefter.
  • Visningens kolonner lægges på med addViewField, ikke med en MERGE.

Alle noter