# Feltnøkler

De stabile navnene automatiseringer bruker for å adressere feltene dine — hvor de kommer fra, og hvordan holde dem stabile.

## Feltnøkler

En feltnøkkel er det utviklervendte navnet på ett felt i ett skjema — company_name, contacts. Det er slik en automatisering forhåndsutfyller et felt, låser det, eller leser svaret tilbake, og det overlever ny tittel og duplisering.

<h2 id="why">Hvorfor de finnes</h2>

<p>
  Uten feltnøkler må en automatisering adressere spørsmålene dine med interne ID-er som ikke betyr noe for noen — og en webhook-nyttelast
  kommer full av dem. Med feltnøkler leser begge sider samme språk:
</p>

```
{ "company_name": "Acme", "employees": 120, "contacts": [{ "name": "Ada" }] }
```

<p>
  Feltnøkler brukes to steder: <code>prefill</code>, <code>context</code>, og <code>readonly</code> når du oppretter en forespørsel; og{' '}
  <code>answers</code>- og <code>display</code>-kartene i hver callback og hver webhook-nyttelast.
</p>

<h2 id="where">Hvor du finner dem</h2>

<p>
  Hver nøkkel skjemaet publiserer, lever ett sted, <strong>Nøkler</strong>-tabellen: hvert felt, og under et valgspørsmål hvert alternativ,
  under en matrise hver rad og kolonne. Den avsluttes med en forhåndsvisning av <code>answers</code>-objektet callbacken din vil bære, med
  dine nøkler i seg.
</p>

<p>
  Hver hint-rad under et alternativ — den grå linjen under alternativet du redigerer — avsluttes med nøkkelen dets som en chip. Klikk på
  chippen for å redigere nøkkelen direkte, trykk Enter eller Escape når du er ferdig. En matrise viser chippen for raden eller kolonnen hvis
  etikett du redigerer. En chip blir gul når skjemaet er publisert og nøkkelen du skrev inn, ville flyttet den automatiseringer allerede
  bruker.
</p>

<p>
  Den samme tabellen vises skrivebeskyttet der du kobler til en integrasjon: under webhookens feltoppsett, og under forespørselutdragene i
  Del-vinduets Forespørsler-kort. Du kan også lese alle nøklene på én gang med <code>fields.list</code>.
</p>

<h2 id="derivation">Hvordan en nøkkel utledes</h2>

<p>
  Du trenger ikke sette noe selv. Til du redigerer den, utledes en nøkkel fra spørsmålets tittel: aksenter felles ut og bokstaver som ø, æ
  og ß blir til o, ae og ss, alt gjøres til små bokstaver, hver sammenhengende sekvens som ikke er en bokstav eller et siffer blir én enkelt
  understrek, ledende og etterfølgende understreker fjernes, og resultatet kuttes til 64 tegn.
</p>

<p>
  En tittel som bare er skrevet med et ikke-latinsk skriftsystem, for eksempel arabisk, hebraisk, kyrillisk, gresk, kinesisk eller japansk,
  har ingenting som kan felles ut. Nøkkelen er derfor <code>field_</code> pluss posisjonen, og nøkkelen til et alternativ er{' '}
  <code>option_</code> pluss posisjonen. Etter publisering er disse nøklene like stabile som alle andre, men de sier ingenting om
  spørsmålet. Når en automatisering leser svarene, bør du sette en lesbar nøkkel selv i Nøkler-tabellen.
</p>

<p>
  Hvis to felt ville endt opp med samme nøkkel, bryter Formstep uavgjort i dokumentrekkefølge ved å legge til <code>_2</code>,{' '}
  <code>_3</code>, og så videre. En nøkkel du setter selv vinner alltid sitt krav, og den utledede viker.
</p>

<h2 id="setting">Sette din egen nøkkel</h2>

<p>
  Skriv et navn i Feltnøkkel-feltet for å overstyre den utledede. Å tømme feltet går tilbake til den utledede nøkkelen. Tillatte tegn er
  bokstaver, sifre, <code>_</code>, <code>.</code> og <code>-</code>, opptil 64 tegn — alt annet avvises med{' '}
  <em>«Bruk bare bokstaver, tall og _ . - (maks 64 tegn).»</em> Mellomrom gjøres om til understrek mens du skriver, så «kontaktnavn» blir{' '}
  <code>kontaktnavn</code>.
</p>

<p>
  Nøkler skiller mellom store og små bokstaver og må være unike innenfor ett skjema. Å gjenbruke en nøkkel som allerede er tatt av et annet
  spørsmål, en gjentakende gruppe, et skjult felt eller et beregnet felt, avvises med{' '}
  <em>«Et annet felt bruker allerede denne nøkkelen.»</em>
</p>

<h2 id="freeze">Nøkler fryses ved første publisering</h2>

> ⚠️ **Å gi nytt navn til en publisert nøkkel ødelegger automatiseringer**
> <p>
>     På et publisert skjema advarer Feltnøkkel-feltet deg om at skjemaet er publisert og at automatiseringer som bruker den nåværende
>     nøkkelen, vil bryte sammen. Ingenting stopper deg, men hver arbeidsflyt som forhåndsutfyller eller leser den nøkkelen, slutter å treffe
>     i det øyeblikket du publiserer endringen. Oppdater automatiseringen i samme økt. Publisering{' '}
>     <a href="#removed-keys">advarer deg igjen</a> før endringen går live.
>   </p>

<p>
  Første gang du publiserer, skrives hvert felts nøkkel inn i den publiserte versjonen. Hver senere publisering fører de samme nøklene
  videre, som betyr:
</p>

<ul>
  <li>
    <strong>Ny tittel flytter aldri en nøkkel.</strong> Gi nytt navn fra «Company name» til «Legal entity name», og nøkkelen forblir{' '}
    <code>company_name</code>. Automatiseringene dine fortsetter å fungere; bare ordene på siden endres.
  </li>
  <li>
    <strong>Å endre et spørsmåls type flytter aldri en nøkkel.</strong> Å gjøre om et tekstspørsmål til en nedtrekksliste beholder nøkkelen
    — selv om verdiformen automatiseringen din må sende, endres med den.
  </li>
  <li>
    <strong>Å flytte et spørsmål flytter aldri nøkkelen dets.</strong> Posisjon betyr bare noe for det posisjonelle reservevalget på et felt
    uten brukbar tittel.
  </li>
  <li>
    <strong>Å duplisere en blokk gir kopien en ny nøkkel.</strong> En nøkkel du satte selv kopieres og gis ny nøkkel til neste ledige{' '}
    <code>_2</code>; utledede nøkler gjøres unike ved publisering.
  </li>
  <li>
    <strong>Skjemaer bygget før feltnøkler eksisterte</strong> får sine ved neste publisering.
  </li>
</ul>

<p>Publisering er også der nøkkelkollisjoner fanges opp, og begge stopper publiseringen i stedet for å stille gi et felt nytt navn:</p>

<ul>
  <li>
    To felt som krever samme nøkkel — <em>Field key "…" is used by more than one field.</em>
  </li>
  <li>
    En nøkkel du skrev inn på ett felt som et annet felt allerede har publisert —{' '}
    <em>
      Field key "…" is already published on "…". Giving it to "…" would rename that field's key to "…_2" and break automations using "…".
    </em>{' '}
    Frigjør nøkkelen på ett av de to feltene og publiser på nytt.
  </li>
</ul>

<p>
  Begge vises ved siden av Publiser-knappen sammen med alle andre funn fra klargjøringssjekken — se{' '}
  <a href="/no/building-forms/publish-checks">Publiseringssjekker</a>.
</p>

<h2 id="removed-keys">Når en publisert nøkkel er i ferd med å forsvinne</h2>

<p>
  En nøkkel tilhører feltet den ble publisert på, ikke tittelen dets. Så det finnes to måter å miste en nøkkel på uten å mene det: skrive
  inn en annen nøkkel på et publisert felt, eller <strong>slette et spørsmål og legge til et nytt i stedet</strong>. Det nye spørsmålet er
  et nytt felt — det får en fersk nøkkel utledet fra sin egen tittel, og den gamle nøkkelen er borte.
</p>

<p>
  Ingenting feiler på Formstep sin side når dette skjer. Webhooken utløses fortsatt og callbacken kommer fortsatt frem, bare uten det
  svaret, og <code>requests.create</code> begynner å avvise den gamle nøkkelen med <code>UNKNOWN_FIELD_KEY</code>. Så publisering sjekker
  for dette først. Når en nøkkel den live versjonen publiserer, ikke ville eksistert i den neste, viser publiseringsdialogen og
  problemindikatoren ved siden av Publiser-knappen en advarsel:
</p>

```
Feltnøkkelen "company_name" finnes ikke lenger etter denne publiseringen. Integrasjoner og forespørsler som bruker den, slutter å motta det svaret. Et nytt felt "Company" publiseres som "company". Sett feltnøkkelen til "company_name" for å holde dem i gang.
```

<ul>
  <li>
    <strong>For å holde automatiseringene dine i gang</strong>, åpne <strong>Nøkler</strong>-tabellen, finn feltet advarselen navngir, og
    skriv inn den gamle nøkkelen. Advarselen forsvinner og nøkkelen fortsetter som om ingenting hadde skjedd.
  </li>
  <li>
    <strong>Hvis du fjernet feltet med vilje</strong>, publiser likevel — det er en advarsel, ikke en feil — og oppdater automatiseringene
    som leser nøkkelen.
  </li>
  <li>
    Advarselen navngir et felt bare når valget er opplagt: feltet hvis nøkkel du skrev inn på nytt, eller det ene nye feltet som står der
    ett enkelt slettet felt sto. Ellers navngir den bare nøkkelen.
  </li>
  <li>
    Å slette en gjentakende gruppe gir en advarsel for gruppens nøkkel og for nøkkelen til hvert felt inni den. Publisering gjennom
    MCP-serverens <code>form_publish</code> returnerer de samme meldingene i <code>warnings</code>.
  </li>
  <li>
    Alternativ-, rad- og kolonnenøkler får samme behandling: slett et alternativ eller skriv om nøkkelen dets på et publisert skjema, og
    publisering advarer <em>Alternativnøkkelen "pro" for "Plan" finnes ikke lenger etter denne publiseringen</em>, og navngir nøkkelen
    alternativet publiseres som nå, når det fortsatt finnes. Publiseringsdialogen lister alle nøkkelendringer, på begge nivåer, under{' '}
    <strong>Nøkler som endres i denne publiseringen</strong>.
  </li>
</ul>

<h2 id="groups">Gjentakende grupper og skjulte felt</h2>

<p>
  En <a href="/no/building-forms/repeating-groups">gjentakende gruppe</a> har sin egen nøkkel, og det har hvert felt inni den også.
  Automatiseringer adresserer gruppen som helhet og nester medlemmene:
</p>

```
{ "contacts": [{ "name": "Ada", "email": "ada@acme.com" }, { "name": "Grace", "email": "grace@acme.com" }] }
```

<p>
  Et felt inni en gruppe er bare tilgjengelig gjennom gruppen sin — det finnes ingen <code>name</code> på toppnivå her, bare{' '}
  <code>contacts[0].name</code>. Gi nytt navn til gruppens nøkkel, og hele arrayen flytter med; gi nytt navn til ett medlems nøkkel, og bare
  det navnet inni hvert objekt endres.
</p>

<p>
  Et <a href="/no/building-forms/hidden-fields">skjult felts</a> parameternavn er feltnøkkelen dets. Det er nøkkelen du legger i{' '}
  <code>context</code> når du oppretter en forespørsel, og det samme navnet du ville brukt i en URL-parameter på en offentlig lenke.
</p>

<p>
  Et <a href="/no/building-forms/calculated-fields">beregnet felts</a> navn er feltnøkkelen dets, og det deler skjemaets ene sett med nøkler
  med alt annet. Det er skrivebeskyttet: skjemaet regner ut verdien selv, så du kan aldri sende inn ett — <code>fields.list</code> lister
  det med <code>calculated: true</code>, og <code>requests.create</code> avviser det i <code>prefill</code> og <code>context</code>. Du
  leser det derimot tilbake: det kommer i <code>answers</code> under navnet sitt (<code>answers.total</code>). Å gi nytt navn til et
  publisert beregnet felt gir nytt navn til nøkkelen dets, med samme publiseringsadvarsel som ethvert annet felt.
</p>

<h2 id="option-keys">Alternativnøkler: valgene inni et spørsmål</h2>

<p>
  Delene av et spørsmål som et svar navngir, får nøkler også. Hvert alternativ i et radio-, select-, checkbox-, bildevalg- eller
  rangeringsspørsmål, og hver rad og kolonne i en matrise, har en <strong>alternativnøkkel</strong>: utledet fra etiketten dets på samme
  måte som en feltnøkkel utledes fra en tittel, redigerbar, og fryst ved publisering. Så et svar leses som et navn på begge sider:
</p>

```
{ "plan": "pro", "interests": ["billing", "api"], "satisfaction": { "delivery_speed": "very_good" } }
```

<p>
  En arbeidsflyt forgrener seg på <code>answers.plan == "pro"</code> uansett hvilket språk respondenten svarte på, og en forespørsel
  forhåndsutfyller et valg med <code>{'{ "plan": "pro" }'}</code>. Nøklene listes av <code>fields.list</code> under hvert felts{' '}
  <code>options</code>, eller en matrises <code>rows</code> og <code>columns</code>, og redigeres i <a href="#where">Nøkler-tabellen</a>{' '}
  eller på alternativets chip. Hvert spørsmåls alternativer er sitt eget navnerom, så to spørsmål kan begge ha en <code>yes</code>, og en
  matrises rad og kolonne kan dele en nøkkel. To alternativer på ett spørsmål som ville utledet samme nøkkel, skilles med <code>_2</code>,
  som felt.
</p>

<p>
  <a href="/no/requests/decisions-and-approvals">Beslutningsspørsmålet</a> er en vanlig radioknapp hvis tre alternativer bærer nøklene{' '}
  <code>approve</code>, <code>decline</code> og <code>changes</code>; det er det som gjør en forespørsels <code>outcome</code> til et lukket
  sett.
</p>

<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Opprett en forespørsel](/no/requests/creating-requests) — Sett de nøklene i arbeid.
  - [Webhook-referanse](/no/developers/webhooks-reference) — Hvordan feltnøkler former hver hendelses-nyttelast.
</div>
