Skip to content

Alt om WordPress, webutvikling — og mer til

👌 Flervalg i Google Sheets: skript for celler med datavalidering

👌 Flervalg i Google Sheets: skript for celler med datavalidering

En nedtrekksliste i Google Regneark er en praktisk funksjon. Sett opp datavalidering, så godtar cellen bare verdier fra et område. Men det er en hake: du kan bare velge ett element. Hva om oppgaven din trenger en tagg urgent, budget, design, tre verdier i én celle? Med standardverktøy er det umulig.

I praksis dukker dette behovet opp hele tiden: kategorisering av utgifter, tagging av oppgaver, opplisting av deltakere. Å åpne redigeringsprogrammet hver gang og legge til verdier atskilt med komma er bortkastet tid. Løsningen er et lite Google Apps Script som legger til et sidepanel med avkrysningsbokser for ethvert datavalideringsområde.

Nedenfor finner du en trinnvis oppsettveiledning: fra å opprette scriptfilen til en ferdig «Scripts»-meny i regnearket ditt. Koden er testet på ekte regneark, fungerer uten ekstra tillatelser og krever ingen programmeringskunnskaper.

💡 Rask oversikt:

  • Sett opp datavalidering for en celle etter område og velg å vise en advarsel i stedet for å avvise inndata
  • Opprett to filer i scriptredigeringsprogrammet: multi-select.gs med logikk og dialog.html med sidepanelgrensesnittet
  • Lagre prosjektet, oppdater regnearket, så vises menyvalget Scripts
  • Velg en celle med datavalidering, kjør scriptet og kryss av for ønskede verdier med avkrysningsbokser
  • Klikk Velg, så fylles cellen med de valgte elementene atskilt med komma

Trinn 1: Klargjør regnearket og datavalidering

Åpne Google-regnearket du jobber med. Velg målcellen (eller området) og sett opp datavalidering: Data → Datavalidering. I feltet «Kriterier» velger du «Liste fra et område» og angir listen som alternativene skal hentes fra.

Viktig poeng: ikke slå på «Avvis inndata», for gjør du det, kan ikke scriptet skrive flere kommaatskilte verdier til cellen. Å vise en advarsel er tilstrekkelig.

Hvis du ikke har et klart område, oppretter du et eget «Referanse»-ark og lister opp alle tillatte verdier i en kolonne der. Referer til dette området i datavalideringen.

Trinn 2: Opprett Apps Script

I regnearkmenyen: Utvidelser → Apps Script. Redigeringsprogrammet åpnes med en ren fane og en tom fil. Først oppretter vi serverdelen.

Klikk Fil → Ny → Scriptfil. Gi den navnet multi-select.gs og lim inn koden:

1function onOpen(e) {
2 SpreadsheetApp.getUi()
3 .createMenu('Scripts')
4 .addItem('Multi-select for this cell...', 'showDialog')
5 .addToUi();
6}
7
8function showDialog() {
9 var html = HtmlService.createTemplateFromFile('dialog').evaluate();
10 SpreadsheetApp.getUi()
11 .showSidebar(html);
12}
13
14var valid = function() {
15 try {
16 return SpreadsheetApp.getActiveRange()
17 .getDataValidation()
18 .getCriteriaValues()[0]
19 .getValues();
20 } catch(e) {
21 return null;
22 }
23};
24
25function fillCell(e) {
26 var s = [];
27 for (var i in e) {
28 if (i.substr(0, 2) == 'ch') s.push(e[i]);
29 }
30 if (s.length) SpreadsheetApp.getActiveRange().setValue(s.join(', '));
31}

Det som skjer her: onOpen legger til «Multi-select for this cell…» i regnearkets egendefinerte meny. showDialog åpner sidepanelet med HTML-grensesnittet. Funksjonen valid henter ut listen over tillatte verdier fra den aktive cellens datavalidering. Og fillCell samler inn de avkryssede boksene og skriver dem til cellen atskilt med komma.

Merk: i.substr(0, 2) filtrerer bare de parameterne hvis navn starter med ch, dette er avkrysningsboksidentifikatorer fra HTML-skjemaet. Andre parametere ignoreres.

Klikk Fil → Lagre (eller Ctrl+S). Ved første lagring vil scriptet be om tillatelser, dette er normalt, uten dem kan det ikke lese celledata og vise sidepanelet.

Trinn 3: Legg til HTML-grensesnittet

Nå oppretter vi selve sidepanelet. I samme redigeringsprogram: Fil → Ny → HTML-fil. Gi den navnet dialog.html og lim inn:

1<div style="font-family: sans-serif;">
2 <? var data = valid(); ?>
3 <form id="form" name="form">
4 <? if (Object.prototype.toString.call(data) === '[object Array]') { ?>
5 <? for (var i = 0; i < data.length; i++) { ?>
6 <? for (var j = 0; j < data[i].length; j++) { ?>
7 <input type="checkbox"
8 id="ch<?= '' + i + j ?>"
9 name="ch<?= '' + i + j ?>"
10 value="<?= data[i][j] ?>">
11 <?= data[i][j] ?><br>
12 <? } ?>
13 <? } ?>
14 <? } else { ?>
15 <p>This cell has no
16 <a href="https://support.google.com/drive/answer/139705?hl=en">Data validation</a>.
17 </p>
18 <? } ?>
19 <input type="button" value="Select"
20 onclick="google.script.run.fillCell(this.parentNode)" />
21 <input type="button" value="Refresh validation"
22 onclick="google.script.run.showDialog()" />
23 </form>
24</div>

Logikken er enkel: taggen på serversiden <? var data = valid(); ?> kaller funksjonen valid() fra GS-filen og henter en matrise med tillatte verdier. Hvis et område er angitt, rendres avkrysningsbokser, én for hver verdi. Knappen Velg sender skjemaet til fillCell, knappen Oppdater validering leser datavalideringen på nytt (praktisk når du bytter mellom celler).

Hvis den valgte cellen ikke har datavalidering, viser panelet en melding med en lenke til Google-hjelp.

Lagre filen: Fil → Lagre. Begge filene (multi-select.gs og dialog.html) skal være i samme prosjekt.

Trinn 4: Kjør og bruk

Gå tilbake til regnearket og oppdater siden. Etter et par sekunder dukker et nytt Scripts-valg opp i menylinjen, dette er resultatet av onOpen.

Nå arbeidsflyten:

  • Velg en hvilken som helst celle som har datavalidering etter område konfigurert.
  • Gå til Scripts → Multi-select for this cell….
  • Et sidepanel åpnes til høyre med en liste over avkrysningsbokser, alle verdier fra valideringsområdet ditt.
  • Kryss av for ønskede elementer og klikk Velg.
  • Cellen fylles med de valgte verdiene atskilt med komma: urgent, budget, design.

Du trenger ikke lukke sidepanelet. Bare klikk en annen celle (også med datavalidering) og klikk Oppdater validering, så oppdateres avkrysningsbokslisten for den nye cellen.

Manussidefelt med avkrysningsbokser for valg av verdier

I skjermbildet ser du resultatet: en celle med datavalidering, et sidepanel med aktive avkrysningsbokser og Scripts-menyen i menylinjen. Dette er nøyaktig slik løsningen ser ut i praksis.

Trinn 5: Hva kan forbedres

Grunnscriptet løser oppgaven «velg flere verdier fra en nedtrekksliste», og for de fleste scenarioer er dette nok. Men hvis du jobber intensivt med regnearket, finnes det et par forbedringer:

  • Legg til «Velg alle» / «Opphev alle». To knapper i HTML-skjemaet som programmatisk krysser av eller opphever alle avkrysningsbokser. Et par linjer i JavaScript, så sparer du et dusin klikk på et stort område.
  • Erstatt komma med et annet skilletegn. I funksjonen fillCell setter linjen s.join(', ') sammen verdier med komma. Hvis dataene dine inneholder komma som del av verdien, bytt ut med ; eller |.
  • Automatisk oppdatering ved cellebytte. I stedet for å klikke «Oppdater validering» manuelt, kan du knytte en utløser til cellevalghendelsen (onSelectionChange), men dette krever litt mer kompleks kode og manuell installasjon av utløseren.

Scriptets kildekode er en tilpasning av Alexander Ivanovs løsning, publisert av Arthur Attwell på GitHub Gist. Du kan også finne diskusjon og forbedringer fra fellesskapet der.

Nedenfor finner du en videoopplæring på engelsk, hvis du foretrekker å se fremfor å lese:

⁉️🤔 Ofte stilte spørsmål

Scriptet vises ikke i menyen etter lagring. Hva bør jeg gjøre?

Oppdater regnearksiden (F5 eller Ctrl+R). Hvis det ikke hjelper, sjekk at funksjonen heter nøyaktig onOpen (store/små bokstaver har betydning), og at det ikke er noen feil i scriptredigeringsprogrammet: Vis → Logger vil vise stack trace. Noen ganger hjelper det å lukke scriptredigeringsprogrammet og åpne det på nytt.

Sidepanelet åpnes, men det er ingen avkrysningsbokser, bare en melding om datavalidering.

Dette betyr at den valgte cellen ikke har datavalidering etter område. Velg cellen du konfigurerte validering for i trinn 1. Hvis validering er konfigurert for et celleområde i stedet for én celle, sørg for at den aktive cellen er nøyaktig den som er i området.

Kan scriptet brukes på flere ark i ett regneark?

Ja. Scriptet er knyttet til beholderen (regnearket), ikke til et spesifikt ark. Datavalidering fungerer på arknivå, konfigurer det på de nødvendige arkene, så vil sidepanelet plukke opp verdier fra den aktive cellen uavhengig av ark.

Etter at verdier er valgt, viser cellen en feilmelding «Ugyldig verdi».

Du har slått på «Avvis inndata» i datavalideringsinnstillingene. Gå tilbake til Data → Datavalidering, velg «Vis advarsel» i stedet for «Avvis inndata». Hvis dataene er kritiske, la advarselen stå, den blokkerer ikke skriving fra scriptet.

Scriptet ber om tilgang til Google-kontoen, er dette trygt?

Ja. Tillatelser er nødvendige for SpreadsheetApp.getActiveRange() (lesing av celledata) og SpreadsheetApp.getUi() (visning av meny og sidepanel). Scriptet fungerer bare i ditt regneark og har ingen tilgang til andre filer på Drive. Den fullstendige listen over tillatelser er synlig i autorisasjonsvinduet.

Hvilket flervalgsscript du bør installere i regnearket ditt

Den beskrevne løsningen er et minimalt, fungerende rammeverk. To filer, ikke et eneste eksternt bibliotek, tydelig logikk. For utgiftssporing, oppgavetagging og alle scenarioer der du trenger å skrive flere verdier fra en referanseliste inn i én celle, er det mer enn nok.

Hvis du jobber mye med Google Regneark, kan du sjekke ut Apps Script-dokumentasjonen. Mulighetene går langt utover avkrysningsbokser: automatisk e-postutsendelse når en celle endres, generering av dokumenter fra maler, integrasjon med Google Kalender. Start med dette scriptet, og hvem vet, kanskje du skriver dine egne automatiseringer.