Программные удаленные ссылки в электронной таблице в организационном режиме

Я веду свой бюджет в организационном режиме и доволен тем, насколько это просто. Однако простота терпит неудачу, поскольку я выполняю формулы для многих ячеек; например, моя сводная таблица за год, которая выполняет одни и те же формулы захвата и расчета для каждого месяца. В итоге я получаю огромную очередь в своем +TBLFM. Это было бы намного короче, если бы я мог программно передавать аргументы в формулу. Я ищу что-то вроде этого, но работаю:

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

В другом месте у меня есть таблица с именем SEPT, и в ней есть поле с именем «tf». Эта функция работает, если я заменю «@1» на «SEPT», но это приведет к необходимости новой записи в формуле для каждого столбца.

Есть ли способ заставить это работать, где сама таблица может указать, какую удаленную таблицу вызывать (например, SEPT в моем примере)?


person WorldsEndless    schedule 02.12.2012    source источник
comment
На мой взгляд, вы можете передавать переменные из таблиц в блоки кода org-babel, и вы можете поместить какой-нибудь elisp в TBLFM. Комбинируя их, можно добиться чего-то (я не знаю, можно ли встроить org-babel в TBLFM, звучит несколько натянуто…), но я не знаю о функции remote, которую вы вызываете как встроенную. Я хотел бы знать ответ, хотя, если вы найдете больше об этом, пожалуйста, сообщите нам. Может быть, я когда-нибудь попробую.   -  person Nikana Reklawyks    schedule 03.12.2012


Ответы (2)


Да, вы не можете сделать это со встроенным 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" напрямую, это приведет к срабатыванию механизма подстановки и будет заменено содержимым первой ячейки в этой таблице.

person kccqzy    schedule 29.03.2013

Есть уродливый хак для того же эффекта без использования remote:

1) нужна именованная переменная для удаленного адреса

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

2) вместо remote(tablename,@1$1) используется выражение elisp (из org-table.el)

(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 |
person artscan    schedule 01.01.2013