Features Download

From: Eric S Fraga <ucecesf <at> ucl.ac.uk>
Subject: Diary synchronising with Google calendar (was Re: Google CL and org-mode)
Newsgroups: gmane.emacs.orgmode
Date: Tuesday 6th July 2010 15:30:25 UTC (over 8 years ago)
On Tue, 6 Jul 2010 00:14:00 +0200, Daniel Mahler  wrote:
> On Mon, Jul 5, 2010 at 11:54 PM, Eric S Fraga  wrote:
> > On Mon, 5 Jul 2010 17:10:55 +0200, Daniel Mahler 
> >>
> >> Hi,
> >>
> >> Have you looked at g-client?
> >
> > Thanks.  I did look at g-client a long time ago.  It should provide
> > everything we need but it's much more than I want to even start
> > considering...  I just don't have the time unfortunately.
> >
> > The google command line scripts, on the other hand, are
> > straightforward and will give me (others?) 90% of the functionality I
> > want.
> >
> > Mind you, I've been playing a bit and Google's "quick add" syntax
> > leaves a bit to be desired.  There's no formal specification and it
> > doesn't quite work, especially trying to get a repeated entry at a
> > given time of day.
> >
> GoogleCL is actually a rather thin wrapper around the gdata python
> client library,
> which essentially just adds the commandline processing.
> Maybe the way to go is to call gdata directly via pymacs.
> cheers
> Daniel

Yes, using pymacs and interacting directly with Google's API may be
the way to go.  However, given my usual time constraints, I'm going
for the 80% solution, as described below:

My use case is that I spend almost all of time in Emacs (and almost
all of that time within org) but I am sometimes but not often away
from one of my computers with only my Android phone.  When I'm away
from the computers, I need to be able to check my diary and maybe make
the odd addition to it.  I am not particularly concerned with note
taking with my mobile phone (too annoying! and MobileOrg is probably a
better solution for synchronised note taking in any case...) so the
following meets this use case.

I have two relevant org files: diary.org and googlecalendar.org.  The
first is the default target for inserting diary entries from org's
agenda view; the latter contains all items scheduled from within
Google's calendar application, typically from my phone, and downloaded
and processed using the awk script I posted to this list last week.

On the Google calendar side, I have two calendars: the default and one
called "org".  The first is used when I actually schedule something
using Google.  The latter is populated directly by org using Google's
command line scripts with this advice on org's diary insertion

#+begin_src emacs-lisp
(defadvice org-agenda-add-entry-to-org-agenda-diary-file 
  (after add-to-google-calendar)
  "Add a new Google calendar entry that mirrors the diary entry just
created by org-mode."
  (let ((type (ad-get-arg 0))
	(text (ad-get-arg 1))
	(d1 (ad-get-arg 2))
	(year1 (nth 2 d1))
	(month1 (car d1))
	(day1 (nth 1 d1))
	(d2 (ad-get-arg 3))
	entry dates)
    (if (or (not (eq type 'block)) (not d2))
	(setq dates (format "%d-%02d-%02d" year1 month1 day1))
      (let ((year2 (nth 2 d2)) (month2 (car d2)) (day2 (nth 1 d2)) (repeats
(- (calendar-absolute-from-gregorian d1)
									       (calendar-absolute-from-gregorian d2))))
	(if (> repeats 0)
	    (setq dates (format "%d-%02d-%02d every day for %d days" year1 month1
day1 (abs repeats)))
	  (setq dates (format "%d-%02d-%02d every day for %d days" year1 month1
day1 (abs repeats))))
    (setq entry  (format "/usr/bin/google calendar add --cal org \"%s on
%s\"" text dates))
    ;;(message entry)
    (if (not (string= "MYLAPTOPCOMPUTER" mail-host-address))
	(shell-command entry)
      (let ((offline "~/tmp/org2google-offline-entries"))
	(find-file offline)
	(goto-char (point-max))
	(insert (concat entry "\n"))
	(kill-buffer (current-buffer))
	(message "Plain text written to %s" offline)))))
(ad-activate 'org-agenda-add-entry-to-org-agenda-diary-file)

This does two things depending on my online status which is implicitly
defined by the host address of the computer I am using (yes, kludgy at
best): if online, the headline entry for the new diary entry (which is
stored in diary.org) is sent to my "org" Google calendar.  If offline,
the command line that would have been used is stored in a file.  When
I got back online, I simply execute and empty this file as part of a
more general synchronisation step (including git updates for my org
files and sending any composed emails like this one ;-).

This 2x2 approach (two diaries in org, two calendars in Google) seems
to be working very well.  It works for me because I seldom delete
items in my diary and, in any case, I'd rather err on having an entry
that no longer makes sense than end up double-booked.

Repeated events with times, however, do not work as Google's "Quick
Add" feature, on which the command line script depends, doesn't quite
work.  So only timed events for a single day or repeated daily
non-timed events are processed correctly.

There is also little (well, nothing) in the way of error checking in
this advice...  

I hope this is of some use to people!  I'm really enjoying my Android
phone together with org!

CD: 13ms