emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Re: Diary synchronising with Google calendar
@ 2010-07-07 21:19 Jordi Inglada
  2010-07-07 22:20 ` Eric S Fraga
       [not found] ` <25098780.22494.1278541157993.JavaMail.root@zm-cesbio-01>
  0 siblings, 2 replies; 4+ messages in thread
From: Jordi Inglada @ 2010-07-07 21:19 UTC (permalink / raw)
  To: ucecesf; +Cc: Emacs-orgmode

Hi Eric,

I am sorry to ask this, but can you post detailed instructions on how
to use your code? It seems that I am (at least) missing the
"add-to-google-calendar" function.

Thanks.

Jordi

On Tue, 6 Jul 2010 00:14:00 +0200, Daniel Mahler <dmahler <at> gmail.com> wrote:
> 
> On Mon, Jul 5, 2010 at 11:54 PM, Eric S Fraga <ucecesf <at> ucl.ac.uk> wrote:
> > On Mon, 5 Jul 2010 17:10:55 +0200, Daniel Mahler <dmahler <at> gmail.com> wrote:
> >>
> >> 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
function:

#+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"))
	(save-buffer)
	(kill-buffer (current-buffer))
	(message "Plain text written to %s" offline)))))
(ad-activate 'org-agenda-add-entry-to-org-agenda-diary-file)
#end_src

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...  <blush>

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

eric

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Diary synchronising with Google calendar
  2010-07-07 21:19 Diary synchronising with Google calendar Jordi Inglada
@ 2010-07-07 22:20 ` Eric S Fraga
       [not found] ` <25098780.22494.1278541157993.JavaMail.root@zm-cesbio-01>
  1 sibling, 0 replies; 4+ messages in thread
From: Eric S Fraga @ 2010-07-07 22:20 UTC (permalink / raw)
  To: Jordi Inglada; +Cc: Emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 1990 bytes --]

On Wed, 7 Jul 2010 23:19:04 +0200, Jordi Inglada <jordi.inglada@cesbio.cnes.fr> wrote:
> 
> Hi Eric,
> 
> I am sorry to ask this, but can you post detailed instructions on how
> to use your code? It seems that I am (at least) missing the
> "add-to-google-calendar" function.
> 
> Thanks.
> 
> Jordi

Jordi,

the original email had the emacs lisp defadvice function (see below)
as well as the activation of that function.  The advice is called
"add-to-google-calendar".  All you have to do is execute both bits,
not just the last line as the last line assumes you have defined the
advice already.

I hope that makes sense?

eric


#+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"))
	(save-buffer)
	(kill-buffer (current-buffer))
	(message "Plain text written to %s" offline)))))
(ad-activate 'org-agenda-add-entry-to-org-agenda-diary-file)
#end_src

[-- Attachment #2: Type: text/plain, Size: 75 bytes --]

-- 
Eric S Fraga
GnuPG: 8F5C 279D 3907 E14A 5C29  570D C891 93D8 FFFC F67D

[-- Attachment #3: Type: text/plain, Size: 201 bytes --]

_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Diary synchronising with Google calendar
       [not found]   ` <19511.31257.267848.353668@gargle.gargle.HOWL>
@ 2010-07-09 20:28     ` Eric S Fraga
       [not found]     ` <18737865.23968.1278707659240.JavaMail.root@zm-cesbio-01>
  1 sibling, 0 replies; 4+ messages in thread
From: Eric S Fraga @ 2010-07-09 20:28 UTC (permalink / raw)
  To: Jordi Inglada; +Cc: org-mode mailing list

[-- Attachment #1: Type: text/plain, Size: 1987 bytes --]

On Fri, 9 Jul 2010 21:35:53 +0200, Jordi Inglada <jordi.inglada@cesbio.cnes.fr> wrote:
> 
> Hi Eric,
> 
> Sorry for bothering you again.

No problem!  I've "bothered" plenty of people in the past...

> First of all, the google2org workflow works perfect with your last
> script. Thanks!

Excellent.  You're very welcome.

> However, I do not understand how to proceed in the other direction
> (org2google). I got your advice function, but I don't know what to do
> with it ...

Well, you have to execute both elisp statements, the one that defines
the "advice" and the one that activates this advice.  If you want this
done every time, copy the code into your .emacs (or equivalent),
placing it after the code which loads org.

Once activate, the code in the advice will be automatically executed
every time you insert an entry in the diary (more below).

Note, however, that this advice assumes the following:

1. that you have installed the google command line scripts and that
   the "google" command is found at /usr/bin/google.  If it is
   somewhere else, please change the relevant line in the code.

2. that you have already authenticated yourself to Google, doing for
   instance a manual add of an entry to the calendar directly from the
   shell, i.e. executing something like

   google add --cal org "This is a test entry for 2pm"

Of course, the latter also assumes that you have created a calendar
named "org" in Google's calendar.

> Could you describe how things work when you add an entry to your
> diary.org file? Which is the fucntion executed for this? How comes
> that the advice is activated?

I have defined diary.org as the target for any agenda diary entries:

(setq org-agenda-diary-file "~/git/notes/diary.org")

and it is one of my agenda files.  Therefore, when I view the agenda
(default: "C-c a a"), and then ask to insert a diary entry ("i d"),
this will invoke the function which I have "advised" and the google
script will be called.

Hope this helps.

[-- Attachment #2: Type: text/plain, Size: 75 bytes --]

-- 
Eric S Fraga
GnuPG: 8F5C 279D 3907 E14A 5C29  570D C891 93D8 FFFC F67D

[-- Attachment #3: Type: text/plain, Size: 201 bytes --]

_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Diary synchronising with Google calendar
       [not found]       ` <19512.6390.427253.455577@gargle.gargle.HOWL>
@ 2010-07-10 22:10         ` Eric S Fraga
  0 siblings, 0 replies; 4+ messages in thread
From: Eric S Fraga @ 2010-07-10 22:10 UTC (permalink / raw)
  To: Jordi Inglada; +Cc: org-mode mailing list

[-- Attachment #1: Type: text/plain, Size: 875 bytes --]

On Sat, 10 Jul 2010 08:53:42 +0200, Jordi Inglada <jordi.inglada@cesbio.cnes.fr> wrote:
> 
> Eric,
> 
> Thanks for your reply. Now I understand.
> 
> The advice function is now called when I add a diary entry, however,
> when I load emacs I get this message:
> 
> Warning: reference to free variable `d1'
> 
> And when I add a diary entry, I get an error message like this:
> 
> org-agenda-diary-entry-in-org-file: Wrong number of arguments: 

[...]

 [ad-return-value d1 dates
> entry d2 day1 nil
> ad-Orig-org-agenda-add-entry-to-org-agenda-diary-file 2 block ...] 17
> #("Advice doc string" 0 17 (ad-advice-info
> org-agenda-add-entry-to-org-agenda-diary-file))], 3
> 
> 
> I am not sure to use the right syntax for the diary entry.

I think this is more than likely due to you using a older version of
org mode.  What version are you using?  (try "M-x org-version RET").

[-- Attachment #2: Type: text/plain, Size: 75 bytes --]

-- 
Eric S Fraga
GnuPG: 8F5C 279D 3907 E14A 5C29  570D C891 93D8 FFFC F67D

[-- Attachment #3: Type: text/plain, Size: 201 bytes --]

_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-07-10 22:10 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-07-07 21:19 Diary synchronising with Google calendar Jordi Inglada
2010-07-07 22:20 ` Eric S Fraga
     [not found] ` <25098780.22494.1278541157993.JavaMail.root@zm-cesbio-01>
     [not found]   ` <19511.31257.267848.353668@gargle.gargle.HOWL>
2010-07-09 20:28     ` Eric S Fraga
     [not found]     ` <18737865.23968.1278707659240.JavaMail.root@zm-cesbio-01>
     [not found]       ` <19512.6390.427253.455577@gargle.gargle.HOWL>
2010-07-10 22:10         ` Eric S Fraga

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).