Gmail samenvoegen met Google Sheet

In dit artikel komt aan de orde hoe een Google Sheet automatisch kan worden samengevoegd met informatie uit een Gmail via Apps Script.

Een voorwaarde is dat de e-mail de onderstaande HTML-tabel structuur kent: meerdere rijen en twee kolommen.

01<table>
02        <tr>
03                <td width="25%">
04                        <p><b>Locatie</b>
05                        </p>
06                </td>
07                <td>
08                        <p>Amsterdam
09                        </p>
10                </td>
11        </tr>
12</table>

Het onderstaande script scant alle e-mails die gelabeld zijn met "MijnLabel" en zoekt - in dit voorbeeld - de Locatie in de tabel en plaatst het bijbehorende resultaat (Amsterdam) in cel A1.

01function extractDataFromEmail() {
02  var sheet = SpreadsheetApp.getActiveSheet();
03  var label = GmailApp.getUserLabelByName("MijnLabel");
04 
05  if (label) {
06    var threads = label.getThreads();
07 
08    for (var i = 0; i < threads.length; i++) {
09      var messages = threads[i].getMessages();
10      for (var j = 0; j < messages.length; j++) {
11        var message = messages[j];
12        var htmlBody = message.getBody();
13         
14        var naamValue = extractValueFromHtml(htmlBody, "Locatie");
15        if (naamValue) {
16          sheet.getRange("A1").setValue(naamValue);
17        }
18      }
19    }
20  } else {
21    Logger.log("Label niet gevonden");
22  }
23}
24 
25function extractValueFromHtml(html, label) {
26  var lines = html.split('\n');
27  var extractingValue = false;
28 
29  for (var k = 0; k < lines.length; k++) {
30    if (lines[k].indexOf('<p><b>' + label + '</b>') !== -1) {
31      extractingValue = true;
32      continue;
33    }
34 
35    if (extractingValue && lines[k].trim().startsWith('<p>')) {
36      return lines[k].trim().replace(/<\/?p>/g, '');
37    }
38  }
39  return null;
40}

Vooralsnog werkt dit script voor één enkele e-mail, voor de toekomst zal dit artikel wellicht worden aangepast voor bulk-verwerking.