1

Problem

I want to get the value of a property of a org-contacts-db entry:

\* Example Contact :MYTAG: :PROPERTIES: :ID: foobar :END: 

With the function call (org-contacts-filter "Example Contact" nil nil) I get an alist of the contact "Example Contact" from the org-contacts-db, which looks something like

((#("Example Contact" 0 15 (fontified nil org-category "contacts")) #<marker at 14837 in contacts.org> (("CATEGORY" . "contacts") ("ID" . "foobar") … 

In order to get the value corresponding to the key "ID" I tried (cdr (assoc "ID" (org-contacts-filter "Example Contact" nil nil))), which only results in nil.

How do I get the value of the :ID: property?

Context

I want to build a capture template for events which can only take place at certain locations. Those locations and their addresses are all managed with org-contacts. The entries for the locations of interest share tagged the same. During the capture process I want to provide a list of locations, from which I can select the right one via the function my-capture-selection.

(defun my-capture-selection (list variable) "Let the user choose between a pre-defined set of strings" (make-local-variable variable) (let ((selected-value (ido-completing-read "Select from list: " list))) (set variable selected-value) selected-value)) 

To create the list I can search my org-contacts-db for all entries with a certain tag. (org-contacts-filter nil "MYTAG" nil) The result is something like:

((#("NAME_1" … )) … ("ID" . "ORG_ID_1") … (#("NAME_2" … )) … ("ID" . "ORG_ID_2") 

By calling %(my-capture-selection (org-contacts-filter nil "MYTAG" nil) 'my-selection)) in my capture template, I see all contacts tagged "MYTAG", select one of them and save the selection to "my-selection".

In order to provide a link to the org-contact for the location, I want to get the "ID" property, which was created with org-id. Since I already saved the name of the org-contacts-entry in "my-selection", I should be able to access any property of the entry. With access to the value of "ID" I could build a link to the entry with (concat "[[" …value of ID… "][" my-selection "]]")

2
  • How about org-id-get -- "Get the ID property of the entry at point-or-marker POM. ..."? Commented Jul 27, 2017 at 0:26
  • Usually I won't start my capture process from within my org-contacts file. In order the get the ID of the correct contact I would have to visit my org-contacts file, search for the contacts heading, put a marker on it and invoke ´org-id-get´. Using the org-contacts-db seems to be the shorter and safer way to access a contacts properties. Commented Jul 27, 2017 at 10:23

1 Answer 1

2

You almost have the answer. The only problem is that the value returned by org-contacts-filter has several parts that need to be unpacked before you get to the assoc list. A bit of experimenting gave me this, which seems to work:

(cdr (assoc "ID" (nth 2 (car (org-contacts-filter "Example Contact"))))) 

The second line is what I have added to your attempt.

1
  • Thank you! This solved my problem. The code stays valid for getting the value of every other property present in the org-contacts-entry by exchanging "ID" with another property-key. Very helpful! Commented Jul 27, 2017 at 10:11

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.