Fecha de organización de la hoja de cálculo


7

Puedo calcular fechas así:

#+NAME: mytbl
| # | [2014-12-14 Sun] | 30 | <2015-01-13 Tue> |
#+TBLFM: $4=$2+$3;D

pero lo que quiero hacer es hacer que esa fecha aparezca como una fecha de agenda, algo así como:

DEADLINE: $remote(mytbl,@1$4)

Pero eso no funciona. No puedo encontrar ninguna sintaxis, incluso una macro, que permita cualquier cosa que no sea una fecha literal para una entrada en la agenda.

¿Algunas ideas?


Hay una función de superposición utilizada para hacer que la marca de tiempo se vea como algo diferente de lo que realmente es. Probablemente sería más fácil simplemente ajustar esa funcionalidad y hacer que se superponga a su propio formato; debajo de la superposición estará la marca de tiempo estándar que es utilizada por numerosas funciones org-modey que no se puede cambiar fácilmente (en mi opinión), incluso hay un nota en la cadena de documentación para la variable de marca de tiempo que aconseja no ajustar con ella.
ley el

org-time-stamp-formatses una variable definida en org.el. Su valor es ("<%Y-%m-%d %a>" . "<%Y-%m-%d %a %H:%M>")Esta variable puede ser arriesgada si se usa como una variable local de archivo. Documentación: formatos para los format-time-stringque se utilizan las marcas de tiempo. No se recomienda cambiar esta constante. Ver también, el formato de sello de tiempo personalizado: orgmode.org/manual/Custom-time-format.html#Custom-time-format
lawlist

Creo que no lo expliqué correctamente. No estoy tratando de cambiar el aspecto de la marca de tiempo. Estoy bien con la forma normal <% Y-% m-% d% a>. Lo que quiero terminar es el equivalente a "FECHA LÍMITE: <2015-01-13 Tue>", pero en lugar de escribirlo en mí, quiero que provenga de la hoja de cálculo, que se ha calculado. ¿Hay alguna forma de transportar esa información? ¿O hay otra forma de proporcionar algo después de "DEADLINE:" (como quizás elisp, donde puedo calcular la fecha) donde se interpretará como una fecha?
jtgd

No tengo una respuesta, pero me gustaría arrojar algunas ideas. En general, el búfer org-agenda es solo una bonita copia y pega de los archivos org-agenda-raw. En un hilo reciente, me desplazo a través de los archivos de la agenda de la organización hacia atrás y me detengo en el título de cada entrada para tratar la marca de tiempo como si fuera x número de días AD para hacer algunos cálculos adicionales (por ejemplo, si algo se debe hoy o atrasado). emacs.stackexchange.com/a/5700/2287 En teoría, podría detenerse en cada encabezado y hacer sus cálculos y generar un búfer de agenda personalizado. Esto no es trivial, pero es interesante.
ley el

Bueno, gracias por su lista de leyes de respuesta, pensé que tenía que haber una manera de incluir una fecha en la agenda además de escribir una cadena literal. Tal vez pueda profundizar en las funciones utilizadas cuando se genera la agenda. Desearía que hubiera algo como una función 'eval' que volviera a escanear la salida de una función.
jtgd

Respuestas:


4

Prueba esto:

Calcule la fecha límite en una hoja de cálculo, también conocida como tabla .

#+NAME: mytbl
| # | [2014-12-14 Sun] | 30 | <2015-01-13 Tue> |
| # | [2014-12-15 Mon] | 10 | <2014-12-25 Thu> |
#+TBLFM: $4=$2+$3;D

Cree una nueva tabla 1x1 que haga referencia a la fecha límite calculada desde la primera tabla usando la remote(NAME-OR-ID,REF)función.

#+NAME: mydeadline
| <2015-01-13 Tue> |
#+TBLFM: $1=remote(mytbl,@1$4)

Pase la tabla de fecha límite 1x1 como variable a través del encabezado :var name=value al SRC bloque con nombre , por ejemplo, el bloque de código set_deadline elisp a continuación.

#+NAME: set_deadline
#+HEADER: :var the_date=mydeadline
#+HEADER: :results  raw replace output 
#+begin_src elisp
   (princ (format "DEADLINE: %s" ( car (car the_date))))
#+end_src

Evalúe el uso del bloque SRC C-c C-cy la fecha límite se agregará al archivo de modo de organización debajo de un #+RESULTS:bloque.

Agregar el :results raw encabezado al bloque de código obliga a que la salida en formato org-mode se reconozca como una declaración de organización regular.

#+RESULTS: set_deadline
DEADLINE: <2015-01-13 Tue>

Como una ventaja adicional, el uso de bloques src con nombre también fomenta la reutilización de código a través de llamadas a funciones en línea.

Como antes, evalúe cada función en línea usando C-c C-cy se agregará una nueva fecha límite al archivo de modo org.

#+NAME: first-deadline
call_set_deadline(the_date=mydeadline)[ :results raw ]

#+RESULTS: first-deadline
DEADLINE: <2015-01-13 Tue>

#+NAME: my-other-deadline
| <2014-12-25 Thu> |
#+TBLFM: $1=remote(mytbl,@2$4)

#+NAME: second-deadline
call_set_deadline(the_date=my-other-deadline)[ :results raw ]

#+RESULTS: second-deadline
DEADLINE: <2014-12-25 Thu>

Espero que haya ayudado!

Nota: Este código se probó utilizando las siguientes versiones de emacs y org-mode.

GNU Emacs 24.4.1 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14)
Org-mode version 8.2.10 (8.2.10-29-g89a0ac-elpa)

@jtgd, ¿te ayudó esta respuesta?
Melioratus

Sí mucho. Vea abajo.
jtgd

@jtgd ¡ Gracias! ¡Me has alegrado el día! En cuanto a que replaceno se comporta como se esperaba, intente actualizar el rawencabezado con el drawerencabezado. Después de cambiar, todo funcionó como se esperaba. Espero que ayude! ¡Gracias por hacer su pregunta y su código de elisp!
Melioratus

@jtgd: acabo de publicar otro ejemplo que utiliza pequeños bloques de código escritos en eLisp, Perl, bash, Python y Ruby para convertir el texto en una lista de casillas de verificación.
Melioratus

Oh, gracias de nuevo! La drawercosa funciona perfecta ahora. Hay tanto que aprender sobre el modo org. Es bueno tener magos como tú. En cuanto a sus otros ejemplos publicados, probé uno y funciona rawsin agregar. Pero mi aplicación funciona, así que estoy feliz.
jtgd

1

Muchas gracias Melioratus, ¡qué excelente respuesta! Es sorprendente cómo usaste los diversos mecanismos del modo Org para hacer esto. La parte más importante de esto para mí fue :results rawqué texto resultante se volvería a analizar en la creación de la agenda. Esa fue la clave.

Cuando vi cómo podría expandir esto para manejar muchas fechas, me pregunté si no podría simplemente hacer los cálculos de fechas en elisp. Todavía soy muy nuevo en elisp, pero pirateé un poco y se me ocurrió esto.

Mi tarea es calcular la fecha en que se agotan mis medicamentos agregando 30 días al día en que empiezo el biberón. Lo que hice fue esto.

En mi .emacs escribí algunas funciones:

(defun date-high-low (secs)
  "Split int into high-low words"
  (list (/ secs 65536) (% secs 65536)))

(defun date-plus-days (datestr days)
  "Generate org-style date string from date + days offset"
  (format-time-string "<%Y-%m-%d %a>" (date-high-low (truncate (+ (org-time-string-to-seconds datestr) (* days 86400))))))

(defun org-header-date-plus-days (fmt datestr days)
  "Use above to build final org header entry from format string"
  (princ (format fmt (date-plus-days datestr days))))

Traté de mantener estas funciones genéricas y no centradas en los medicamentos para su reutilización. Puede haber mejores formas de hacer esto, como dije que soy un novato.

Luego en mi archivo .org hago esto:

#+HEADER: :results raw output replace
#+begin_src elisp
    (org-header-date-plus-days "** MED LAST DAY Med-1\nDEADLINE: %s\n" "[2014-12-14 Sun]" 30)
    (org-header-date-plus-days "** MED LAST DAY Med-2\nDEADLINE: %s\n" "[2014-12-22 Mon]" 54)
    (org-header-date-plus-days "** MED LAST DAY Med-3\nDEADLINE: %s\n" "[2015-01-02 Fri]" 60)
#+end_src

Agradable y ordenado, una línea por instancia. Hacer Cc Cc en el bloque genera el título y el PLAZO con la fecha y se muestra perfectamente en la agenda. Funciona bien y estoy contento con los resultados. Gracias nuevamente por el consejo para usted y la lista de abogados.

ps Lo único que no funciona es el replace. Siempre se agrega al bloque # + RESULTADOS, así que tengo que eliminarlo antes de generarlo. Es menor pero no entiendo por qué.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.