JanKoWeb: Počítače a IT - Bookmarklet: automatická analýza mailu a přidání akce do kalendáře Google (český formát)

Bookmarklet: automatická analýza mailu a přidání akce do kalendáře Google (český formát)

Proč?

Dlouho jsem si říkal, že by bylo dobré automatizovat přidání události do kalendáře z mailu. Často mi lidé pošlou pozvánku třeba na nějaké hudební hraní a já si to pak ručně píši do kalendáře. To mě ale nebaví. Psát ručně do kalendáře. Hrát mě baví:-)

Proto jsem si vytvořil bookmarklet (skriptík, spouštěný v prohlížeči), kterému označím kus mailu a on jej analyzuje a udělá z něj událost v Kalendáři.

Jak bookmarklet funguje?

Hledá výskyty času (formát HH:MM, tedy třeba 09:00; umí ale také např. 9h, 9 h) a datumu (formát DD.MM., tedy třeba 1.5., umí ale i 1. 5, 1. 5., 1. května, 1. květen, 1.květen, 1.kvě, 1. kvě).

První dva výskyty bere jako čas, respektive datum začátku/konce události. Ostatní ignoruje, pokud jsou dva časy a jedno datum, bere se, jako že událost končí ten samý den. Pokud se nenajde ani jeden čas nebo ani jedno datum, bere se aktuální.

Jak použít bookmarklet?

  1. Přesuňte si tento odkaz - Mail2Cal - na lištu záložek (či do záložek)
  2. Otevřete mail, označte text, který obsahuje časové údaje a klikněte na Mail2Cal
  3. Měla by se vytvořit nová událost ve Vašem Google kalendáři

Samozřejmě jde použít na jakýkoli text, nejen v mailu.

Použití bookmarkletu
Ukázka použití bookmarkletu

Konkrétní kalendář

Nevím proč, ale když se takto přidává do kalendáře, jde vidět jen jeden (defaultní) kalendář ve výběrovém seznamu. Aby se dalo přidat automaticky do jiného kalendáře, musí se přidat adresa tohoto kalendáře (je vidět v Nastavení kalendáře - Adresa kalendáře; něco jako "...gfk9hdmb8k@group.calendar.google.com") - link. Tu napište mezi apostrofy v:

calendar = '';

Zdrojový kód bookmarkletu

(upraveno pomocí http://chriszarate.github.io/bookmarkleter/ z javascriptového zdrojáku, šikovná věc)

javascript:void%20function(){url=window.location,window.getSelection%3Fselection=window.getSelection():document.getSelection%3Fselection=document.getSelection():document.selection%26%26(selection=document.selection.createRange().text),selection+=%22%22,str=selection,str=%22fasdfa%2015.%204%20%20sd%20fasd%2018%20h%20http://mecp.cu/fas%20fasdf%20%2020.%20července%2019h%20adfa%20fa%20fadsfasd%20f%2015.5.%20a%20fa%20fasdf%22,selection=str,str=str.replace(/([0-9]{1,2})%20%3Fh/g,%22$1:00%22),str=str.replace(/([0-9]{1,2})\.%20%3F([0-9]{1,2})/g,%22$1.$2.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fled[^%20]*/g,%22$1.01.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fúno/g,%22$1.02.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fbře/g,%22$1.03.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fdub/g,%22$1.04.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fkvě/g,%22$1.05.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fčerven[^%20]*/g,%22$1.07.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fčer/g,%22$1.06.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fsrp/g,%22$1.08.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fzář/g,%22$1.09.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fříj/g,%22$1.10.%22),str=str.replace(/([0-9]{1,2})\.%20%3Flis/g,%22$1.11.%22),str=str.replace(/([0-9]{1,2})\.%20%3Fpro/g,%22$1.12.%22),date=str.match(/([0-9]{1,2})\.([0-9]{1,2})\./g),time=str.match(/[0-9]{1,2}:[0-9]{2}/g),map=str.match(/http:\/\/[^%20]+/g),null==map%26%26(map=%22%22),today=new%20Date,time_from=(%220%22+today.getHours()).slice(-2)+(%220%22+today.getMinutes()).slice(-2),date_from=(%220%22+(today.getMonth()+1)).slice(-2)+(%220%22+today.getDate()).slice(-2),time_to=time_from,date_to=date_from,year=today.getFullYear(),null!=time%26%26(time.length%3E=2%3F(tmp=time[0].split(%22:%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[0].length%26%26(tmp[1]=%220%22+tmp[1]),time_from=tmp[0]+tmp[1],tmp=time[1].split(%22:%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),time_to=tmp[0]+tmp[1]):(tmp=time[0].split(%22:%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),time_from=tmp[0]+tmp[1],time_to=time_from)),null!=date%26%26(date.length%3E=2%3F(tmp=date[0].split(%22.%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),date_from=tmp[1]+tmp[0],tmp=date[1].split(%22.%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),date_to=tmp[1]+tmp[0]):(tmp=date[0].split(%22.%22),1==tmp[0].length%26%26(tmp[0]=%220%22+tmp[0]),1==tmp[1].length%26%26(tmp[1]=%220%22+tmp[1]),date_from=tmp[1]+tmp[0],date_to=date_from)),selection.length%3E25%3Ftext=selection.substring(0,24):text=selection,selection=selection+%22\n\n%22+str,from=year+date_from+%22T%22+time_from+%2200%22,to=year+date_to+%22T%22+time_to+%2200%22,calendar=%22%22,urlopen=%22https://www.google.com/calendar/render%3Faction=TEMPLATE%26dates=%22+from+%22/%22+to+%22%26text=%22+text+%22%26location=%22+map+%22%26details=%22+encodeURIComponent(selection+%22\n\nmail%20link\n%22+url)+%22%26src=%22+calendar,void%20window.open(urlopen)}();

Zdrojový javascript

url = window.location;
if (window.getSelection){ selection = window.getSelection(); } else if (document.getSelection) { selection = document.getSelection(); } else if (document.selection) { selection = document.selection.createRange().text; }
/* I don't know why, but without + '' it does not work */
selection = selection + '';
str = selection;
/*
str = 'fasdfa 15. 4  sd fasd 18 h http://mecp.cu/fas fasdf  20. července 19h adfa fa fadsfasd f 15.5. a fa fasdf';
*/
/* corrects time */
str = str.replace(/([0-9]{1,2}) ?h/g,'$1:00'); /*18 h -> 18:00*/
/* corrects date */
str = str.replace(/([0-9]{1,2})\. ?([0-9]{1,2})/g,'$1.$2.'); /* 13.5., 13. 5., 13.5 */
/* corrects czech months */
str = str.replace(/([0-9]{1,2})\. ?led[^ ]*/g,'$1.01.'); /* 13. ledna */
str = str.replace(/([0-9]{1,2})\. ?úno/g,'$1.02.');
str = str.replace(/([0-9]{1,2})\. ?bře/g,'$1.03.');
str = str.replace(/([0-9]{1,2})\. ?dub/g,'$1.04.');
str = str.replace(/([0-9]{1,2})\. ?kvě/g,'$1.05.');
str = str.replace(/([0-9]{1,2})\. ?červen[^ ]*/g,'$1.07.'); /* musi byt pred cervnem, jinak by se nahradilo spatne */
str = str.replace(/([0-9]{1,2})\. ?čer/g,'$1.06.');
str = str.replace(/([0-9]{1,2})\. ?srp/g,'$1.08.');
str = str.replace(/([0-9]{1,2})\. ?zář/g,'$1.09.');
str = str.replace(/([0-9]{1,2})\. ?říj/g,'$1.10.');
str = str.replace(/([0-9]{1,2})\. ?lis/g,'$1.11.');
str = str.replace(/([0-9]{1,2})\. ?pro/g,'$1.12.');

/* parsing */
date = str.match(/([0-9]{1,2})\.([0-9]{1,2})\./g); /* 5.6.*/
time = str.match(/[0-9]{1,2}:[0-9]{2}/g); /*18:00*/

map = str.match(/http:\/\/[^ ]+/g);
if (map == null)
map = '';
/* initialize */
today = new Date();
time_from = ('0' + today.getHours()).slice(-2) + ('0' + today.getMinutes()).slice(-2);
date_from = ('0' + (today.getMonth()+1)).slice(-2) + ('0' + today.getDate()).slice(-2);
time_to = time_from;
date_to = date_from;
year = today.getFullYear();
/* parse time */
if (time != null)
{
if (time.length >= 2)
{ // we found two times
tmp = time[0].split(':');
if (tmp[0].length==1)
tmp[0] = '0' + tmp[0];
if (tmp[0].length==1)
tmp[1] = '0' + tmp[1];
time_from = tmp[0]+tmp[1];
tmp = time[1].split(':');
if (tmp[0].length==1)
tmp[0] = '0' + tmp[0];
if (tmp[1].length==1)
tmp[1] = '0' + tmp[1];
time_to = tmp[0]+tmp[1];
}
else
{
tmp = time[0].split(':');
if (tmp[0].length==1)
tmp[0] = '0' + tmp[0];
if (tmp[1].length==1)
tmp[1] = '0' + tmp[1];
time_from = tmp[0]+tmp[1];
time_to = time_from;
}
} /* end of parse time */

if (date != null)
{
if (date.length >= 2)
{ /* we found two dates */
tmp = date[0].split('.');
if (tmp[0].length==1)
tmp[0] = '0' + tmp[0];
if (tmp[1].length==1)
tmp[1] = '0' + tmp[1];
date_from = tmp[1]+tmp[0];
tmp = date[1].split('.');
if (tmp[0].length==1)
tmp[0] = '0' + tmp[0];
if (tmp[1].length==1)
tmp[1] = '0' + tmp[1];
date_to = tmp[1]+tmp[0];
}
else
{
tmp = date[0].split('.');
if (tmp[0].length==1)
tmp[0] = '0' + tmp[0];
if (tmp[1].length==1)
tmp[1] = '0' + tmp[1];
date_from = tmp[1]+tmp[0];
date_to = date_from;
}
} /* end of parse time */
if (selection.length>25)
{
text = selection.substring(0,24);
}
else
{
text = selection;
}
/* ladeni */
/*selection = selection + '\n\n' + str;*/

from = year + date_from + 'T' + time_from + '00';
to = year + date_to + 'T' + time_to + '00';
calendar = '';
urlopen = 'https://www.google.com/calendar/render?action=TEMPLATE&dates='+from+'/'+to+'&text='+text+'&location='+map+'&details='+encodeURIComponent(selection+'\n\nmail link\n'+url)+'&src='+calendar;
/*alert(urlopen);*/
void(window.open(urlopen));
Rubrika Počítače a IT | Tagy Bookmarklet, Javascript | Po 04.05.2015 | 546x

Náhodné články

Tento web jsem zakládal na střední, v roce 2008. Je zde hlavně archiv mé tvorby.

Aktuální věci publikuji kvůli úspoře času na Twitter.

Honza

"Čas je nejlepší soudce a trpělivost nejlepší mistr."

Guy de Pourtales