venerdì 12 aprile 2013

Google Spreadsheet Conditional Formatting

Scopo di questo progetto è potenziare uno spreadsheet Google con funzionalità avanzate di formattazione condizionale.


L’idea è quella di aggiungere 4 nuove voci al menu.



con l’obbiettivo di ottenere il seguente risultato:


Realizzazione.

I metodi principali sono tre. Il primo si occupa di aggiungere le nuove voci ai menu.

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    { name : "Color Scale - Negative/Positive (Red/Green)", functionName : "FormatAsSemaphore" },
    { name : "Color Scale - Gradient (Red/Yellow/Green)", functionName : "FormatAsGradientRYG" },
    { name : "Color Scale - Gradient (Yellow/Green)", functionName : "FormatAsGradientYG" },
    { name : "Color Scale - Gradient (White/Green)", functionName : "FormatAsGradientWG" },
    null,
    { name : "About", functionName : "About" }
  ];
  sheet.addMenu("Conditional Formatting", entries);
};

Il secondo individua le celle soggette alla variazione del colore.
function FormatAsSemaphore()
{
  var sheet = SpreadsheetApp.getActiveSheet();
  var activeRange = sheet.getActiveRange();
  var numRows = activeRange.getNumRows();
  var numCols = activeRange.getNumColumns()
  var grid = new Array();
  Log("FormatAsSemaphore Rows:" + numRows + ", Cols:" + numCols);
  for (var r = 1; r <= numRows; r++)
  {
    var row = new Array();
    for (var c = 1; c <= numCols; c++)
      row[c-1] = Semaphore(activeRange.getCell(r,c).getValue());
  
    grid[r-1] = row;
  }
  activeRange.setBackgrounds(grid);
}

Il terzo calcola il colore da applicare partendo dal valore della cella.
function Semaphore(value)
{
  var color = "#00FF00";
  if (value < 0)
    color = "#FF0000";
  else if (!IsNumber(value))
    color = "";
  return color;
}
Qui lo spreadsheet con il sorgente . Una volta visualizzato effettuatene una copia.

mercoledì 6 febbraio 2013

Google: Compleanni dei Contatti


Compleanni dei contatti
Uno script per l’invio di una mail giornaliera che riassuma gli eventi del calendario dei contatti.

Tra i vari servizi che Google mette a disposizione, Google Calendar riveste una particolare importanza. La sua utilità è impagabile. Esiste a mio avviso una grossa pecca, l’impossibilità di settare una notifica agli eventi dei contatti.
Ad esempio, se nei nostri contatti abbiamo inserito anche le date di nascita troviamo l’evento relativo nel calendario dei contatti ma con facilità non è possibile inserire una notifica.

Ho pensato di prendere spunto da questa situazione per mettere alla prova l’utilizzo di Google Script.

Scopo di questo piccolo progetto è collezionare gli eventi della giornata e inviarli via mail.
In questa versione il lancio del progetto sarà manuale.

Partiamo

Prima di tutto apriamo Google Script Editor e impostiamo un nuovo progetto.

La prima cosa da fare è recuperare il calendario dei contatti. A tal scopo useremo una Classe Base tra quelle presenti nei Servizi di Calendar, la classe CalendarApp



var cal = CalendarApp.getCalendarById("#contacts@group.v.calendar.google.com");

Una volta ottenuto il calendario cerchiamo al suo interno tutti gli eventi relativi al giorno di nostro interesse ad esempio oggi.



var events = cal.getEventsForDay(today);

Costruiamo il subject da utilizzare nella mail. Approfittiamo del subject per dare una prima informazione su quanti eventi verranno elencati.


// Preparazione dell'oggetto dell'email
 var emailSubject = "Eventi dei Contatti: Oggi '" + today + "', ci sono " + events.length + " eventi nel calendario contatti.";
 

Cicliamo sulla collezione di eventi per estrarre evento per evento tutte le informazioni necessarie.


 // Preparazione del testo dell'email
 var emailText = "";
 for (var e in events)
 {
   var event = events[e];
   var eventStartTime = event.getStartTime();
   var eventEndTime = event.getEndTime();
   
   emailText += event.getTitle() + " Inizio: " +
eventStartTime.toLocaleString() + ", Fine: " + eventEndTime.toLocaleString();
 }

Ok, tutto è pronto per l’invio della mail. A questo scopo invochiamo la classe base MailApp.


 // Send email
 MailApp.sendEmail(Session.getActiveUser().getEmail(),emailSubject, emailText);

Lanciamo la funzione attraverso l’Editor e riceveremo una mail con le informazioni richieste.