Kolonner på en SharePoint-liste med REST
Hent, opret, ret og slet kolonner med SharePoints REST-API — body for hver felttype, FieldTypeKind-værdierne og de fejl, der dukker op.
Når de samme kolonner skal på mange lister — en standard for projektlister, et skema der flyttes fra test til drift — er det hurtigere at sende dem gennem REST-API’et end at klikke dem på via UI. Kaldene her virker fra Send an HTTP request to SharePoint i Power Automate (SharePoint-connectoren, ikke Premium) og fra alt andet, der kan sende en HTTP-forespørgsel. Selvfølgelig er det bedre at bruge contenttypes. Men sådan er virkeligheden jo ikke altid.
Endpoints#
Hent:
GET _api/web/lists/getbytitle('ListName')/fields
GET _api/web/lists/getbytitle('ListName')/fields?$filter=Hidden eq false
GET _api/web/lists/getbytitle('ListName')/fields/getbytitle('FieldName')
GET _api/web/lists/getbytitle('ListName')/fields/getbyinternalnameortitle('Field_Name')
GET _api/web/lists/getbytitle('ListName')/fields('guid')
GET _api/web/lists/getbytitle('ListName')/fields?$select=Title,InternalName,TypeAsString,Required
Alle felter, kun de synlige, ét efter visningsnavn, ét efter internt navn eller visningsnavn, ét efter id, og kun de egenskaber, der skal bruges.
Opret:
POST _api/web/lists/getbytitle('ListName')/fields
Headers:
{
"Accept": "application/json;odata=verbose",
"Content-Type": "application/json;odata=verbose"
}
Body:
{
"__metadata": { "type": "SP.Field[TypeName]" },
[field-specific properties]
}
Ret:
POST _api/web/lists/getbytitle('ListName')/fields/getbytitle('FieldName')
Headers:
{
"Accept": "application/json;odata=verbose",
"Content-Type": "application/json;odata=verbose",
"X-HTTP-Method": "MERGE",
"IF-MATCH": "*"
}
Body:
{
"__metadata": { "type": "SP.Field" },
"Title": "Updated Display Name",
"Required": true
}
Slet:
POST _api/web/lists/getbytitle('ListName')/fields/getbytitle('FieldName')
Headers:
{
"Accept": "application/json;odata=verbose",
"X-HTTP-Method": "DELETE",
"IF-MATCH": "*"
}
Typer og FieldTypeKind#
SP.Field (Base type for all fields)
├── SP.FieldText (Single line of text)
├── SP.FieldMultiLineText (Multiple lines)
├── SP.FieldNumber (Number, Currency, Percentage)
├── SP.FieldDateTime (Date and Time)
├── SP.FieldChoice (Choice dropdown)
├── SP.FieldMultiChoice (Multi-select checkboxes)
├── SP.FieldLookup (Lookup to another list)
├── SP.FieldUser (Person or Group)
├── SP.FieldUrl (Hyperlink)
├── SP.FieldCalculated (Calculated field)
├── SP.FieldComputed (Computed - read only)
└── SP.FieldBoolean (Yes/No)
0 = Invalid
1 = Integer
2 = Text (single line)
3 = Note (multiple lines)
4 = DateTime
6 = Choice
7 = Lookup
8 = Boolean
9 = Number (decimal)
10 = Currency
11 = URL
12 = Computed
15 = MultiChoice
17 = Calculated
20 = User (Person/Group)
__metadata.type og FieldTypeKind skal passe sammen. Fælles egenskaber:
1{
2 "__metadata": { "type": "SP.FieldText" },
3 "Title": "Client Name",
4 "FieldTypeKind": 2,
5 "Required": false,
6 "EnforceUniqueValues": false,
7 "StaticName": "ClientName",
8 "Description": "Name of the client organization"
9}
Title er visningsnavnet, Required gør feltet obligatorisk, EnforceUniqueValues kræver unikke værdier (og et indeks), og Description er hjælpeteksten under feltet i formularen. StaticName er ikke det interne navn — se “Det der driller”.
Felttyper#
En linje tekst. MaxLength er højst 255, og det er også standarden.
1POST _api/web/lists/getbytitle('Projects')/fields
2
3{
4 "__metadata": { "type": "SP.FieldText" },
5 "FieldTypeKind": 2,
6 "Title": "Client Name",
7 "MaxLength": 255,
8 "Required": true,
9 "Description": "Enter the client organization name"
10}
Flere linjer tekst. NumberOfLines er højden i formularen, RichText slår formatering til, AllowHyperlink tillader links, og RestrictedMode begrænser, hvad der kan stå i feltet.
1{
2 "__metadata": { "type": "SP.FieldMultiLineText" },
3 "FieldTypeKind": 3,
4 "Title": "Project Description",
5 "NumberOfLines": 6,
6 "RichText": false,
7 "AllowHyperlink": true,
8 "Required": false
9}
Tal.
1{
2 "__metadata": { "type": "SP.FieldNumber" },
3 "FieldTypeKind": 9,
4 "Title": "Budget Amount",
5 "MinimumValue": 0,
6 "MaximumValue": 10000000,
7 "DisplayFormat": 0,
8 "Required": true
9}
MinimumValue og MaximumValue er grænserne. DisplayFormat styrer antallet af decimaler; hvilken værdi der giver hvad, er ikke efterprøvet.
Valuta. CurrencyLocaleId bestemmer valutaen:
1{
2 "__metadata": { "type": "SP.FieldCurrency" },
3 "FieldTypeKind": 10,
4 "Title": "Project Budget",
5 "CurrencyLocaleId": 1033,
6 "MinimumValue": 0,
7 "Required": true
8}
1030 = Danish (DKK)
1031 = German (EUR)
1033 = English US (USD)
1044 = Norwegian (NOK)
1053 = Swedish (SEK)
2057 = English UK (GBP)
Dato og tid. DisplayFormat 0 er kun dato, 1 er dato og tid. FriendlyDisplayFormat 1 viser “I går” og “I dag” i stedet for datoen. DateTimeCalendarType 1 er den gregorianske kalender.
1{
2 "__metadata": { "type": "SP.FieldDateTime" },
3 "FieldTypeKind": 4,
4 "Title": "Due Date",
5 "DisplayFormat": 0,
6 "DateTimeCalendarType": 1,
7 "FriendlyDisplayFormat": 0,
8 "Required": true
9}
Valg. EditFormat 0 er en rulleliste, 1 er radioknapper. FillInChoice tillader egne værdier.
1{
2 "__metadata": { "type": "SP.FieldChoice" },
3 "FieldTypeKind": 6,
4 "Title": "Project Status",
5 "Choices": {
6 "__metadata": { "type": "Collection(Edm.String)" },
7 "results": ["Planning", "In Progress", "On Hold", "Completed", "Cancelled"]
8 },
9 "EditFormat": 0,
10 "FillInChoice": false,
11 "DefaultValue": "Planning",
12 "Required": true
13}
Flere valg:
1{
2 "__metadata": { "type": "SP.FieldMultiChoice" },
3 "FieldTypeKind": 15,
4 "Title": "Project Features",
5 "Choices": {
6 "__metadata": { "type": "Collection(Edm.String)" },
7 "results": ["ECM", "Workflow", "Collaboration", "Analytics", "Mobile"]
8 },
9 "FillInChoice": false,
10 "Required": false
11}
Person eller gruppe. SelectionMode 0 er kun personer, 1 er personer og grupper. SelectionGroup begrænser valget til medlemmer af én gruppe (0 er alle).
1{
2 "__metadata": { "type": "SP.FieldUser" },
3 "FieldTypeKind": 20,
4 "Title": "Project Manager",
5 "SelectionMode": 0,
6 "SelectionGroup": 0,
7 "AllowMultipleValues": false,
8 "Required": true
9}
Opslag. LookupListId er id’et på listen, der slås op i, og LookupField er det felt, der vises.
1{
2 "__metadata": { "type": "SP.FieldLookup" },
3 "FieldTypeKind": 7,
4 "Title": "Related Project",
5 "LookupListId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
6 "LookupField": "Title",
7 "AllowMultipleValues": false,
8 "Required": false
9}
GET _api/web/lists/getbytitle('TargetList')?$select=Id
Listen, der slås op i, skal altså findes, før opslagsfeltet kan oprettes.
Hyperlink. DisplayFormat 0 er et link, 1 er et billede.
1{
2 "__metadata": { "type": "SP.FieldUrl" },
3 "FieldTypeKind": 11,
4 "Title": "Project Website",
5 "DisplayFormat": 0,
6 "Required": false
7}
Ja/nej. DefaultValue er "1" for ja og "0" for nej.
1{
2 "__metadata": { "type": "SP.Field" },
3 "FieldTypeKind": 8,
4 "Title": "Is Active",
5 "DefaultValue": "1",
6 "Required": false
7}
Beregnet. Anførselstegn i formlen escapes:
1{
2 "__metadata": { "type": "SP.FieldCalculated" },
3 "FieldTypeKind": 17,
4 "Title": "Days Until Due",
5 "Formula": "=DATEDIF(Today,[DueDate],\"D\")",
6 "OutputType": 1,
7 "Required": false
8}
Concatenate: ="[ClientName] - "&[ProjectName]
Date Difference: =DATEDIF([StartDate],[EndDate],"D")
Conditional: =IF([Budget]>100000,"Large","Small")
Eksemplet virker ikke, som det står. Today kan ikke bruges i et beregnet felt, og OutputType tager de samme tal som FieldTypeKind: 2 er tekst, 4 er dato, 8 er ja/nej, 9 er tal og 10 er valuta. 1 er heltal. Et tal-resultat skal altså være "OutputType": 9.
Med et bestemt internt navn#
createfieldasxml er vejen, når det interne navn skal være noget andet end visningsnavnet:
POST _api/web/lists/getbytitle('Projects')/fields/createfieldasxml
Body:
{
"parameters": {
"__metadata": { "type": "SP.XmlSchemaFieldCreationInformation" },
"SchemaXml": "<Field Type='Text' DisplayName='Kundenavn' Name='ClientName' StaticName='ClientName' />",
"Options": 8
}
}
Options: 8 (AddFieldInternalNameHint) får SharePoint til at bruge Name som internt navn. Det samme kald klarer beregnede felter med <Formula> inde i <Field>.
Fra Power Automate#
Flere kolonner fra en definition. En array-variabel med kolonnerne:
Name: varColumnDefinitions
Type: Array
Value:
[
{
"type": "SP.FieldText",
"typeKind": 2,
"title": "Client Name",
"required": true,
"maxLength": 255
},
{
"type": "SP.FieldChoice",
"typeKind": 6,
"title": "Status",
"choices": ["Planning", "Active", "Completed"],
"required": true
},
{
"type": "SP.FieldCurrency",
"typeKind": 10,
"title": "Budget",
"currencyLocaleId": 1030,
"required": false
}
]
Så en Apply to each over den, og i den en Switch på typen, der bygger body til Send an HTTP request to SharePoint:
Method: POST
Uri: _api/web/lists/getbytitle('Projects')/fields
Switch: items('Apply_to_each')?['type']
Case "SP.FieldText":
Body:
{
"__metadata": { "type": "@{items('Apply_to_each')?['type']}" },
"FieldTypeKind": @{items('Apply_to_each')?['typeKind']},
"Title": "@{items('Apply_to_each')?['title']}",
"MaxLength": @{items('Apply_to_each')?['maxLength']},
"Required": @{items('Apply_to_each')?['required']}
}
Case "SP.FieldChoice":
Body:
{
"__metadata": { "type": "SP.FieldChoice" },
"FieldTypeKind": 6,
"Title": "@{items('Apply_to_each')?['title']}",
"Choices": {
"__metadata": { "type": "Collection(Edm.String)" },
"results": @{items('Apply_to_each')?['choices']}
},
"Required": @{items('Apply_to_each')?['required']}
}
Valutafeltet i definitionen skal have sin egen case.
Gør et felt obligatorisk og giv det en beskrivelse:
Method: POST
Uri: _api/web/lists/getbytitle('Projects')/fields/getbytitle('Client Name')
Headers:
{
"Accept": "application/json;odata=verbose",
"Content-Type": "application/json;odata=verbose",
"X-HTTP-Method": "MERGE",
"IF-MATCH": "*"
}
Body:
{
"__metadata": { "type": "SP.Field" },
"Required": true,
"Description": "Enter the full legal name of the client organization"
}
Kopiér kolonnerne fra en skabelonliste. Hent de felter, der er lagt til af en bruger og er synlige, og opret dem på mållisten med den body, der passer til hver type:
Method: GET
Uri: _api/web/lists/getbytitle('TemplateList')/fields?$filter=CanBeDeleted eq true and Hidden eq false
Hvert felt har sin egen SchemaXml. Den kan sendes direkte til createfieldasxml på mållisten i stedet for at bygge body pr. type — bortset fra opslagsfelter, hvor List-attributten peger på skabelonlistens id og skal skiftes ud.
Visningsnavne på webstedets sprog. Sproget slås op, og titlen vælges derefter:
GET _api/web?$select=Language
Switch on Language:
Case 1030 (Danish):
Title: "Kundenavn"
Description: "Indtast kundens navn"
Case 1031 (German):
Title: "Kundenname"
Description: "Geben Sie den Kundennamen ein"
Case 1033 (English):
Title: "Client Name"
Description: "Enter the client name"
Valutaen kan følge med på samme måde:
1{
2 "__metadata": { "type": "SP.FieldCurrency" },
3 "Title": "Budget",
4 "CurrencyLocaleId": @{variables('varCurrencyLocaleId')}
5}
6
7var CurrencyLocaleId based on site:
8 Denmark site: 1030 (DKK)
9 Germany site: 1031 (EUR)
10 Sweden site: 1053 (SEK)
Fejl#
“A duplicate field name was found”. Der findes allerede et felt med det interne navn. Slå op først:
GET _api/web/lists/getbytitle('ListName')/fields?$filter=InternalName eq 'FieldName'
Typen kan ikke ændres. FieldTypeKind på et eksisterende felt kan ikke rettes via REST. Feltet skal slettes og oprettes igen, og data i det forsvinder.
“The formula contains a syntax error”. Formlen afprøves i brugerfladen først. Anførselstegn escapes (\"text\"), og felterne i formlen står med visningsnavn i klammer.
Feltet kan ikke slettes. Det er et systemfelt (Title, Created, Modified), eller det bruges af en indholdstype. CanBeDeleted siger hvilket:
GET _api/web/lists/getbytitle('ListName')/fields/getbytitle('FieldName')?$select=CanBeDeleted
Et felt fra en indholdstype fjernes fra indholdstypen først.
Det der driller#
- Det interne navn kommer fra
Titleved oprettelsen.StaticNamei body ændrer ikke på det. Oprettes “Client Name”, bliver det interne navnClient_x0020_Name, og det skifter ikke, når feltet omdøbes. EntencreatefieldasxmlmedName, eller opret medClientNamesom titel og ret titlen bagefter. - Opslag kræver rækkefølge. Listen, der slås op i, oprettes først, dens id hentes, og så kan opslagsfeltet oprettes.
- Et felt, der skal filtreres på i store lister, skal indekseres.
Indexed: truei body eller bagefter med MERGE. - Et oprettet felt kommer ikke i visningen af sig selv. Det lægges på listen, men ikke i standardvisningen.