Regneark på jobbet
Hvad er GAS (Google Apps Script)?
Automatiser Google Sheets – en introduktion
Sætte en tabel op på samme måde hver uge. Slette tomme rækker fra indsatte data. Markere rækker, der opfylder en betingelse. Regneark er fulde af opgaver med faste trin.
Det er GAS (Google Apps Script), der klarer den slags opgaver automatisk. Denne artikel viser, hvad GAS kan, hvor du starter, og hvordan du kommer igennem de "godkendelses"-skærme, som mange sidder fast i første gang.
Hvad er GAS?
GAS er Googles måde at køre programmer på. Det bruger samme syntaks som JavaScript og styrer Google Sheets og også Gmail, Google Kalender, Google Drev og Google Formularer.
Du skal kun bruge en Google-konto. Det er gratis, og intet skal installeres: Åbn et regneark i browseren, og begynd at skrive. Programmet kører på Googles servere, ikke på din computer.
Optagede makroer og GAS
Google Sheets har "makroer", der optager det, du gør, så du kan gentage det så mange gange, du vil. Start optagelsen med "Udvidelser" → "Makroer" → "Optag makro", markér og skriv i celler, så gemmes dine handlinger som GAS-kode.
/** @OnlyCurrentDoc */
function myFunction() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('B2').activate();
spreadsheet.getCurrentCell().setValue('test');
spreadsheet.getActiveRangeList().setFontWeight('bold');
};En makro er altså GAS. Selvom du giver makroen et navn som "Fed-test", hedder funktionen i koden myFunction. Navnet i menuen og funktionsnavnet gemmes hver for sig.
Under optagelsen vælger du i feltet nederst "Brug absolutte referencer" eller "Brug relative referencer". Absolutte referencer gemmes som celleadresser som B2, så makroen altid skriver samme sted, uanset hvilken celle der er markeret. Relative referencer gemmes som "én række under den aktuelle celle" og tager udgangspunkt i den markerede celle.
Optagelse alene kan ikke håndtere tabeller, hvis længde ændrer sig, eller trin, der afhænger af betingelser. Derfra læser du den optagede kode og bygger videre på den.
Det kan du gøre med GAS
- Slette tomme rækker fra indsatte data og formatere overskrifterne
- Se på beløb eller datoer og skrive "Stor" eller "Forfalden" i en kolonne
- Tilføje en egen menu til regnearket og køre opgaver som med en knap
- Lave egne funktioner til brug i celler (brugerdefinerede funktioner)
- Sende mails med Gmail ud fra en tabel
- Køre en opgave på et fast tidspunkt, fx hver morgen kl. 8 (udløsere)
- Kopiere svar fra Google Formularer til et andet ark, når de kommer ind
I hånden tager hver af disse opgaver fra et par minutter til flere titals minutter. Skriv koden én gang, så er det nok med et klik i en menu – eller den kører helt af sig selv.
Sådan kommer du i gang med GAS
- Åbn regnearket, og vælg "Udvidelser" → "Apps Script"
- Editoren åbner i en ny fane: "Kode.gs" til venstre og
function myFunction() { }til højre - Skriv koden inden i
{ }, og gem (Ctrl+S, på Mac ⌘+S) - Klik på "▷ Kør" øverst. Resultatet vises nederst i "Udførelseslog"
function myFunction() {
const sheet = SpreadsheetApp.getActiveSheet();
const value = sheet.getRange('A1').getValue();
Logger.log(value);
sheet.getRange('B1').setValue('Kontrolleret');
}Logger.log skriver en værdi i udførelsesloggen. Tal vises med decimalpunktum, fx 120.0 (console.log viser 120). Hvis noget ikke virker som forventet, tjekker du først værdierne i loggen.
Godkendelsesskærmene ved første kørsel
Første gang du kører din kode, spørger en skærm, om scriptet må læse og redigere dit regneark. Mange sidder fast her, så vi gennemgår det trin for trin.
- "Godkendelse påkrævet" → Gennemgå tilladelser / OK
- Vælg en konto
- "Google har ikke bekræftet denne app" → "Avanceret" nederst til venstre
- "Gå til (projektnavn) (usikkert)"
- Tjek, hvad du giver tilladelse til, og klik på "Tillad" (er der punkter at vælge, så vælg dem, og klik på "Fortsæt")
"Google har ikke bekræftet denne app" er en advarsel for scripts, som Google ikke har gennemgået. Scripts, du selv har skrevet, og makroer, du har optaget, er ikke gennemgået, så denne skærm vises altid. Har du selv lavet det, kan du roligt fortsætte.
Vises skærmen derimod i et regneark, du har fået af en, du ikke kender, så vælg "Tilbage til sikkerhed". Når det er tilladt, kan scriptet bruge din konto til at arbejde med dine regneark og din mail.
Skriver du /** @OnlyCurrentDoc */ øverst i koden, må scriptet kun røre "dette regneark", og de tilladelser, der beder om, bliver snævrere. Optagede makroer har det fra starten.
Du kan gennemgå de samme trin i opgave 1 i øvelserne.
Almindelig kode
Her er det, du bruger oftest, når du arbejder med et regneark. Række- og kolonnenumre starter ved 1, mens indekserne i et array læst med getValues starter ved 0.
| Kode | Betydning |
|---|---|
| const sheet = SpreadsheetApp.getActiveSheet(); | Arket, der er åbent nu |
| sheet.getRange('A1').getValue() | Læs værdien i A1 |
| sheet.getRange('A1').setValue('Afsluttet') | Skriv i A1 |
| sheet.getRange(2, 3) | Række 2, kolonne 3 (C2). Kolonner kan angives som tal |
| sheet.getRange('A2:C10').getValues() | Læs et område på én gang (todimensionelt array) |
| sheet.getRange(2, 1, 9, 3).setValues(values) | Skriv på én gang (rækker og kolonner som i arrayet) |
| sheet.getLastRow() | Nummeret på den sidste række med en værdi |
| sheet.appendRow(['10/31', 'Sato', 5000]) | Tilføj en række under den sidste |
| sheet.deleteRow(5) | Slet række 5 (rækkerne nedenunder rykker op) |
| sheet.getRange('A1:D1').setFontWeight('bold') | Gør fed |
| sheet.getRange('A1:D1').setBackground('#fff2cc') | Angiv baggrundsfarve |
| Logger.log(value) | Skriv i udførelsesloggen (til at tjekke værdier) |
function judgeTargets() {
const sheet = SpreadsheetApp.getActiveSheet();
for (let row = 2; row <= sheet.getLastRow(); row++) {
const sales = sheet.getRange(row, 2).getValue();
const target = sheet.getRange(row, 3).getValue();
if (sales >= target) {
sheet.getRange(row, 4).setValue('Nået');
} else {
sheet.getRange(row, 4).setValue('Ikke nået');
}
}
}function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Månedsafslutning')
.addItem('Markér store salg', 'markLarge')
.addToUi();
}En funktion, der hedder onOpen, kører automatisk, når regnearket åbnes. Kører du den med "▷ Kør" i editoren, får du fejlen Cannot call SpreadsheetApp.getUi() from this context., så gem, og åbn regnearket igen for at tjekke.
Sende mails og køre efter tidsplan med udløsere
Det, folk oftest søger efter om GAS, er at sende mails og udløsere.
function sendReminders() {
const sheet = SpreadsheetApp.getActiveSheet();
const rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues();
rows.forEach(([name, email]) => {
MailApp.sendEmail(email, 'Påmindelse om frist', name + ',\n\nfristen er på fredag.');
});
}Der er en grænse: En gratis Google-konto kan sende op til 100 mails om dagen (Google Workspace-konti flere). Én kørsel må vare højst 6 minutter; derefter stopper den med "Exceeded maximum execution time".
For at køre efter tidsplan klikker du til venstre i editoren på "Udløsere" (urikonet) → "Tilføj udløser" og vælger funktionen og "Tidsstyret". Du kan angive et tidspunkt hver dag, uge eller måned.
Mails sendes rigtigt, også når du bare prøver. Test først med en tabel, der kun indeholder din egen adresse.
Forskelle fra VBA i Excel
| GAS | VBA i Excel | |
|---|---|---|
| Kode | JavaScript | VBA(Visual Basic) |
| Hvor det kører | Googles servere | Excel på din egen computer |
| Hvad du skal bruge | En browser og en Google-konto | Skrivebordsversionen af Excel (primært på Windows) |
| Forbinder til | Gmail, Kalender, Drev, Formularer | Word, Outlook, filer på computeren |
| Køre efter tidsplan | Med udløsere (kører, selv når computeren er slukket) | Kombineret med Opgavestyring i Windows eller lignende |
Idéerne er de samme i begge: læse celler, skrive, gentage og skelne efter betingelser. Kan du det ene, kan du læse det andet. Excel-makroer forklarer vi i introduktionen til makroer i Excel.
Øv i browseren
I sidens simulering af makroer og GAS øver du ved at køre rigtig kode i et virtuelt regneark og en Apps Script-editor. Du udfylder huller i koden, og på mobilen vælger du hvert hul blandt fire muligheder.
- Kapitel 1 Optage og køre makroer
Kør en optaget makro, og optag en selv. Absolutte og relative referencer, at læse og rette optaget kode.
- Kapitel 2 Læse, gentage, skelne
Læs celler med getValue, skriv med setValue, og tjek værdier i udførelsesloggen. Gå alle rækker igennem med for, og skeln med if.
- Kapitel 3 Case: rydde op i månedens salgstabel
Slet tomme rækker, markér store salg på én gang, og kør det fra en egen menu. Til sidst en egen funktion til celler.
Sådan lærer du GAS
En god start er at "Optage makro" i et af dine egne regneark og læse den kode, der kommer ud. Så er det lettere at se, hvad hver kommando gør.
Generativ AI kan også skrive kode. Men for at vurdere, om den er rigtig, og hvor den skal rettes, skal du kunne læse mindst den "almindelige kode" i denne artikel.
* Skærmnavne og grænser gælder pr. oktober 2026 og kan ændres, når Google opdaterer.
* Google Sheets er et varemærke tilhørende Google LLC. Dette websted har ingen forbindelse til Google.