Skip to content

Table — append a comment ​

Appends timestamped text at the bottom of a cell, never overwriting what it holds. One action = one comment.

Appends a line of text at the bottom of a cell of a Table, without ever overwriting what the cell already holds. It keeps a per-case history: one action, one comment. To set a value that replaces the previous one (a status, a date), use Table — update a row or Table — insert or update instead.

At a glance ​

  • Type: table.append_text · version 1
  • Category: Actions
  • Kind: Step — one stage of a run
  • Effect: Writes outside (external_write) — writes outside Mankomail; described instead of performed during a test run
  • Needs a carrier email: No
  • Connection: None
  • Inputs: main
  • Outputs: main

Parameters ​

table ​

Table — Picked from the list, or by its short identifier (its “slug”), which may come from a template.

  • Type: Remote resource (resourceLocator)
  • Required: Yes
  • Ways to choose: pick from a list, type an ID (table)

key ​

Row key — The row to comment on, designated by the values of its “key” columns.

  • Type: List of items (collection)
  • Required: Yes
  • Default: []
  • At most 8 items
  • Each item has:
    • column — Key column
      • Type: Text (string)
      • Required: Yes
      • Default: "" (empty)
      • 60 characters at most
      • Expressions: {{ }} not accepted
    • value — Value to match
      • Type: Text (string)
      • Required: No
      • Default: "" (empty)
      • 10000 characters at most

column ​

Column to append to — A text column. What it already holds is never replaced.

  • Type: Text (string)
  • Required: Yes
  • Default: "" (empty)
  • 60 characters at most
  • Expressions: {{ }} not accepted

text ​

Text to append — One line per action. Write what happened, not the resulting state — the state has its own column.

  • Type: Long text (text)
  • Required: Yes
  • Default: "" (empty)
  • 4000 characters at most
  • Expressions: {{ }} accepted

withTimestamp ​

Prefix with date and time — The date is written in a short universal format (2026-04-03 14:30), not in the member’s language: a cell is read by different people and exported as is.

  • Type: Yes / no (boolean)
  • Required: No
  • Default: true

createIfMissing ​

Create the row if it does not exist — Handy for a per-case log: the first comment creates the row.

  • Type: Yes / no (boolean)
  • Required: No
  • Default: true

Outputs ​

  • main

Data produced ​

What this node adds to the run data, and how to read it in an expression. <step> stands for the step key: the node name turned into an identifier (see Data and expressions).

  • {{ data.<step>.rowId }} — string. The identifier of the row commented on. In a test run, when the row would be created: simulated:<table identifier>.
  • {{ data.<step>.row.<column> }} — object. The whole row after the write, by column machine key; the appended column holds the full log, new entry last.
  • {{ data.<step>.created }} — boolean. true when the row did not exist and was created by this comment.
  • {{ data.<step>.reused }} — boolean. true when the step was replayed after an incident: the comment had already been added and was not added again.
  • {{ data.<step>.simulated }} — boolean. true in a test run: nothing was written.
  • {{ data.<step>.summary }} — string. A one-line summary: Comment added., Would have added the comment. or Comment already added on an earlier attempt.

Example ​

Each time a workflow chases a client, it logs the action in the history column of the table cases (key column case_number). The node is named "Log reminder".

text
table            cases
key              case_number = {{ data.read_case.case_number }}
column           history
text             Reminder sent to {{ data.read_case.client_email }}
withTimestamp    on
createIfMissing  on

After two runs, the cell reads:

text
2026-04-03 14:30 — Reminder sent to ada@example.com
2026-04-10 09:05 — Reminder sent to ada@example.com

Tips ​

  • Nothing is ever replaced. The new entry goes on a new line below the existing content. Write what happened, not the resulting state — the state belongs in its own column.
  • Timestamp. With Prefix with date and time on, each entry starts with YYYY-MM-DD HH:MM — . The time is in UTC and the format does not depend on the member's language, so the cell sorts and exports cleanly.
  • Creating the row. With Create the row if it does not exist on (the default), the first comment creates the row with its key values. Off, a missing row fails the step with table.row_not_found.
  • The column is named by its machine key and should be a Text column. An unknown column fails with table.unknown_column.
  • Cell size. The whole log counts toward the cell limit (4,000 characters by default, set by the instance administrator). Once a log reaches it, further comments fail with table.invalid_value.
  • Empty text. If the text is empty once expressions are resolved, the step fails rather than adding a line with a date only.
  • Replays never add twice. The comment is recorded with the step's idempotency key: a replay after an incident returns the row already written (reused: true) instead of adding the same comment again.
  • Key lookup ignores case, accents and punctuation, and relies on the table option Refuse two rows with the same key.
  • Test runs. Nothing is written. The row is really looked up, and the step returns it as it would be with the comment appended, with simulated: true. See Test runs.