# Lagerstyring i Google Sheets

> Sådan styrer du lager i Google Sheets med en bevægelsesjournal, formler, markering af lav beholdning, beskyttelse og historik, plus de grænser, du skal planlægge efter.

Source: https://www.lightinventory.com/da/vejledninger/lagerstyring-i-google-sheets · Last updated: 2026-10-28

Du kan styre et pålideligt lager i Google Sheets, hvis du aldrig skriver oven i en lagermængde. Registrér hver modtagelse, udlevering, regulering og overførsel som en ny række i en bevægelsesjournal, og lad formler beregne, hvad du har på lager. Det ene designvalg giver dig beholdning pr. placering, markering af lav beholdning og en historik, du kan læse, alt sammen med indbyggede funktioner.

Denne vejledning gennemgår arkets opbygning, formlerne, datavalidering, beskyttelse, historik og de grænser i Google Sheets, der betyder noget. Den slutter med et ærligt blik på, hvor Sheets alene ikke længere slår til.

## Opbyg regnearket

Brug ét regneark med tre faner. Hver fane har én opgave.

| Fane | Én række er | Du redigerer den, når |
|---|---|---|
| `Items` | Ét produkt eller én reservedel | Du tilføjer en vare eller ændrer dens oplysninger |
| `Locations` | Ét lager, rum, hylde eller én varevogn | Du tilføjer eller omdøber et sted |
| `Movements` | Én ændring i beholdningen | Noget kommer ind, går ud eller flyttes |

Fanenavne og værdier i `kode` er dem, formlerne nedenfor bruger. Omdøber du dem, skal formlerne også ændres.

### Items

| Kolonne | Overskrift | Eksempel | Bemærkninger |
|---|---|---|---|
| A | SKU | `BOLT-M8-40` | Entydigt og genbruges aldrig. Formatér kolonnen som almindelig tekst |
| B | Name | M8 × 40 mm sekskantbolt | |
| C | Unit | æske | Den enhed, alle bevægelser bruger |
| D | Reorder point | 20 | Når beholdningen når dette tal, skal du genbestille |
| E | On hand | *(formel)* | Skrives aldrig i hånden |
| F | Status | *(formel)* | `Reorder` eller `OK` |

### Locations

| Kolonne | Overskrift | Eksempel |
|---|---|---|
| A | Location | `WH1` |
| B | Name | Hovedlager |

### Movements: journalen

| Kolonne | Overskrift | Eksempel | Bemærkninger |
|---|---|---|---|
| A | Date | 2026-10-28 | En rigtig datoværdi, ikke tekst |
| B | SKU | `BOLT-M8-40` | Rullemenu fra `Items` |
| C | Location | `WH1` | Rullemenu fra `Locations` |
| D | Qty | `-5` | Positivt tal lægger til beholdningen, negativt trækker fra |
| E | Type | `Issue` | `Receive`, `Issue`, `Adjust` eller `Transfer` |
| F | Reference | PO-1042 | Indkøbsordre, opgave eller optællingsliste |
| G | Entered by | Sam | Hvem der registrerede den |
| H | Note | Beskadiget under transport | Hvorfor, når det ikke er indlysende |

En overførsel er to rækker: `-5` på afsenderplaceringen og `+5` på modtagerplaceringen, begge med typen `Transfer` og samme reference. En optælling, der finder 3 færre end forventet, er én `Adjust`-række med `-3`.

### Derfor er en journal, der kun tilføjes til, bedre end en mængdekolonne

Det mest almindelige lagerark har én kolonne med “Antal”, som folk skriver oven i. Det fungerer, indtil noget går galt, og så kan det ikke fortælle dig, hvad der skete.

- **Et overskrevet tal har ingen historie.** Hvis 40 bliver til 25, siger arket ikke, om 15 blev solgt, gik tabt eller blev talt forkert. En journalrække siger `-15`, `Issue`, `JOB-311` med en dato og et navn.
- **To personer kan ikke sikkert redigere det samme tal.** Hvis to personer hver tager 5 æsker og begge skriver 35 oven i 40, mister du en bevægelse. To tilføjede rækker med `-5` giver den rigtige sum.
- **Fejl rettes ved at tilføje, ikke ved at slette.** En forkert række rettes med en modsat række, så både fejlen og rettelsen forbliver synlige.
- **Beholdningen på en given dato er kun en formel væk.** Summér bevægelserne frem til den dato.
- **Beholdning pr. placering får du gratis.** De samme rækker giver totaler pr. vare, pr. placering eller begge dele.

Reglen for alle, der bruger arket, er enkel: tilføj rækker i `Movements`, og redigér eller slet aldrig gamle.

## Formler til lagerbeholdning

Alle formlerne nedenfor forudsætter faner og kolonner som ovenfor, med overskrifter i række 1.

> **Note:** Formlerne adskiller argumenter med kommaer. Hvis dit ark bruger landestandarden for et land med decimalkomma, fx Danmark, forventer Google Sheets semikolon: erstat kommaerne mellem argumenter (ikke i tekst i anførselstegn) med `;`.

### Beholdning pr. vare

I `Items!E2`, og fyld derefter ned:

```
=SUMIFS(Movements!$D:$D, Movements!$B:$B, $A2)
```

[SUMIFS](https://support.google.com/docs/answer/3238496?hl=da) lægger alle `Qty` i journalen sammen, hvor SKU'en svarer til varen i den række.

Hvis du i stedet vil fylde hele kolonnen med én formel, så sæt denne i `Items!E2`, og lad cellerne under den være tomme:

```
=ARRAYFORMULA(IF(A2:A="", "", SUMIF(Movements!B:B, A2:A, Movements!D:D)))
```

### Beholdning pr. vare og placering

For én vare på én placering, for eksempel den placering, der står i celle `H1` i `Items`:

```
=SUMIFS(Movements!$D:$D, Movements!$B:$B, $A2, Movements!$C:$C, $H$1)
```

Brug [QUERY](https://support.google.com/docs/answer/3093343?hl=da) til en komplet beholdningstabel på sin egen fane. Denne viser alle par af vare og placering, der har bevægelser:

```
=QUERY(Movements!A1:H, "select B, C, sum(D) where B is not null group by B, C label sum(D) 'On hand'", 1)
```

Denne gør placeringerne til kolonner med én række pr. vare:

```
=QUERY(Movements!A1:H, "select B, sum(D) where B is not null group by B pivot C", 1)
```

> **Note:** QUERY forventer én datatype pr. kolonne. Ifølge Googles dokumentation er det ved blandede typer i en kolonne “den datatype, der forekommer mest, der bestemmer kolonnens datatype”, og de øvrige værdier behandles som tomme. Hold SKU'er som almindelig tekst og datoer som rigtige datoer.

### Beholdning på en tidligere dato

Sådan ser du, hvad der var på lager ved udgangen af en bestemt dag, for eksempel datoen i `Items!H2`:

```
=SUMIFS(Movements!$D:$D, Movements!$B:$B, $A2, Movements!$A:$A, "<="&$H$2)
```

### Find negativ beholdning

En placering kan ikke rumme færre end nul. Denne viser alle par af vare og placering under nul, hvilket som regel betyder en manglende modtagelse eller en tastefejl:

```
=QUERY(QUERY(Movements!A1:H, "select B, C, sum(D) where B is not null group by B, C", 1), "select * where Col3 < 0", 1)
```

Den inderste QUERY beregner totalerne pr. placering; den yderste beholder kun de negative rækker. Et tomt resultat betyder, at ingen placering er under nul.

## Markering af lav beholdning og genbestillingspunkter

### En statuskolonne

I `Items!F2`, og fyld derefter ned:

```
=IF(D2="", "", IF(E2<=D2, "Reorder", "OK"))
```

Status er tom, når der ikke er angivet et genbestillingspunkt, så nye varer ikke giver falsk alarm.

### Fremhæv de rækker, der skal genbestilles

1. Markér `A2:F` på fanen `Items`.
2. Klik på **Formatér → Betinget formatering**.
3. Vælg **Tilpasset formel er** under **Formatér celler, hvis**.
4. Indtast `=AND($D2<>"", $E2<=$D2)`.
5. Vælg en fyldfarve, og klik på **Udfør**.

Dollartegnene holder kolonnerne faste, mens rækken skifter, så hele rækken skifter farve. Google skriver, at formler i betinget formatering [kun kan henvise til det samme ark](https://support.google.com/docs/answer/78413?hl=da), medmindre du bruger `INDIRECT`. Derfor står beholdningen og genbestillingspunktet ved siden af hinanden på fanen `Items`.

Du kan bruge samme funktion til at markere journalrækker, hvor fortegnet ikke passer til typen. Markér `A2:H` på `Movements`, og brug:

```
=OR(AND($E2="Receive", $D2<0), AND($E2="Issue", $D2>0))
```

### Grundlæggende om genbestillingspunkter

Et genbestillingspunkt besvarer ét spørgsmål: hvor lavt kan beholdningen komme, før du skal bestille, så den nye levering når frem, før du løber tør? Grundformlen er:

**Genbestillingspunkt = gennemsnitligt dagligt forbrug × leveringstid i dage + sikkerhedslager**

- **Gennemsnitligt dagligt forbrug** kommer fra din journal.
- **Leveringstid** er antallet af dage fra bestilling, til varerne står på hylden.
- **Sikkerhedslager** er bufferen til forsinkede leverancer eller travle uger.

Tilføj tre hjælpekolonner i `Items`: G “Avg daily use (30 days)”, H “Lead time (days)” og I “Safety stock”. I `G2`:

```
=-SUMIFS(Movements!$D:$D, Movements!$B:$B, $A2, Movements!$E:$E, "Issue", Movements!$A:$A, ">="&(TODAY()-30))/30
```

Minustegnet gør de negative `Issue`-mængder til et positivt forbrug. Angiv derefter genbestillingspunktet i `D2`:

```
=ROUNDUP(G2*H2 + I2, 0)
```

En vare med et forbrug på 4 æsker om dagen, 5 dages leveringstid og 10 æsker i sikkerhedslager har for eksempel et genbestillingspunkt på 4 × 5 + 10 = 30. Gennemgå leveringstider og sikkerhedslager, når leverandører eller sæsoner skifter; formlen er kun så god som de to input.

## Datavalidering og rullemenuer

Rullemenuer forhindrer de tastefejl, der ødelægger SUMIFS og QUERY: en SKU med et mellemrum til sidst eller en placering, der er stavet på to måder, matcher aldrig.

### Tilføj en rullemenu ud fra et område

1. Markér `B2:B` på `Movements`.
2. Klik på **Data → Datavalidering → Tilføj regel**.
3. Vælg **Rullemenu (ud fra et område)** under **Kriterier**, og indtast `Items!A2:A`.
4. Klik på **Udfør**.

Gentag for `C2:C` med `Locations!A2:A`. For `E2:E` skal du vælge **Rullemenu** og tilføje punkterne `Receive`, `Issue`, `Adjust` og `Transfer`. Google tilbyder også **Indsæt → Rullemenu** og en **Rullemenu**-mulighed, når du højreklikker; de åbner alle det samme [panel Regler for datavalidering](https://support.google.com/docs/answer/186103?hl=da).

### Afvis eller advar

Som standard afviser Google Sheets en indtastning, der ikke matcher listen. Hvis du i stedet vil tillade den med en advarsel, så åbn **Avancerede valgmuligheder**, og vælg **Vis en advarsel** under **Hvis dataene er ugyldige:**. Lad afvisningen være slået til i en lagerjournal: en bevægelse på en ukendt SKU er næsten altid en fejl.

Tilføj også en valideringsregel på `D2:D`, der kun accepterer tal, og på `A2:A`, der kun accepterer datoer. En mængde, der er indtastet som tekst, ignoreres af SUMIFS, så beholdningen forbliver forkert, uden at nogen opdager det.

## Beskyt områder, og del med omtanke

Tilladelser i Google Sheets har to lag, og begge har betydning.

1. **Deling** bestemmer, hvem der kan åbne filen, og om de er Læser, Kommentator eller Redaktør. Du angiver det med **Del**, og det gælder hele filen.
2. **Beskyttede ark og områder** indskrænker, hvad redaktører kan ændre i filen.

### Beskyt det, som ingen skal skrive i

1. Klik på **Data → Skrivebeskyt ark og områder**.
2. Klik på **Tilføj ark eller område**.
3. Vælg **Område**, og markér `Items!E2:F` (formelkolonnerne).
4. Klik på **Angiv tilladelser**.
5. Vælg **Begræns, hvem der kan redigere dette område**, vælg **Kun dig**, og klik på **Udfør**.

Beskyt hele fanen `Locations` på samme måde, hvis listen sjældent ændres. På `Movements` skal folk kunne tilføje rækker, så en streng beskyttelse passer ikke. Brug i stedet **Vis en advarsel, når dette område redigeres** på de eksisterende rækker; så bliver folk bedt om at bekræfte, før de ændrer historikken.

Vær klar over, hvad beskyttelse ikke gør. Google skriver, at beskyttelse [“ikke bør bruges som en sikkerhedsforanstaltning”](https://support.google.com/docs/answer/1218656?hl=da), og at “brugere kan udskrive, kopiere, indsætte samt importere og eksportere kopier af et beskyttet regneark”. Ejeren kan altid redigere et beskyttet område, og du kan ikke beskytte data med en adgangskode. Den trinvise vejledning står i [Beskyt et ark eller område](/da/hjaelp/google-sheets/beskyt-omraader).

### Del med den mest begrænsede rolle

- Giv **Læser** til personer, der kun skal slå beholdningen op.
- Giv kun **Redaktør** til personer, der registrerer bevægelser.
- Med Googles delingsindstillinger kan du forhindre redaktører i at dele filen, som beskrevet i [Del filer fra Google Drev](https://support.google.com/drive/answer/2494822?hl=da).

## Versionshistorik og cellernes redigeringshistorik

Google Sheets gemmer to slags historik: versioner af hele filen og redigeringshistorikken for en enkelt celle. [Du kan ikke se versionshistorikken](https://support.google.com/docs/answer/190843?hl=da) uden tilladelse til at redigere filen.

### Versionshistorik

Klik på **Seneste redigering** øverst til højre i regnearket for at se tidligere versioner. Vælg en version i panelet til højre for at se, hvem der ændrede hvad. Som standard skjuler Google Sheets uændrede rækker; klik på **Vis uændrede rækker** for at se det hele.

Du kan gendanne en version eller lave en kopi af den. Når du gendanner en version af et regneark, ryddes cellernes redigeringshistorik for ændringer foretaget før gendannelsen, så i en travl lagerfil er en kopi som regel det sikreste valg. Se [Gendan en tidligere version](/da/hjaelp/google-sheets/gendan-version).

Du kan navngive op til 15 versioner pr. regneark, og navngivne versioner flettes ikke. Giv en version et navn efter hver optælling, for eksempel “Optælling 2026-10-31”, så du altid kan vende tilbage til den.

### Cellernes redigeringshistorik

Højreklik på en celle, og vælg **Vis redigeringshistorik** for at se, hvem der ændrede cellen. Google nævner ændringer, der muligvis ikke vises der:

- tilføjede eller slettede rækker og kolonner;
- ændringer af celleformatet;
- ændringer foretaget, før en tidligere version blev gendannet;
- ændringer foretaget af formler.

Det sidste punkt har betydning i et formelstyret ark: `On hand`-cellerne ændres via formler, så deres redigeringshistorik forklarer ikke et nyt tal. Det gør journalrækkerne. Flere detaljer står i [Find ud af, hvem der ændrede en celle](/da/hjaelp/google-sheets/hvem-aendrede-en-celle).

### Notifikationer om redigeringer

Klik på **Værktøjer → Indstillinger for notifikationer → Rediger notifikationer** for at få en e-mail, når andre ændrer regnearket, enten med det samme eller som en daglig sammenfatning. Google skriver, at [du kun kan konfigurere notifikationer til dig selv](https://support.google.com/docs/answer/91588?hl=da).

## Grænser i Google Sheets, du skal planlægge efter

Det er de grænser, Google dokumenterer, kontrolleret den 28. oktober 2026. Den fulde liste, med hvad du gør tæt på hver grænse, står i [Grænser i Google Sheets for lagerstyring](/da/hjaelp/google-sheets/graenser).

| Grænse | Hvad Google dokumenterer |
|---|---|
| Celler pr. regneark | Op til 20 millioner celler eller 100 MB for regneark, der er oprettet i eller konverteret til Google Sheets ([filgrænser i Drev](https://support.google.com/drive/answer/37603?hl=da)). Google hævede den fra 10 millioner i september 2026 ([Workspace Updates](https://workspaceupdates.googleblog.com/2026/09/doubled-cell-limits-in-google-sheets-now-generally-available.html)) |
| Personer, der redigerer på samme tid | En Google-fil kan kun redigeres aktivt på op til 100 åbne faner eller enheder på samme tid ([delingsgrænser](https://support.google.com/drive/answer/2494822?hl=da)) |
| Deling | Op til 600 individuelle e-mailadresser pr. fil ([delingsgrænser](https://support.google.com/drive/answer/2494822?hl=da)) |
| Navngivne versioner | Op til 15 pr. regneark ([versionshistorik](https://support.google.com/docs/answer/190843?hl=da)) |
| IMPORTRANGE | Begrænset til 10 MB modtagne data pr. anmodning; søger efter opdateringer hver time, mens dokumentet er åbent ([IMPORTRANGE](https://support.google.com/docs/answer/3093340?hl=da)) |

En journal vokser med én række pr. bevægelse. Med 8 kolonner tilføjer 1.000 bevægelser om måneden 8.000 celler om måneden, hvilket er cirka 96.000 om året. De fleste små teams når aldrig cellegrænsen, men store filer bliver langsomme længe før. Arkivér afsluttede år i en separat fil, og overfør slutbeholdningen som én `Adjust`-række pr. vare og placering.

## Når Sheets alene ikke længere slår til

Opbygningen ovenfor fungerer godt for nogle få omhyggelige personer. Når teamet vokser, begynder disse huller at koste tid eller penge.

- **Samtidige redigeringer.** Google Sheets viser redigeringer live, men intet forhindrer to personer i at ændre den samme række, eller nogen i at sortere journalen, mens en anden skriver. Intet kontrollerer en ændring, før den slår igennem.
- **Ingen godkendelser.** Enhver redaktør kan registrere en regulering på 500 enheder eller ændre et genbestillingspunkt. Der er intet trin, hvor en anden person gennemgår det først.
- **Historik, der er svær at revidere.** Versionshistorikken er grupperet, og [revisioner kan lejlighedsvis blive flettet](https://support.google.com/docs/answer/190843?hl=da). Cellernes redigeringshistorik springer formelresultater, indsatte og slettede rækker og formatændringer over, og en gendannelse rydder den. Ejeren af en fil på en personlig Google-konto kan slette filens unavngivne versioner permanent. Intet beviser, at den historik, du ser, er komplet.
- **Utilsigtede overskrivninger.** Én indsættelse over det forkerte område eller en “fyld ned” for langt ændrer hundredvis af journalrækker på én gang. Versionshistorikken kan gendanne det, hvis nogen opdager det.
- **Tilladelser gælder hele filen.** En redaktør kan redigere alle faner og alle placeringer, medmindre du opbygger beskyttelser manuelt, og beskyttelse er ifølge Googles egen beskrivelse ikke en sikkerhedsforanstaltning. Du kan ikke sige “denne person registrerer kun bevægelser for nordlageret”.
- **Reglerne findes kun i folks hoveder.** “Redigér aldrig gamle rækker” og “angiv altid en reference” er konventioner. Arket håndhæver dem ikke.

Hvis det lyder bekendt, har du tre muligheder: acceptere risikoen, skifte til et separat lagersystem eller beholde arket og tilføje kontrol oven på det.

## Sådan tilføjer LightInventory kontrol til det samme ark

LightInventory er en lagerapp bygget oven på et Google Sheets-ark, som du ejer. Den er under udvikling og endnu ikke generelt tilgængelig. Den bruger samme journaldesign som denne vejledning, og appen håndhæver reglerne ovenfor i stedet for at overlade dem til konventioner.

- **Dine data bliver i dit ark.** Varer, placeringer, bevægelser og ændringsloggen er faner i dit eget regneark. Hvis du holder op med at bruge LightInventory, beholder du filen.
- **Hver ændring registreres.** Hver ændring skrives til en `Log`-fane med, hvem der foretog den, hvornår, værdien før og værdien efter. Fejl rettes med en modpost, aldrig ved at slette historik.
- **Manipulationssikker historik.** En hashkæde med nøgle over loggen, uden dine værdier, gemmes uden for din fil og forankres eksternt, så en loggrække, der i det stille er redigeret eller slettet, ikke består kontrollen. Se [revisionssporet](/da/funktioner/revisionsspor).
- **Godkendelser.** Du vælger, hvilke ændringer der kræver godkendelse, for eksempel prisændringer. Godkenderen kan ikke være den person, der anmodede om ændringen.
- **Roller.** Ejer, Administrator, Godkender, Redaktør og Læser, med valgfri afgrænsning til placeringer for Redaktører og Læsere. Teammedlemmer arbejder i appen og føjes ikke til filen, medmindre ejeren giver dem direkte redigeringsadgang.
- **Opdagelse af direkte ændringer.** Hvis nogen redigerer arket direkte, opdager LightInventory ændringen og håndterer den efter din politik: bloker den, indtil en ejer godtager eller gendanner den, log den automatisk, eller send den til godkendelse.

Der er en Free-plan til 1 bruger og 1 regneark. Team koster 2,99 € pr. bruger pr. måned ved månedlig betaling eller 2,49 € ved årlig betaling, ekskl. skat. Detaljerne står under [priser](/da/priser), og hvordan dine data og din adgang håndteres, står under [sikkerhed](/da/sikkerhed).
