Org mode电子表格编程远程引用

7

我将我的预算记录在 org-mode 中,发现这个软件非常简单易用。但是,当我需要对许多单元格执行公式计算时,这种简单易用的方式就不再有效了;比如说,我需要为每个月进行抓取和计算,生成年度总结表格。结果,在我的 +TBLFM 中会出现一条巨大的计算公式。如果能够通过编程来传递参数到公式中,那么这条公式就能够变得更加简洁明了。我正在寻找类似这样的方法:

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

我在其他地方有一个名为SEPT的表,它有一个名为"tf"的字段。如果我用"SEPT"替换"@1",这个函数就可以起作用,但这样会导致我需要为每一列添加一个新条目。

是否有一种方法可以使表本身指定要调用的远程表(例如我的示例中的SEPT),从而使此功能正常工作?


仅凭我的经验,你可以将变量从表格传递到org-babel代码块,并且你可能能够在TBLFM中放置一些elisp。结合这些可能会实现某些功能(我不知道是否可以内联org-babel在TBLFM中,听起来有点牵强……),但我不知道你调用的“remote”函数是否是内置的。如果你找到更多信息,请告诉我们答案。也许有一天我会尝试一下。 - Nikana Reklawyks
2个回答

8

是的,您不能使用内置的 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",它会触发替换机制并被替换为表格中第一个单元格的内容。

3

有一种不使用remote的丑陋方法可以实现同样的效果:

1)需要为远程地址命名变量。

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

2) 它使用 org-table.el 中的 elisp 表达式而不是 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 |

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接