Effektive ledere ved, at tid er den begrænsende faktor... Intet andet adskiller måske effektive ledere så meget som deres kærlige omsorg for tiden.
Peter DruckerTid er vores mest værdifulde ressource. Vi ønsker at bruge det på de aktiviteter, der har størst effekt og mest værdi, vi kan, ikke kun fordi de normalt har den højeste pengeværdi, men også for hele tiden at udfordre os selv og maksimere vores arbejdsglæde.
Der er mange måder at forbedre din effektivitet og produktivitet for at udnytte din tid bedre. I en tidligere artikel om Google Sheets har jeg uddybet, hvordan styrken ved onlinesamarbejde er en sådan nøgle til øget produktivitet.
I en anden artikel demonstrerede jeg, hvordan programmeringssproget Python kan være et kraftfuldt analyse- og opgaveautomatiseringsværktøj for finansprofessionelle.
Med inspiration fra dette vil jeg nu præsentere en Google Apps Script-vejledning. Google Apps Script giver dig mulighed for at skrive scripts og programmer i JavaScript for at automatisere, forbinde og udvide produkterne i Googles G Suite, herunder Sheets, Docs, Slides, Gmail, Drev og flere andre. At lære det kræver en investering i tid, ligesom det at skrive manuskripter, men produktiviteten øges og yderligere muligheder, som det åbner op for, gør det det værd.
Lad os som et første skridt starte med at se på et velkendt koncept:makroer.
Hvis du har brugt betydelig tid på at arbejde med Excel, så er du sikkert kommet i kontakt med Excels VBA (Visual Basic for Applications) makrogrænseflade på et tidspunkt. Enten ved at optage eller skrive dem selv eller ved at piggybacke dem, der er skabt af andre.
Makroer er en fantastisk måde at automatisere gentagne og kedelige arbejdsgange. VBA er måske ikke et sprog, du dedikerede meget tid til at lære, men dets skønhed var, at du egentlig ikke behøvede det for at blive produktiv og oprette dine egne makroer. Du kan simpelthen registrere den arbejdsgang, du vil automatisere, og derefter gå ind i koden og foretage de små ændringer, der var nødvendige for at gøre makroen mere generel.
På nogle måder er VBA en fantastisk og glemt lektion for, hvordan man introducerer ikke-tekniske mennesker til kodning . Den måde, hvorpå du kunne optage handlinger og derefter få koden udfyldt til senere gennemgang, er faktisk en langt mere pragmatisk måde at lære på over at læse lærebøger og passivt se tutorials.
Den samme optagefunktionalitet som VBA er tilgængelig i Google Sheets. Her er et simpelt eksempel på, hvordan du bruger det:
Lad os starte med nogle eksempeldata ved at bruge en IMPORTHTML-forespørgsel til at importere en tabel. I dette eksempel har jeg downloadet en liste fra Wikipedia over de 15 største hedgefonde i verden. Det siger sig selv, men dette er et vilkårligt eksempel; hensigten er, at du skal fokusere mere på applikationen over emnet.
Makrooptagelsesprocessen igangsættes via følgende menusti:Værktøjer> Makroer> Optag makro.
Vi gennemgår derefter de handlinger (pc-format), som vi ønsker at optage:
Når du er færdig, skal du trykke på knappen Gem i makrovinduet nederst, give det et navn og en valgfri tastaturgenvej.
For enklere handlinger, der kan replikeres nøjagtigt gennem de samme trin, slutter processen her, og du kan begynde at bruge din makro med det samme. I dette tilfælde skal vi dog foretage nogle ændringer, før koden kan bruges. For eksempel skal det ark, vi kopierer til, have et andet navn hver gang. Lad os se, hvordan du gør dette.
Nu vil vi se knoglerne i Google Apps Script for første gang; programmeringsplatformen, der kører på Googles servere. Dette driver vores makroer og giver dig mulighed for at skabe meget komplekse arbejdsgange og endda tilføjelser til selve applikationerne. Det kan bruges til at automatisere ikke kun regnearksarbejde, men faktisk næsten alt, der er forbundet med Googles G Suite.
Programmeringssproget for Apps Script er JavaScript , et af de mest populære programmeringssprog, hvilket betyder, at der er et væld af ressourcer derude for alle, der ønsker at lære meget. Men ligesom med VBA behøver du det ikke:du kan bruge den samme Record-funktionalitet og blot udføre de trin, du ønsker at kunne gentage automatisk. Outputtet fra optagelsen kan se groft ud og vil højst sandsynligt ikke matche perfekt med det, du ønsker at få gjort, men det vil give et solidt nok udgangspunkt. Lad os nu gøre det til det script, vi lige har optaget.
Når du optager, er det fornuftigt at være forsigtig med ikke at optage yderligere trin ved et uheld, som du ikke ønsker at blive fanget i den endelige optagelse, men det er nogle gange svært at undgå:noget så simpelt som at vælge en anden celle, før du trykker på Stop Optageknappen vil blive fanget og efterfølgende gentaget hver gang du kører scriptet. Det første trin, når du redigerer vores script, ville være at rydde op i det og fjerne sådanne trin. Lad os dykke ned ved at gå til Værktøjer> Script editor i filmenuen.
Hvis du kender JavaScript, vil du genkende dette med det samme, og du kan også blive overrasket over at se søgeordet "var" i stedet for "let" eller "const", som du ville se i moderne JavaScript. Dette afspejler det faktum, at JavaScript-versionen i Apps Script er ret gammel og ikke understøtter mange af sprogets nyere funktioner. Mod slutningen vil jeg dog introducere en løsning for dem, der gerne vil bruge de nyeste sprogfunktioner.
Når du kører scriptet første gang, vil det bede om autorisation, hvilket giver mening, da scripts kan ændre (og potentielt slette) alle dine data. Du vil højst sandsynligt genkende godkendelsesprocessen fra andre Google-produkter.
Nu kan vi begynde at ændre koden. De ændringer, vi skal foretage, er mindre, men hvis du gør dette for første gang, kan det stadig kræve en hurtig søgning gennem Sheets Apps Script-dokumentationen og/eller et hurtigt opslag af et JavaScript-koncept, såsom at arbejde med datoer. Her kommer den kendsgerning, at JavaScript er så udbredt et sprog, godt med:En løsning på det problem, du står over for eller funktionalitet, kan normalt findes hurtigt, hvis du formulerer dit søgeord på en ligetil måde.
Ændringerne i denne version af scriptet fra den oprindelige optagede version er, at i stedet for det hårdkodede navn til det nye ark, som vi opretter, navngiver vi det nu med dagens dato i stedet for. Derudover ændrer vi også kopistien i slutningen for at henvise til dette nye ark. De sidste fire rækker viser også, hvordan man udfører nogle formateringshandlinger, såsom at ændre værdien af en celle, ændre størrelse på kolonner og skjule gitterlinjer.
function createSnapshot() {
var spreadsheet = SpreadsheetApp.getActive();
var date = new Date().toISOString().slice(0,10);
var destination = spreadsheet.insertSheet(date);
spreadsheet.getRange('HTML!A1:F1').activate();
spreadsheet.getSelection()
.getNextDataRange(SpreadsheetApp.Direction.DOWN)
.activate();
spreadsheet.getActiveRange()
.copyTo(SpreadsheetApp.setActiveSheet(destination)
.getRange(1,1),
SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
var sheet = spreadsheet.setActiveSheet(destination)
sheet.getRange("D1").setValue("AUM $bn")
sheet.setHiddenGridlines(true);
sheet.getRange("A1:D1").setFontWeight("bold");
sheet.autoResizeColumns(1, 4);
};
Hvis du kører scriptet nu, vil det vise, at det nye ark faktisk er navngivet med dagens dato og indeholder oplysningerne kopieret som værdier (ikke formler) fra hovedarket.
Diagramvisualiseringer kan nu tilføjes ved at bruge den samme registreringsproces. Jeg brugte dette til at lave tre simple diagrammer.
Oprydning af kode for hver vil se sådan ud:
function createColumnChart() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('C1:D16').activate();
var sheet = spreadsheet.getActiveSheet();
chart = sheet.newChart()
.asColumnChart()
.addRange(spreadsheet.getRange('B1:D16'))
.setMergeStrategy(Charts.ChartMergeStrategy.MERGE_COLUMNS)
.setTransposeRowsAndColumns(false)
.setNumHeaders(-1)
.setHiddenDimensionStrategy(Charts.ChartHiddenDimensionStrategy.IGNORE_BOTH)
.setOption('useFirstColumnAsDomain', true)
.setOption('curveType', 'none')
.setOption('domainAxis.direction', 1)
.setOption('isStacked', 'absolute')
.setOption('series.0.color', '#0b5394')
.setOption('series.0.labelInLegend', 'AUM $bn')
.setPosition(19, 6, 15, 5)
.build();
sheet.insertChart(chart);
};
Igen, bare rolig, hvis nogle af mulighederne ser forvirrende ud:alt dette er automatisk genereret, du skal bare forstå nok til at fjerne de unødvendige trin og måske lave små justeringer senere.
Alt begynder nu at tage form, men hvad nu hvis det faktiske output, vi ønsker, ikke er et regneark, men en præsentation? Hvis det er tilfældet, så er det meste af arbejdet herfra muligvis stadig manuelt, og vi har ikke sparet meget tid, hvis vi skal gøre dette på en tilbagevendende basis.
Lad os nu undersøge, hvordan det kan se ud at automatisere oprettelsen af en præsentation ved hjælp af eksempeldataene fra vores regneark.
Denne øvelse bliver nu mere avanceret af to grunde:
Dette næste eksempel er beregnet til at give nogle grundlæggende byggeklodser til at komme i gang og blive fortrolig.
Til at begynde med, lad os oprette en skabelon, som vi senere vil udfylde med indhold ved hjælp af vores script. Her er to simple præsentationsdias, som jeg har sammensat:
Dernæst skal du få ID'et for denne skabelon, fordi du bliver nødt til at henvise til den i dit script. Ubevidst vil du have set dette ID mange gange, fordi det i virkeligheden er den tilfældigt udseende sekvens af tegn og tal, som du ser i din browsers URL:
https://docs.google.com/presentation/p/this_is_your_presentation_ID /edit#slide=id.p.
Nu skal vi tilføje følgende linjer til vores originale script. Dette vil igen bede om godkendelse, denne gang for at få adgang til dit Google Drev.
function createPresentation() {
var templateId = "insert_your_template_presentation_id_here";
var template = DriveApp.getFileById(templateId);
var copy = template.makeCopy("Weekly report " + date).getId();
var presentation = SlidesApp.openById(copy);
}
Du vil ikke se nogen umiddelbar visuel feedback, hvis du kører dette kodestykke, men hvis du kigger i mappen på dit Google Drev, hvor du havde gemt skabelonen, vil du opdage, at der faktisk er blevet oprettet en kopi af den, og den har dagens dato i filnavnet. Vi er kommet godt fra start!
Lad os nu bruge flere byggeklodser til at begynde at fylde det med indhold, programmatisk i stedet for i hånden. Tilføj følgende rækker til den samme funktion:
presentation.getSlides()[0]
.getPageElements()[0]
.asShape()
.getText()
.setText("Weekly Report " + date);
Nu bliver tingene lidt mere interessante, da vi har ændret den første side til at inkludere dagens dato. I Slides, som i Sheets, arbejder du med objekter (repræsenteret af klasser), der hver især har egenskaber og metoder (dvs. tilknyttet funktionalitet). Disse er organiseret i et hierarki, hvor SpreadsheetsApp, DriveApp eller SlidesApp er objektet på øverste niveau. I kodestykket ovenfor skal vi bevæge os gennem dette hierarki trin-for-trin for at nå det element, vi vil redigere, i dette tilfælde:Teksten i en tekstboks. I praksis betyder det, at vi skal nå gennem præsentations-, dias-, PageElement- og Shape-objekter, indtil vi endelig kommer til det TextRange-objekt, som vi vil redigere.
Det kan være forvirrende at holde styr på, hvilken type objekt du har at gøre med, og de fejl, der opstår ved at forsøge at anvende en handling på det forkerte objekt, kan være svære at løse. Desværre giver hjælpefunktionaliteten og fejlmeddelelserne i selve Script Editoren ikke altid megen vejledning her, og det fine er, at en sådan opmærksomhed i det mindste vil forbedre din kvalitetskontrolpraksis.
Efter at have oprettet præsentationen og opdateret titlen, er det nu tid til at indsætte et af vores nye diagrammer i den. Med hierarkiet af objekter i tankerne, burde følgende kode nu give mening:
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName(date);
var chart = sheet.getCharts()[0];
var position = {left: 25, top: 75};
var size = {width: 480, height: 300};
presentation.getSlides()[1]
.insertSheetsChart(chart,
position.left,
position.top,
size.width,
size.height);
Hvis du kører hele scriptet, skulle outputpræsentationen se nogenlunde sådan ud:
Forhåbentlig illustrerer dette eksempel principperne og giver inspiration til at komme i gang med dine egne eksperimenter. Hvis du tænker over det, er jeg sikker på, at du i det mindste kan finde et par eksempler på manuelt arbejde udført i din virksomhed i dag, som virkelig burde automatiseres på denne måde. Tjener til at frigøre tid til at tænke, analysere og anvende dømmekraft i stedet for mekanisk at blande data fra et format og/eller sted til et andet.Forbedring af udviklingsoplevelsenSom tidligere nævnt er JavaScript-versionen, der understøttes i Google Apps Script, gammel og funktionaliteten af online Script Editor er meget begrænset. Hvis du bare optager en makro eller skriver et par dusin linjer, vil du ikke rigtig bemærke det. Hvis du imidlertid har ambitiøse planer om at automatisere alle aspekter af din ugentlige eller månedlige rapportering, eller ønsker at bygge plugins, så vil du være glad for at vide, at der er et kommandolinjeværktøj, der giver dig mulighed for at udvikle ved hjælp af dit foretrukne udviklingsmiljø .
Hvis du er på sådanne niveauer af færdigheder, så vil du sandsynligvis også drage fordel af de nyeste funktioner, som JavaScript har at tilbyde, og potentielt endnu mere, da du med kommandolinjeværktøjet også kan udvikle i TypeScript.
Hvis du opdager, at det ikke er din kop te at arbejde med Apps Script, så er der andre muligheder, afhængigt af brugssituationen. Hvis du ønsker at lave mere avanceret nummerknusning, oprette forbindelse til API'er eller databaser eller blot foretrækker Python-programmeringssproget frem for JavaScript, så er Googles Colaboratory et uvurderligt produkt. Det giver dig en Jupyter-notesbog, der kører på Googles servere, og som giver dig mulighed for at skrive Python-scripts, der integreres problemfrit med dine Google Drev-filer, og via 'gspread'-biblioteket gør det nemt at arbejde med dine regnearksdata.
Jeg skitserede mange af fordelene ved Python i en artikel om, hvordan man bruger det til økonomiske funktioner, som også fungerer som en skånsom introduktion til arbejdet med Python- og Jupyter-notesbøger i en forretningsmæssig og finansiel sammenhæng. En meget vigtig fordel for mig er, at i modsætning til Apps Script er Python-notebook'en i Colaboratory interaktiv, så du ser resultaterne (eller fejlmeddelelsen) efter at have udført hver linje eller lille kodeblok.
Denne Google Apps Script-vejledning viste et glimt af, hvad der er muligt gennem Googles kodningssprog. Mulighederne er stort set uendelige. Men hvis du ikke har en teknisk baggrund, kan kodeeksemplerne se skræmmende ud, og du tænker måske ved dig selv, at produktivitetsgevinsten ved at lære Google Apps Script måske ikke er tilstrækkelig nok til at opveje den betydelige investering i form af tid, der er nødvendig at lære det.
Dette afhænger selvfølgelig af mange faktorer, herunder hvilken type rolle du har eller forventer at få i fremtiden. Men selvom du ikke forventer at gøre noget, der ligner de eksempler, der er vist her, kan det at have en forståelse af, hvad der er muligt og nogenlunde hvor meget arbejde det vil kræve at implementere, sætte gang i tanker og ideer omkring, hvordan du kan forbedre produktiviteten i din virksomhed, f. dine kunder eller dig selv personligt.
Personligt kan jeg bekræfte tilfredsheden ved at læne mig tilbage og trykke på en knap, der fuldfører en times kedeligt manuelt arbejde på under et minut. Efter at have gjort dette for 50. gang vil du være taknemmelig for de par timer, du har brugt på at samle det hele i første omgang, hvilket i sidste ende har tjent til at frigøre din tid til mere værdiskabende aktiviteter. Efter et stykke tid bliver disse skalerbarhedsfordele vanedannende.