System for møtereferat

Bilde av en innkallingJeg er leder i Vardåsen FAU og har nå utviklet et system for innkalling og referat i Google Drive. Dette tror jeg andre FAUer/organisasjoner kan ha nytte av og deler det derfor på bloggen.

Googles regneark og tekstbehandler er ikke like avansert som Microsofts Word og Excel. Jeg har bl.a. savnet muligheten til utskriftsfletting, dvs. at Word henter data fra lister i Excel, f.eks. adresser.

Samskriving i Google Drive

Dog er det så mange andre fordeler med Google Drive at jeg forsøkte å finne en løsning der. To av de viktigste fordelene er:

  • Jeg har tilgang til filene fra alle mine enheter og kan jobbe med filene via mobilen.
  • De andre i FAU har også tilgang til filene og vi kan jobbe med dem samtidig (samskriving).

2016-01-04Jeg testa ulike «mailmerging-scripts», men endte til slutt opp med å skrive min egen kode (makroer) inspirert litt herfra og derfra. Disse makroene er små programmeringssnutter som henter date fra regneark, formaterer disse og setter dem inn i et tekstdokument.

Kort fortalt blir arbeidsprosessen følgende:

  1. Leder skriver saksliste i regnearket saksliste. Evt. kan andre medlemmer legge til saker og setninger, da alle i FAU har tilgang til samme fil og det er fullt mulig å arbeide i samme fil samtidig.
  2. Leder åpner tekstdokumentet innkallingsmal og kjører tre makroer (klikker på tre punkter i en meny). Da lages innkallingen som et oversiktlig dokument som til slutt lagres som pdf.
  3. Under møtet noterer sekretæren rett inn i regnearket saksliste i kolonnene diskusjon og vedtak.
  4. Etter møtet åpner sekretæren eller lederen tekstdokumentet referatmal. Da lages referatet som et oversiktlig dokument som til slutt lagres som pdf.

Mellom møtene legger jeg og andre i FAU inn saker i dokumentet «Foreløpig saksliste». Når jeg skriver saksliste henter jeg saker derfra.

Eksempel

Nedenfor ligger eksempler på de ulike filene.

Saksliste i regneark


Oversikt over hvem som møtte

Innkallingen ser slik ut

obs! lenkene er tull

Referatet ser slik ut

 

Flere fordeler

Ved å legge alle saker i et regneark får vi flere fordeler:

  • Det er lett å se når en sak / et tema ble behandlet sist og hva som ble vedtatt da, ved å filtrere.
  • Man kan få en oppsummering f.eks. en gang i halvåret på hvilke saker man har behandlet.
  • Man slipper å skrive inn den samme informasjonen flere ganger.
  • Referatene blir fyldige slik at det er lett for vara o.a. å følge med på saksgangen.

Trenger du dette?

Er dette noe du og din organisasjon har bruk for? Jeg har kan sette det opp for dere. Ta kontakt på kom@altern.no

Koden

For de spesielt interesserte legger jeg ved koden på referatet her:

Opprette kopi

function slettTekst() {
// lag kopi av orginal  
  
  var doc = DocumentApp.getActiveDocument(); 
  id = doc.getId();
  var name = "innkallingsmal"  
  var file = DriveApp.getFileById(id) // finn id på fila
  var folder = DriveApp.getFolderById("0B3t2p114NZuhX1NYT1VBcmZPcTA"); // OBS! Endre ID på mappe her
  file.makeCopy (name, folder);
  var body = doc.getBody();
  body.setText(''); // sletter all tekst
}

Sette inn tekst og lagre pdf

function tekst() {
/**
'var' definerer innholdet av variabler
Skriptet har følgende funksjoner:
1. Spør etter møtenummer, definerer dette tallet som innholdet i variablen 'meet' og legger inn tittel + skifter navn
2. Sett inn tilstedeværende (gjelder kun REFERAT, ikke innkalling)
3. Henter opp riktig Regneark og for hver rad som stemmer med møtenummer settes tekst inn
4. Lagrer fila som et pdf-dokument (eget skript)

Se OBS!-merknader for ting som bør endres
**/
var idBok = ''; // OBS! endre ID her hvis ny regnebok  
// 1 Sette inn tittel og endre navn på dokumentet
  var ui = DocumentApp.getUi(); // Skriptet kjøres i et dokument.
  var result = ui.prompt( // boks kommer opp
      'Start referatet',
      'Skriv inn møtenummeret med tall, eks. 1:',
      ui.ButtonSet.OK_CANCEL);
  
  // Brukerens svar hentes inn
  var button = result.getSelectedButton();
  var meet = result.getResponseText();
  
  // Åpne regnearket (ikke fysisk, bare gi skriptet tilgang)
  var ss = SpreadsheetApp.openById(idBok); // OBS! endre ID her hvis nytt regneark
  var ark = ss.getSheetByName('hvem'); // velg hvilket ark som skal være aktivt
  ss.setActiveSheet(ark);
  
  var hvem = ark.getRange('a2').getValue(); // OBS! endre i regnearket hvis der brukes av andre enn Vardåsen FAU
  var year = ark.getRange('b2').getValue(); // OBS! endre i regnearket hvert år
  
  var body =  DocumentApp.getActiveDocument().getBody(); // linja må være med for å kunne sette inn tekst
  var tittel = body.appendParagraph(hvem + ', referat møte ' + meet + ' i ' + year);
      tittel.setHeading(DocumentApp.ParagraphHeading.TITLE);

  // Endre navn på dokumentet (lagre)
  var doc = DocumentApp.getActiveDocument();
  doc.setName('Referat_' + year + '-' + meet);
  
  
// 2  Sette inn hvem, hvor når
  var mdoc=DocumentApp.getActiveDocument();
  var ark = ss.getSheetByName('tilstede'); // velg hvilket ark som skal være aktivt
  ss.setActiveSheet(ark);
  
  var dato = ark.getRange('b1').getValue();
  var t1 = ark.getRange('c1').getValue();
  var t2 = ark.getRange('d1').getValue();
  var t3 = ark.getRange('e1').getValue();
  var t4 = ark.getRange('f1').getValue();
  var t5 = ark.getRange('g1').getValue();
  var t6 = ark.getRange('h1').getValue();
  var t7 = ark.getRange('i1').getValue();
  var adm = ark.getRange('j1').getValue();
  var kl = ark.getRange('k1').getValue();
  var hvor = ark.getRange('l1').getValue();
  // henter inn dataene i arket
  var numcols=ark.getDataRange().getNumColumns();
  var numrows=ark.getDataRange().getNumRows();
  var rows = ark.getDataRange();
  var values = rows.getValues();
  
  for (var i = 0; i <= numrows - 1; i++) { //for hver rad skal skriptet sjekke om møtenummeret valgt tidligere står i kollonne A (rad 0) Kunne vært bytta ut med en if-spørring, er bare én rad per møte
     var row = values[i];
    if (row[0] == meet) { 
      var body = DocumentApp.getActiveDocument().getBody();
      body.appendParagraph(dato + ':\t' + Utilities.formatDate(row[1], 'GMT+1', 'dd.MM.yyyy') + ' kl. ' + row[10]);
      body.appendParagraph(hvor + ':\t' + row[11]);
      var tilstede = body.appendParagraph('Tilstede: \r' 
                                          + t1 + ':\t' + row[2] + '\r' 
                                          + t2 + ':\t' + row[3] + '\r' 
                                          + t3 + ':\t' + row[4] + '\r' 
                                          + t4 + ':\t' + row[5] + '\r' 
                                          + t5 + ':\t' + row[6] + '\r' 
                                          + t6 + ':\t' + row[7] + '\r' 
                                          + t7 + ':\t' + row[8] + '\r'
                                          + adm + ':\t' + row[9] + '\r') ;
     } // if row
  } //for numrows 
    

// 3  Sette inn detaljer om hver sak
  var mdoc=DocumentApp.getActiveDocument();
  var ark = ss.getSheetByName('saksliste'); // velg hvilket ark som skal være aktivt
  ss.setActiveSheet(ark);

  var numcols=ark.getDataRange().getNumColumns();
  var numrows=ark.getDataRange().getNumRows();
  var rows = ark.getDataRange();
  var values = rows.getValues();
  
  var body = DocumentApp.getActiveDocument().getBody();

 // Definerer avsnittsstiler (disse får man dessverre ikke redigert i Google docs etterpå) 
 // De innebygde stilene overskrift 1, tittel osv. endres ikke i skriptet, men i maldokumentet
  
 var vedlegget = {};
 vedlegget[DocumentApp.Attribute.FONT_SIZE] = 10;
 vedlegget[DocumentApp.Attribute.BOLD] = false;
 vedlegget[DocumentApp.Attribute.ITALIC] = true;
 vedlegget[DocumentApp.Attribute.SPACING_AFTER] =7;
 vedlegget[DocumentApp.Attribute.LINE_SPACING]=1;
 vedlegget[DocumentApp.Attribute.FOREGROUND_COLOR] = '#007cb0';
  
  
 var introen = {};
 introen[DocumentApp.Attribute.FONT_SIZE] = 12;
 introen[DocumentApp.Attribute.ITALIC] = false; 
 introen[DocumentApp.Attribute.SPACING_AFTER] =7;
 introen[DocumentApp.Attribute.LINE_SPACING]=1;
 introen[DocumentApp.Attribute.FOREGROUND_COLOR] = '#000000';
  
 var diskusjonen = {};
 diskusjonen[DocumentApp.Attribute.FONT_SIZE] = 12;
 diskusjonen[DocumentApp.Attribute.ITALIC] = false;
 diskusjonen[DocumentApp.Attribute.SPACING_AFTER] =7;
 diskusjonen[DocumentApp.Attribute.LINE_SPACING]=1; 

 var vedtaket = {};
 vedtaket[DocumentApp.Attribute.FONT_SIZE] = 12;
 vedtaket[DocumentApp.Attribute.ITALIC] = true;
 vedtaket[DocumentApp.Attribute.FOREGROUND_COLOR] = '#c00000';
   
 //for hver rad skal skriptet sjekke om møtenummeret valgt tidligere står i kollonne A (rad 0)
 for (var i = 0; i <= numrows - 1; i++) {
   var row = values[i];
    if (row[1] == meet) { 
      //Hvis møtenummeret stemmer settes det inn tekstbolker
      var body = DocumentApp.getActiveDocument().getBody();
      var header = body.appendParagraph(row[0] + '/' + year + '-' + row[1] +' ' + row[3]);
      header.setHeading(DocumentApp.ParagraphHeading.HEADING1);
      if (row[2] !== ''){ //har saken tidligere saksnummer?
        var tidl = body.appendParagraph('Tidligere saksnr: ' + row[2]);
        tidl.setAttributes(vedlegget);
      }
      if (row[7] !== ''){ //har saken vedlegg?
        var vedlegg = body.appendParagraph(row[7]).setLinkUrl(row[8]);
        vedlegg.setAttributes(vedlegget);
      }
      var intro = body.appendParagraph(row[4]);
      intro.setAttributes(introen);
      var disku = body.appendParagraph(row[5]);
      disku.setAttributes(diskusjonen);
      if (row[6] !== ''){ //har saken et vedtak?
        var vedtak = body.appendParagraph('Vedtak: ' + row[6]);
        vedtak.setAttributes(vedtaket);
      }
    } // if row
  } //for numrows      
} // function

function lagre() {  
  // 4 Lagre pdf
  var idMappe = '';//OBS! Endre her hvis den skal lagres i en annen mappe
  var doc = DocumentApp.getActiveDocument();
  var folder = DriveApp.getFolderById(idMappe); 
  var name = doc.getName();
  var name = name + '.pdf';
 
  doc = DocumentApp.getActiveDocument();
  var ui = DocumentApp.getUi();
  docblob = DocumentApp.getActiveDocument().getAs('application/pdf');
    /* Add the PDF extension */
  docblob.setName(name);
  var file = folder.createFile(docblob); 
} // function
} // function

Lage menyen

function onOpen() {
  DocumentApp.getUi() // Or DocumentApp or FormApp.
      .createMenu('Makro')
      .addItem('Slett alt innhold', 'slettTekst')
      .addItem('Sett inn tekst', 'tekst')
  .addItem('Lagre som pdf', 'lagre')
      .addToUi();
}
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz