组织模式电子表格程序化远程引用

Wor*_*ess 6 emacs remoteobject spreadsheet org-mode

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

| SEPT   |
| #ERROR |
#+TBLFM: @2$1=remote(@1,$tf)
Run Code Online (Sandbox Code Playgroud)

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

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

kcc*_*qzy 6

是的,您不能使用内置功能执行此操作,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 |
Run Code Online (Sandbox Code Playgroud)

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


art*_*can 3

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

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

(setq eab/test-remote "@1$1")
Run Code Online (Sandbox Code Playgroud)

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))))
Run Code Online (Sandbox Code Playgroud)

3)工作示例

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

#+TBLNAME: testname1
|    1 |

#+TBLNAME: testname2
|    2 |
Run Code Online (Sandbox Code Playgroud)

4)结果

| testname1 | testname2 |
|-----------+-----------|
|         1 |         2 |
Run Code Online (Sandbox Code Playgroud)