7

我将预算保持在 org 模式,并且对它的简单性感到满意。然而,简单性失败了,因为我在许多单元格上执行公式;例如,我的年度汇总表每个月执行相同的抓取和计算公式。我最终在我的 +TBLFM 中有一条大线。如果我可以以编程方式将参数传递给公式,这将大大缩短。我正在寻找这样的东西,但工作:

| SEPT   |
| #ERROR |
#+TBLFM: @2$1=remote(@1,$tf)

在其他地方,我有一个名为 SEPT 的表,它有一个名为“tf”的字段。如果我将“@1”替换为“SEPT”,则此函数有效,但这会导致我需要在公式中为每一列添加一个新条目。

有没有办法让这个工作,表本身可以指定要调用的远程表(例如我的示例中的 SEPT)?

4

2 回答 2

7

是的,你不能用内置的来做到这一点,remote你需要使用org-table-get-remote-range. 希望这比artscan给出的答案更适合您的需求(我使用了他/她的示例):

| testname1 | testname2 |
|-----------+-----------|
|         1 |         2 |
#+TBLFM: @2='(org-table-get-remote-range @<$0 (string ?@ ?1 ?$ ?1))

#+TBLNAME: testname1
|    1 |

#+TBLNAME: testname2
|    2 |

注意(string ?@ ?1 ?$ ?1): 这是必要的,因为在评估表格公式之前,所有替换都将首先完成。如果"@1$1"直接使用,则会触发替换机制,并被表中第一个单元格的内容替换。

于 2013-03-29T08:51:11.133 回答
3

在不使用的情况下,有一些丑陋的黑客可以达到相同的效果remote

1)它需要远程地址的命名变量

(setq eab/test-remote "@1$1")

2) 它使用 elisp 表达式(来自 org-table.el)代替remote(tablename,@1$1)

(defun eab/test-remote (x)
  `(car (read
     (org-table-make-reference
      (org-table-get-remote-range ,x eab/test-remote)
      't 't nil))))

3)工作示例

| testname1 | testname2 |
|-----------+-----------|
|           |           |
#+TBLFM: @2='(eval (eab/test-remote @1))

#+TBLNAME: testname1
|    1 |

#+TBLNAME: testname2
|    2 |

4) 结果

| testname1 | testname2 |
|-----------+-----------|
|         1 |         2 |
于 2013-01-01T06:02:44.317 回答