スプレッドシートからの組織の日付


7

私はこうして日付を計算することができます:

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

しかし、私がやりたいのは、その日付を次のようなアジェンダ日付として表示することです。

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

しかし、それはうまくいきません。議題のエントリに文字通りの日付以外のすべてを許可する構文、マクロを見つけることができません。

何か案は?


タイムスタンプを実際のものとは異なるものに見せるために使用されるオーバーレイ関数があります。その機能を微調整して独自のフォーマットにオーバーレイするのがおそらく最も簡単でしょう-オーバーレイの下には、さまざまな機能で使用される標準のタイムスタンプorg-modeがあり、簡単に変更することはできません(私の意見では)-さえありますdoc-stringで、タイムスタンプ変数を調整しないようにアドバイスしていることに注意してください。
弁護士リスト2014

org-time-stamp-formatsで定義された変数ですorg.el。その値は次の("<%Y-%m-%d %a>" . "<%Y-%m-%d %a %H:%M>")とおりです。この変数は、ファイルローカル変数として使用すると危険な場合があります。ドキュメンテーション:format-time-stringタイムスタンプに使用されるフォーマット。 この定数を変更することはお勧めしません。 カスタムタイムスタンプの形式も参照してください: orgmode.org/manual/Custom-time-format.html#Custom-time-format
lawlist 2014

正しく説明しなかったと思います。タイムスタンプの外観を変更するつもりはありません。通常の<%Y-%m-%d%a>形式で問題ありません。最後に、「DEADLINE:<2015-01-13 Tue>」に相当しますが、自分で入力するのではなく、計算されたスプレッドシートから取得したいと思います。その情報を転送する方法はありますか?または、「DEADLINE:」の後に何かを提供する別の方法はありますか(おそらくelisp、日付を計算できる場所など)、日付として解釈されますか?
jtgd 2014

答えはありませんが、いくつかのアイデアを捨てたいと思います。一般に、org-agendaバッファーは、未加工のorg-agenda-filesからのかなりのコピーと貼り付けにすぎません。最近のスレッドで、org-agenda-filesを逆方向にスクロールし、各エントリの見出しで停止して、タイムスタンプを、ADのx日であるかのように処理して、さらに計算を行います(たとえば、何かが原因かどうか)今日、または延期)。 emacs.stackexchange.com/a/5700/2287 理論的には、各見出しで停止して計算を行い、カスタムアジェンダバッファーを生成できます。これは重要なことですが、興味深いものです。
法律家、2014

回答法学者に感謝します。リテラル文字列を入力する以外に、アジェンダに日付を入れる方法が必要だと思いました。多分私は議題が生成されているときに使用される関数を掘り下げることができます。関数の出力を再スキャンする「eval」関数のようなものがあればいいのにと思います。
jtgd 2014

回答:


4

これを試して:

スプレッドシートテーブル)で期限を計算します

#+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

関数を使用して、最初のテーブルから計算された期限を参照する新しい1x1テーブルを作成しremote(NAME-OR-ID,REF)ます。

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

1x1デッドラインテーブルをヘッダー :var name=valueを介して変数として名前付きSRC ブロックに渡します(例:以下のset_deadline elispコードブロック)。

#+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

を使用してSRCブロックを評価するC-c C-cと、#+RESULTS:ブロックの下のorg-modeファイルに期限が追加されます。

:results raw ヘッダーをコードブロックに追加すると、出力がorg-modeで通常のorgステートメントとして認識される形式に強制されます。

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

追加のボーナスとして、名前付きsrcブロックを使用すると、インライン関数呼び出しによるコードの再利用も促進されます。

以前と同様に、各インライン関数を使用して評価するC-c C-cと、新しい期限がorg-modeファイルに追加されます。

#+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>

お役に立てば幸いです。

注:このコードは、以下のバージョンのemacsおよび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、この回答は役に立ちましたか?
Melioratus 14

はい、とても。下記参照。
jtgd

@jtgd ありがとうございます!あなたは私の日を作りました!replace期待どおりに動作しないことについては、rawヘッダーをdrawerヘッダーで更新してみてください。切り替えた後、すべてが期待どおりに機能しました。お役に立てば幸いです。質問とelispコードをお寄せいただきありがとうございます。
Melioratus、2015年

@jtgd- eLisp、Perl、bash、Python、Rubyで記述された小さなコードブロックを使用して、テキストをチェックボックスのリストに変換する別の例を投稿しました。
Melioratus、2015年

ああ、またありがとう!drawer事は今完璧に動作します。組織モードについて学ぶことがたくさんあるので、あなたのようなウィザードがいるのは素晴らしいことです。あなたが投稿した他の例については、私が試してみましたが、raw追加せずに動作します。しかし、私のアプリケーションは動作するので、私は満足しています。
jtgd 2015年

1

Melioratusに感謝します。すばらしい答えです。Orgモードのさまざまなメカニズムを使用してこれを行う方法は驚くべきことです。私にとってこれの最も重要な部分は:results raw、議題作成によって再スキャンされる出力テキストでした。それが鍵でした。

これをどのように拡張して多くの日付を処理できるかを調べたとき、elispで日付の計算を実行できないのではないかと思いました。私はまだelispに非常に慣れていませんが、少しハッキングしてこれを思いつきました。

私のタスクは、ボトルを開始した日に30日を追加することで、薬がなくなる日を計算することです。私がしたことはこれでした。

私の.emacsでいくつかの関数を書きました:

(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))))

私はこれらの関数を汎用的なものにしようとし、再利用性のために薬物に焦点を当てないようにしました。私が初心者だと言ったように、これを行うにはもっと良い方法があるかもしれません。

次に、私の.orgファイルでこれを行います:

#+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

素敵で端正な、インスタンスごとに1行。ブロックでCc Ccを実行すると、見出しとデッドラインが日付とともに生成され、アジェンダに完全に表示されます。それはうまく機能し、結果に満足しています。あなたと法律家への助言をありがとう。

ps機能しないのは、だけですreplace。常に#+ RESULTSブロックに追加されるため、生成する前に削除する必要があります。それはマイナーですが、理由はわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.