Skip to content

Instantly share code, notes, and snippets.

@ddsimoes
Last active August 29, 2015 14:19
Show Gist options
  • Save ddsimoes/cdedd16954974c3c2a14 to your computer and use it in GitHub Desktop.
Save ddsimoes/cdedd16954974c3c2a14 to your computer and use it in GitHub Desktop.
Google script para automatizar a criação de evento de devolução de livros para as bibliotecas da UNICAMP no Calendar
/*
-- Format of message body --
Bla bla bla
Bla bla bla
...
...
Bla bla bla
----------------------------------------------------------<br />
Autor: Burden, Richard L.<br />
Título: Análise numérica<br />
Ano: 2013<br />
Data da retirada: 07/04/2015<br />
Prazo de devolução: 14/04/2015<br />
----------------------------------------------------------<br />
Autor: Cunha, Maria Cristina de Castro, 1945-<br />
Título: Métodos numéricos<br />
Ano: 2000<br />
Edição/Número: [2. ed. rev. ampl.]<br />
Data da retirada: 07/04/2015<br />
Prazo de devolução: 14/04/2015<br />
----------------------------------------------------------<br />
Bla bla bla
*/
function parseDate(str) {
var p = str.split("/");
return new Date(p[2], p[1] - 1, p[0], 0, 0, 0, 0);
}
function getFieldValue(str, field) {
var regex = new RegExp(field + ": [^<]+");
return str.match(regex)[0].slice(field.length + 2);
}
function parseBook(str) {
var book = {
author: getFieldValue(str, "Autor"),
title: getFieldValue(str, "Título"),
returnDate: parseDate(getFieldValue(str, "Prazo de devolução")),
}
return book;
}
function findBooks(thread) {
var body = thread.getMessages()[0].getBody();
var parts = body.split(/----------------------------------------------------------/g);
if (parts.length < 3) {
Logger.log("Unknow body content: ");
Logger.log(body);
return;
}
parts = parts.slice(1, -1);
var books = new Array();
for (var i = 0; i < parts.length; i++) {
books.push(parseBook(parts[i]));
}
return books;
}
function findEvent(date) {
var event = null;
Logger.log(CalendarApp.getDefaultCalendar().getName());
var events = CalendarApp.getDefaultCalendar().getEventsForDay(date);
for (var i = 0; i < events.length; i++) {
event = events[i];
if (event.getTag("--BOOK_RETURN--") != null) {
Logger.log("Found event: " + event.getTitle() + " - " + event.getStartTime() + " - " + event.getDescription());
return event;
}
}
event = CalendarApp.getDefaultCalendar().createAllDayEvent("Devolução de livros", date);
event.setTag("--BOOK_RETURN--", "TRUE");
event.addEmailReminder(5);
Logger.log("Event created: " + event.getTitle() + " - " + event.getStartTime());
return event;
}
function getEvent(eventTable, date) {
var event = eventTable[date];
if (event == null) {
event = findEvent(date);
eventTable[date] = event;
}
return event;
}
function formatGmailDate(date) {
return date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate();
}
function processThread(eventTable, thread) {
var books = findBooks(thread);
for (var i = 0; i < books.length; i++) {
var book = books[i];
var event = getEvent(eventTable, book.returnDate);
var bookStr = book.title + " (" + book.author + ")";
var desc = event.getDescription();
if (desc.indexOf(bookStr) < 0) {
var separator = (desc.length > 0) ? "\n---------------------\n" : "";
event.setDescription(desc + separator + bookStr);
}
}
Logger.log(books);
}
function checkPendingEmails() {
var date = new Date(new Date().getTime() - 2 * 24 * 60 * 60 * 1000);
var query = 'after:' + formatGmailDate(date) + ' from:(unicamp.br) "Prazo de devolução" acervus';
Logger.log(query);
var eventTable = {};
var threads = GmailApp.search(query);
for (var i = 0; i < threads.length; i++) {
processThread(eventTable, threads[i]);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment