Το προφίλ μας στο Google Plus
0

Συγχώνευση αλληλογραφίας στο Gmail

Η ιδέα της συγχώνευσης αλληλογραφίας είναι αρκετά δελεαστική, ιδιαίτερα όταν είναι δυνατό να συνδυάζεται με την ευκολία των υπηρεσιών webmail. Αποφασισμένοι να αξιοποιήσουμε στο έπακρο την cloud πλατφόρμα της Google, στήνουμε το δικό μας σύστημα συγχώνευσης αλληλογραφίας χρησιμοποιώντας αποκλειστικά και μόνο υπηρεσίες που παρέχει η εταιρεία. Δρόμος δεν υπάρχει, αλλά αυτό δεν σημαίνει πως δεν μπορούμε να τον δημιουργήσουμε.

Η διαχείριση του email έχει πλέον μεταφερθεί σχεδόν ολοκληρωτικά στο web, εν πολλοίς χάρη στις δωρεάν υπηρεσίες webmail των μεγάλων παικτών του χώρου. Η ευκολία ασφαλούς πρόσβασης στα emails απ’ οπουδήποτε, με τη βοήθεια ενός μόνο browser, είν’ ένα από τα πολλά πλεονεκτήματα αυτής της πλατφόρμας. Φυσικά, το cloud έχει και τους περιορισμούς του. Συχνά, υποχρεωνόμαστε να συμμορφωνόμαστε στους υποδεικνυόμενους τρόπους χρήσης κι από εκεί και πέρα δεν υπάρχουν πολλά που μπορούμε να κάνουμε.

Ή τουλάχιστον κάτι τέτοιο ισχύει σχεδόν πάντα.

Προσωποποιημένη μαζικότητα
Όλες οι σουίτες εφαρμογών γραφείου που σέβονται τον εαυτό τους, ενσωματώνουν λειτουργίες συγχώνευσης αλληλογραφίας. Πρόκειται για τη δημιουργία προσωποποιημένων emails που στέλνονται όμως μαζικά σε μια λίστα επαφών. Για κάθε επαφή αλλάζει μόνο ένα προκαθορισμένο πλήθος πεδίων στο email (π.χ., ένα πεδίο θα μπορούσε να είναι το όνομα, ένα άλλο ο χρόνος που απομένει για τη λήξη μιας συνδρομής κ.ο.κ.).

Αναλυτικότερα, στη συγχώνευση αλληλογραφίας δημιουργούμε ένα έγγραφο, εντός του οποίου ορίζουμε κάποια μεταβλητά πεδία. Στη συνέχεια, δημιουργούμε μια λίστα με τους παραλήπτες της αλληλογραφίας, και δίπλα στον καθένα ή στην καθεμία αντιστοιχίζουμε τις προσωποποιημένες τιμές των πεδίων. Στη συνέχεια, η εφαρμογή συγχώνευσης αναλαμβάνει να συνδυάσει όλα αυτά και να στείλει σε κάθε παραλήπτη το προσωποποιημένο του όνομα.

Συγχώνευση αλληλογραφίας στο cloud
Κάτι που λείπει από το Gmail είναι μια κάποια λειτουργία για συγχώνευση αλληλογραφίας. Αυτή την παράλειψη μπορούμε να τη δούμε ως ένα από τα γεγονότα της ζωής που αναγκαστικά αποδεχόμαστε. Εναλλακτικά, μπορούμε να στρωθούμε στη δουλειά και να επινοήσουμε και να υλοποιήσουμε μια λύση, η οποία με κάποιο τρόπο θα φέρνει τη συγχώνευση αλληλογραφίας στο Gmail.

Είναι νομίζουμε περισσότερο από προφανές ότι δεν υπήρχε ούτε μία στο εκατομμύριο να τηρήσουμε την πρώτη, μάλλον μοιρολατρική, στάση.

Αντίθετα, θα καταφύγουμε στη Google Script, μια σκριπτογλώσσα που ελεύθερα παρέχει η εταιρεία, καθώς και στην υπηρεσία του Google Drive, προκειμένου να φέρουμε τη συγχώνευση αλληλογραφίας με το ζόρι στο Gmail.

Ουσιαστικά, η Google Script είναι η γλώσσα Javascript μαζί με αντικείμενα του API που έχει δημιουργήσει η Google για την πρόσβαση στις διάφορες υπηρεσίες της. Θα μπορούσαμε να την παραλληλίσουμε με την (παλαιολιθική) VBA, στο Office της Microsoft. Εκτός από τη Google Script, στη φαρέτρα μας θα μπει και το Google Sheets, η online εφαρμογή υπολογιστικών φύλλων της Google. Σε φύλλο εργασίας του Google Sheet θα φιλοξενούνται όλα τα δεδομένα που θα αφορούν στο email μας, το κείμενο και οι λίστες των πεδίων.

Ώρα για δράση
Συνδεόμαστε αρχικά στο Google account μας και μπαίνουμε στο Google Drive. Από εκεί δημιουργούμε ένα νέο υπολογιστικό φύλλο, πατώντας το κουμπί “Νέο” κι επιλέγοντας, φυσικά, “Υπολογιστικά φύλλα Google”.

Η δημιουργία ενός νέου φύλλου εργασίας γίνεται από τη σχετική επιλογή της λίστας, που εμφανίζεται πατώντας το κουμπί 'Νέο' στο Google Drive.

Η δημιουργία ενός νέου φύλλου εργασίας γίνεται από τη σχετική επιλογή της λίστας, που εμφανίζεται πατώντας το κουμπί “Νέο” στο Google Drive.

Στο νέο βιβλίο εργασίας, στο οποίο δίνουμε το πρωτότυπο όνομα deltaMerge, θα στήσουμε όλον το μηχανισμό της συγχώνευσης. Η άντληση των δεδομένων θα γίνεται από το πρώτο φύλλο. Στα κελιά Α1 κι Α2 γράφουμε “Θέμα” και “Κείμενο”. Όπως καταλαβαίνετε, στα διπλανά απ’ αυτά τα κελιά θα συμπληρώσουμε το θέμα και το κείμενο του μηνύματος που θέλουμε να στείλουμε. Στο κελί Α3 βάζουμε τον τίτλο “Μεταβλητές” και στο διπλανό του τοποθετούμε τη συνάρτηση “=COUNTA(4:4)”. Η συγκεκριμένη συνάρτηση επιστρέφει το πλήθος των μη κενών κελιών του οριζόμενου εύρους. Στην προκειμένη περίπτωση, μετράει τα μη κενά κελιά της γραμμής 4, τα οποία παρεμπιπτόντως αντιστοιχούν στους τίτλους των μεταβλητών των πεδίων που θέλουμε να συγχωνεύσουμε μέσα στο κείμενό μας. Για να είναι αναγνωρίσιμοι οι τίτλοι των πεδίων μέσα στο σώμα το μηνύματος, θα πρέπει να τοποθετηθούν μέσα σ’ αυτό στη μορφή ${“τίτλος”}.

Κώδικας πίσω απ’ όλα
Μέχρι στιγμής όλα δείχνουν καλά και μάλλον όπως τα ξέρουμε. Έχουμε αποθέσει τα δεδομένα μας, έχουμε κάνει κάποιες συμβάσεις του στυλ πού θα βάλουμε τι και τι σημασία έχει το καθετί στο φύλλο μας, όμως πώς θα λειτουργήσει η συγχώνευση; Πού είναι ο κώδικας, ο οποίος θα θέσει σε λειτουργία τη μηχανή μας; Όπως θα αντιλαμβάνεστε, ο κώδικας δεν είναι πουθενά και πρέπει να τον γράψουμε οι ίδιοι. Πού θα πρέπει να το γράψουμε, όμως;

Αν δοκιμάσουμε να πάμε στο μενού “Εργαλεία” –> “Πρόγραμμα επεξεργασίας σεναρίων”, παρατηρούμε ότι ανοίγει μια νέα καρτέλα στον web browser κι εμφανίζεται ο λεγόμενος Script Editor.

Η πρόσβαση στον Script Editor είναι δυνατή από τη σχετική επιλογή του μενού 'Εργαλεία'.

Η πρόσβαση στον Script Editor είναι δυνατή από τη σχετική επιλογή του μενού “Εργαλεία”.

Στο πλαίσιο κειμένου που δεσπόζει στην επιφάνειά του, μπορούμε να εισάγουμε τον κώδικα. Τον παραθέτουμε εδώ:

function onOpen() {
  SpreadsheetApp.getUi()
      .createMenu('Συγχώνευση email')
      .addItem('Αποστολή', 'send')
      .addToUi();
}

function send(){
  var spread = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spread.getSheets()[0];
  var numVars = sheet.getRange("B3").getValue();
  var range = sheet.getRange(5, 1, sheet.getMaxRows() - 1, numVars);
  var subject = sheet.getRange("B1").getValue();
  var body = sheet.getRange("B2").getValue();

  records = getRows(sheet, range);
  for (var i = 0; i < records.length; ++i) {
    var row = records[i];
    var mergedBody = mergeBody(body, row);
    MailApp.sendEmail(row.["email"], subject, mergedBody);
  }
  Browser.msgBox("Η αποστολή " + records.length + " μηνυμάτων ολοκληρώθηκε!") ;
}

function getRows(sheet, range){
  varsRowIndex = range.getRowIndex() - 1;
  var numColumns = range.getEndColumn() - range.getColumn() + 1;
  var varsRange = sheet.getRange(varsRowIndex, range.getColumn(), 1, numColumns);
  var vars = varsRange.getValues()[0];
  var records = getRecords(range.getValues(), vars);
  return records ;
}

function getRecords(data, keys){
  var records = [];
  for(var i = 0; i < data.length; ++i){
    var record = {};
    var isEmpty = true;
    for(var j = 0; j < data[i].length; ++j){
      var cellData = data[i][j];
      if(cellData == ""){
        continue;
      }
      record[keys[j]] = cellData;
      isEmpty = false;
    }
    if(!isEmpty){
      records.push(record);
    }
  }
  return records;
}

function mergeBody(body, data) {
  var mergedBody = body;
  var vars = mergedBody.match(/\$\{\"[^\"]+\"\}/g);

  for (var i = 0; i < vars.length; ++i) {
    var varName = vars[i].substring(3,(vars[i].length-2));
    var varData = data[varName];
    mergedBody = mergedBody.replace(vars[i], varData || "");
  }

  return mergedBody;
}

Σημείωση. Τον κώδικα μπορείτε να τον κατεβάσετε από το https://bit.ly/dh054deltamerge.

Η συνάρτηση onOpen καλείται όταν ανοίγει το έγγραφο με την εφαρμογή Google Sheets και προσθέτει στο ήδη υπάρχον μενού ένα δικό μας, με τίτλο “Συγχώνευση email”. Από κάτω προσθέτει και το στοιχείο “Αποστολή”, το οποίο όταν επιλέγεται από τον χρήστη καλεί τη συνάρτηση send.

Η send, τώρα, όπως καταλαβαίνετε κι από το όνομά της, αποτελεί τη βασική συνάρτηση του σεναρίου μας, η οποία εκτελεί τη συγχώνευση και την αποστολή των emails. Η send συνεπικουρείται από τις συναρτήσεις getRows, getRecords και mergeBody. Ας δούμε όμως τα πράγματα με τη σειρά.

Αρχικά στη send, στις γραμμές από 09 έως 14, αρχικοποιούμε μια σειρά από μεταβλητές. Συγκεκριμένα στην 09 αναθέτουμε στη μεταβλητή spread το τρέχον βιβλίο εργασίας, το οποίο παίρνουμε καλώντας τη συνάρτηση getActiveSpreadsheet() του αντικειμένου SpreadsheetApp. Πρόκειται για μια μέθοδο ενός αντικειμένου από το Google API. Αντίστοιχα στη συνέχεια, με την κλήση της getSheets() κι επιλέγοντας το πρώτο στοιχείο του επιστρεφόμενου πίνακα αντικειμένων, αναθέτουμε στη μεταβλητή sheet το πρώτο φύλλο του βιβλίου εργασίας μας. Την αμέσως επόμενη γραμμή, με τη βοήθεια της getRange στην οποία μπορούμε να ορίσουμε το όνομα ενός κελιού, παίρνουμε το αντικείμενο που το αντιπροσωπεύει. Κι όπως βλέπετε στην ίδια γραμμή, καλώντας τη getValue αυτού, μας επιστρέφεται η τιμή του. Στη getRange, χάρη στην έννοια του πολυμορφισμού του αντικειμενοστραφούς προγραμματισμού, αν αντί για ένα κελί ορίσουμε τις συντεταγμένες που περικλείουν ένα εύρος κελιών, και συγκεκριμένα τη θέση του αριστερότερου άνω και του δεξιότερου κάτω κελιού, μας επιστρέφεται ένα αντικείμενο που αντιπροσωπεύει όχι ένα μεμονωμένο κελί, αλλά ολόκληρο το εύρος που περικλείεται στις συντεταγμένες που καθορίσαμε. Αυτές ξεκινούν από το σημείο που αρχίζουν τα δεδομένα των πεδίων μας (δηλαδή από τη γραμμή 5) κι εκτείνονται αριστερά μέχρι εκεί που τελειώνουν οι μεταβλητές που ορίσαμε. Προσέξτε ότι για να βρούμε το τελευταίο κελί του φύλλου μας καλούμε τη getMaxRows, η οποία επιστρέφει το μέγιστο πλήθος των κελιών που έχει το φύλλο εργασίας μας.

Πολύ λογικά θ’ αναρωτιέστε για το πώς γνωρίζουμε αυτές τις συναρτήσεις. Τέτοιες μέρες που είχαμε δεν μας ήλθε κάποια επιφοίτηση. Απλά συμβουλευθήκαμε το εγχειρίδιο που προσφέρει η Google για το Apps Scripting. Σ’ αυτό σας παραπέμπουμε αν θέλετε να μελετήσετε όλες τις λεπτομέρειες των συναρτήσεων που υπάρχουν στον κώδικα του script μας.

Συνεχίζουμε λοιπόν με τις γραμμές 13 και 14, στις οποίες παίρνουμε το θέμα και το κείμενο του μηνύματός μας, όπως τα ορίσαμε στα αντίστοιχα κελιά. Στη γραμμή 16 καλούμε τη δική μας συνάρτηση getRows, στην οποία περνάμε το αντικείμενο του τρέχοντος φύλλου εργασίας και του επιλεγμένου εύρους. Μέσα σε αυτήν, δημιουργούμε τη μεταβλητή vars στην οποία περνάμε σε έναν πίνακα τα ονόματα των πεδίων μας. Πώς τα βρίσκουμε; Μα φυσικά, βάσει των συντεταγμένων του range των δεδομένων μας. Προς το τέλος της getRows γίνεται η κλήση της getRecords, στην οποία περνάμε έναν πολυδιάστατο πίνακα με τις τιμές του εύρους των δεδομένων μας και τον πίνακα με τους τίτλους των πεδίων.

Η συνάρτηση getRecords διατρέχει όλον τον πίνακα των τιμών, σε μήκος και σε πλάτος, και δημιουργεί ένα νέο διδιάστατο πίνακα με όλες τις μη κενές γραμμές του εύρους, κι ορίζοντας ως κλειδιά των στοιχείων κάθε γραμμής τους τίτλους των πεδίων μας. Η συνάρτηση getRecords στο τέλος της επιστρέφει τον πίνακα αυτόν, ο οποίος μάλιστα αποτελεί και την επιστρεφόμενη τιμή της getRows.

Πίσω στη send τώρα, ξεκινάμε ένα βρόχο που διατρέχει μία προς μία τις γραμμές του πίνακα των δεδομένων μας. Κάθε γραμμή του πίνακα περνάει στη μεταβλητή row. Να θυμίσουμε ότι έτσι όπως δομήσαμε τον πίνακα, η κάθε γραμμή του αποτελεί έναν μονοδιάστατο πίνακα με κλειδιά τους τίτλους των πεδίων μας.

Την κύρια δουλειά της συγχώνευσης, της αντικατάστασης δηλαδή των ορισμών των πεδίων μας μέσα στο κείμενο του μηνύματος με τις τιμές των αντίστοιχων κλειδιών τις εκάστοτε γραμμής, αναλαμβάνει η συνάρτηση mergeBody. Σ’ αυτή περνάμε το κείμενο του μηνύματος και τον πίνακα των στοιχείων της τρέχουσας γραμμής. Το σώμα της συνάρτησης ξεκινάει στη γραμμή 54 και, όπως βλέπετε, κάνουμε χρήση των κανονικών εκφράσεων προκειμένου να πάρουμε σε έναν πίνακα όλα τα μεταβλητά πεδία που έχουν οριστεί μέσα στο κείμενό μας, υπό τη μορφή ${“όνομα πεδίου”}. Στη συνέχεια, με τη βοήθεια ενός βρόχου αντικαθιστούμε στο κείμενό μας τον προαναφερθέντα ορισμό του εκάστοτε πεδίου με την τιμή που αντιστοιχεί στο ομότιτλο κλειδί του πίνακα (γραμμής) δεδομένων. Για να έχουμε μάλιστα τον τίτλο του πεδίου, αποκόπτουμε τα αρχικά ${” καθώς και τα τελικά “} που χρησιμοποιούμε για τον ορισμό του εντός του κειμένου. Στη συνέχεια επιστρέφουμε το συγχωνευμένο κείμενο, το οποίο κι αποστέλλουμε με email με τη βοήθεια της συνάρτησης sendEmail του αντικειμένου MailApp. Προσέξτε ότι για την εκάστοτε διεύθυνση email χρησιμοποιούμε το κλειδί “email” από τον πίνακα των στοιχείων της τρέχουσας γραμμής. Αυτό συνεπάγεται ότι, όπως και τα πεδία, θα πρέπει να συμφωνεί ο τίτλος της στήλης που δημιουργήσαμε κατά το στήσιμο του φύλλου εργασίας μας, με αυτόν που ορίζουμε μέσα στη συνάρτηση (“email”, στην προκειμένη περίπτωση).

Μετά την ολοκλήρωση των αποστολών εμφανίζουμε στο χρήστη ένα ενημερωτικό μήνυμα, σχετικά με την ολοκλήρωση και το πλήθος των απεσταλμένων μηνυμάτων. Για να γίνει αυτό, χρησιμοποιούμε τη συνάρτηση msgBox του αντικειμένου Browser.

Το φύλλο εργασίας μας, στημένο και πανέτοιμο να μας επιτρέψει να προχωρήσουμε στην πολυπόθητη συγχώνευση αλληλογραφίας.

Το φύλλο εργασίας μας, στημένο και πανέτοιμο να μας επιτρέψει να προχωρήσουμε στην πολυπόθητη συγχώνευση αλληλογραφίας.

Για την εκτέλεση του script θα πρέπει είτε να πατήσουμε τη σχετική επιλογή από το μενού που φτιάξαμε στο φύλλο εργασίας, είτε από το περιβάλλον του Script Editor να πάμε στο μενού “Εκτέλεση” και να επιλέξουμε τη συνάρτηση “send”. Για αρχή επιλέγουμε τη δεύτερη λύση, έτσι ώστε να δούμε αν όλα λειτουργούν σωστά, δίχως να χρειάζονται περαιτέρω αλλαγές και έλεγχοι, προτού αποφασίσουμε να εγκαταλείψουμε το περιβάλλον του Script Editor. Μάλιστα, επειδή είναι η πρώτη φορά που εκτελούμε τον κώδικα του script, θα πρέπει να παραχωρήσουμε τις σχετικές άδειες από το λογαριασμό μας (στη Google), στο παράθυρο προτροπής που θα εμφανιστεί. Με βάση τα αντικείμενα από το Google API που χρησιμοποιήσαμε, μας ζητείται να επιτρέψουμε στο script την πρόσβαση στα υπολογιστικά φύλλα του drive μας, καθώς και την αποστολή emails. Φυσικά συναινούμε και προχωράμε στην πρώτη εκτέλεση του κώδικά μας.

Η εκτέλεση του script μας απαιτεί τη σχετική εξουσιοδότηση από πλευράς χρήστη.

Η εκτέλεση του script μας απαιτεί τη σχετική εξουσιοδότηση από πλευράς χρήστη.

Οι άδειες πρόσβασης που καλούμαστε να παραχωρήσουμε στο script λαμβάνονται υπ' όψιν από τα αντικείμενα του Google API που έχουμε χρησιμοποιήσει.

Οι άδειες πρόσβασης που καλούμαστε να παραχωρήσουμε στο script λαμβάνονται υπ’ όψιν από τα αντικείμενα του Google API που έχουμε χρησιμοποιήσει.

Δίχως καμιά δυσάρεστη έκπληξη η συγχώνευση αλληλογραφίας στις δοκιμαστικές διευθύνσεις email που δώσαμε δούλεψε απροβλημάτιστα. Στο σημείο αυτό να αναφέρουμε ότι για την αποφυγή φαινομένων spamming δεν μπορούμε να στείλουμε περισσότερα από 200 emails εντός εικοσιτετραώρου. Κλείνοντας τώρα την καρτέλα του Script Editor περνάμε πίσω, σε αυτή με το ανοιχτό φύλλο εργασίας μας, στο οποίο αν δεν έχει εμφανιστεί το μενού που προσθέσαμε, το κλείνουμε και το ξανανοίγουμε μέσα από το Google Drive μας. Μια δοκιμαστική αποστολή μέσα από το μενού μας αυτή τη φορά, πήγε κατ’ ευχήν. Για οποιεσδήποτε αλλαγές στον κώδικα, ο Script Editor είναι εκεί που τον αφήσαμε (τον ανοίγουμε και πάλι από τη σχετική επιλογή του μενού “Εργαλεία”).

Το περιβάλλον εργασίας του Script Editor είναι λιτό, δίνοντας έμφαση στην επεξεργασία του κώδικα. Πίσω πάντως από την φαινομενική απλότητά του, ο Editor κρύβει έναν πανίσχυρο Debugger. Αν αποφασίσετε να τον αξιοποιήσετε, είμαστε σίγουροι πως θα ενθουσιαστείτε.

Το περιβάλλον εργασίας του Script Editor είναι λιτό, δίνοντας έμφαση στην επεξεργασία του κώδικα. Πίσω πάντως από την φαινομενική απλότητά του, ο Editor κρύβει έναν πανίσχυρο Debugger. Αν αποφασίσετε να τον αξιοποιήσετε, είμαστε σίγουροι πως θα ενθουσιαστείτε.

Για μια ακόμη φορά ομολογούμε πως είμαστε ενθουσιασμένοι, αφού προσδώσαμε μια αγαπημένη και χρήσιμη δυνατότητα σε ένα προϊόν που δεν την υποστηρίζει εγγενώς. Επιπρόσθετα, είχαμε τη χαρά να μελετήσουμε τον αρκετά ισχυρό Script Editor της Google, σε συνδυασμό με το παρεχόμενο API για τα προϊόντα της εταιρείας. Δεν σας κρύβουμε ότι το όλο πρότζεκτ μας έβαλε σε ευχάριστες σκέψεις και ήδη σχεδιάζουμε το επόμενο cloud-oriented project μας.

Ο παραλήπτης έλαβε ένα εντελώς προσωποποιημένο μήνυμα. Ακριβώς ό,τι θέλαμε. Ωραία.

Ο παραλήπτης έλαβε ένα εντελώς προσωποποιημένο μήνυμα. Ακριβώς ό,τι θέλαμε. Ωραία.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων