snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,167 @@
---
title: 通过工作流发送电子邮件
description: 使用工作流操作自动发送个性化电子邮件。
---
当您的 CRM 中发生特定事件时自动发送电子邮件——欢迎新联系人、跟进机会,或通知团队成员。
## 先决条件
在您可以通过工作流发送电子邮件之前:
1. 在 **Settings → Accounts** 下连接电子邮件帐户
2. 确保该帐户已启用发送权限
## 基础电子邮件工作流
### 示例:新联系人的欢迎电子邮件
**目标**:当 CRM 中添加新联系人时,发送一封欢迎电子邮件。
**设置**:
1. **创建工作流**:转到 **Settings → Workflows** 并点击 **+ New Workflow**
2. **添加触发器**:选择 **Record is Created** → **People**
3. **添加 Send Email 操作**:
* 点击 **+** 以添加一个操作
* 选择 **Send Email**
* 配置电子邮件:
| 字段 | 值 |
| ------- | -------------------------------------- |
| **收件人** | `{{trigger.object.email}}` |
| **主题** | `欢迎来到 {{Your Company Name}}` |
| **正文** | `Hi {{trigger.object.firstName}}, ...` |
4. **测试并激活**:使用示例记录进行测试,然后激活
## 在电子邮件中使用变量
使用 `{{variable}}` 语法引用前面步骤中的数据:
```text
Hi {{trigger.object.firstName}},
Thank you for connecting with us!
Your company, {{trigger.object.company.name}}, is now in our system.
Best regards,
The Team
```
### 触发器中的可用变量
| 触发类型 | 常用变量 |
| ------------- | -------------------------------------- |
| **记录已创建/已更新** | `{{trigger.object.fieldName}}` |
| **手动** | `{{trigger.selectedRecord.fieldName}}` |
| **Webhook** | `{{trigger.body.fieldName}}` |
## 高级:条件邮件
### 示例:基于线索来源发送不同邮件
**目标**:根据线索来源发送不同的欢迎邮件。
**设置**:
1. **触发器**:Record is Created(People)
2. **添加 Filter 操作**:
* 条件:`{{trigger.object.source}}` 等于 "Website"
* 如果为真 → 继续发送网站渠道的欢迎邮件
3. **其他来源的分支**:
* 为不同来源创建并行分支
* 每个分支都有其自己的 Send Email 操作
## 向多个收件人发送电子邮件
### 示例:交易达成时通知团队
**目标**:当机会赢单时,向销售代表及其经理发送电子邮件。
**设置**:
1. **触发器**:记录已更新(Opportunities,Stage = "Closed Won")
2. **搜索记录**:查找机会所有者的经理
3. **发送邮件 #1**:发送给机会所有者
* 收件人:`{{trigger.object.owner.email}}`
* 主题:`Congratulations on closing {{trigger.object.name}}!`
4. **发送邮件 #2**:发送给经理
* 收件人:`{{searchRecords.manager.email}}`
* 主题:`Deal Won: {{trigger.object.name}}`
## 定时跟进邮件
### 示例:会议后 3 天进行跟进
**目标**:在会议被记录后 3 天发送一封跟进邮件。
**设置**:
1. **触发器**:记录创建(Activities,Type = "Meeting")
2. **延迟操作**:等待 3 天
3. **发送邮件**:
* 收件人:会议参与者
* 主题:就我们的交流进行跟进
* 正文:参考触发器中的会议详细信息
## 电子邮件附件
您可以将文件附加到由工作流发送的电子邮件中。 该附件是在配置工作流时上传的静态文件。
### 如何添加附件
1. 在 **Send Email** 操作中,点击 **Attachments** 按钮
2. 点击以从您的计算机上传文件
3. 该文件将附加到此操作发送的所有电子邮件中
### 常见使用案例
| 用例 | 示例文件 |
| -------- | ----------- |
| **欢迎邮件** | 公司宣传册 (PDF) |
| **入门序列** | 入门指南 |
| **销售跟进** | 产品目录或价目表 |
| **活动确认** | 活动详情或议程 |
<Note>
附件是静态的——将向所有收件人发送相同的文件。 对于动态文档(如个性化报价),请使用 [逻辑函数](/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty) 生成并附加文件。
</Note>
## 最佳实践
### 电子邮件内容
* 保持主题行简洁且相关
* 使用收件人姓名进行个性化
* 包含明确的行动号召
* 在激活之前测试邮件
### 送达率
* 不要在短时间内发送过多电子邮件
* 使用专业的电子邮件签名
* 避免使用垃圾邮件触发词
* 确保营销邮件提供退订选项
### 故障排除
* 确认电子邮件帐户已连接且处于活动状态
* 检查收件人的电子邮件地址是否有效
* 查看工作流运行中的错误消息
* 先使用您自己的电子邮件地址进行测试
## 相关内容
* [工作流触发器](/l/zh/user-guide/workflows/capabilities/workflow-triggers)
* [工作流操作](/l/zh/user-guide/workflows/capabilities/workflow-actions)

View File

@@ -0,0 +1,88 @@
---
title: 在工作流中使用分支
description: 了解分支如何工作,以及如何控制执行哪条路径。
---
## 分支的工作方式
在工作流编辑器中,您可以从单个节点延伸出多条路径(分支)。 这使您能够构建具有不同结果的复杂自动化流程。
**重要**:当工作流运行时,默认情况下**所有分支都会并行执行**。 没有内置的 "if/else" 逻辑来在分支间做出选择——每条路径都会同时运行。
## 控制执行哪个分支
若要根据特定条件仅执行一个分支,**在每个分支的开头添加一个 Filter 节点**。
### 示例设置
1. 从单个节点创建包含多个分支的工作流
2. 在每个分支的第一步添加一个**Filter** 节点
3. 在每个 Filter 上设置条件,以确定该分支何时继续
4. 只有满足其 Filter 条件的分支会继续
### Filter 的工作方式
* 如果 Filter 条件被**满足**:该分支继续执行
* 如果 Filter 条件**未满足**:该分支会在 Filter 节点停止
这实际上创建了条件逻辑,使只有与您的数据相匹配的合适分支会运行。
## 示例:按交易金额路由
**场景**:当交易达成时,根据交易金额发送不同的通知。
1. **触发器**:Opportunity 已更新(Stage = Closed Won)
2. **分支 1**:Filter 条件:Amount > $10,000 → 向 #big-deals 发送 Slack 消息
3. **分支 2**:Filter 条件:Amount ≤ $10,000 → 向销售经理发送电子邮件
两个分支都会启动,但只有与交易金额匹配的分支会通过其 Filter 继续执行。
## 创建分支
<Note>
要从现有步骤创建新分支,请点击该步骤上的 **+** 按钮并添加您的操作。 您可以多次点击 **+** 来添加多个分支。
</Note>
1. 在工作流编辑器中,选择您想要从其分支出去的步骤
2. 点击 **+** 以添加一个操作
3. 这将创建一个分支
4. 在同一步骤上再次点击 **+** 以创建更多分支
5. 每个分支都可以拥有自己的一系列操作
## 合并分支
并行分支完成其工作后,您可以将它们合并回单一路径:
1. 完成您的分支内操作
2. 在所有分支之后添加一个应运行的新步骤
3. 将每个分支末端的连接拖拽到这个新步骤
4. 合并后的步骤会在所有连接的分支完成后才执行
### 示例:先处理后通知
```
Trigger
│
├── Branch A: Update Customer Record
│
└── Branch B: Create Support Ticket
↘ ↙
Merged Step: Send Confirmation Email
```
仅在客户更新和工单创建都完成后,才会发送确认电子邮件。
## 最佳实践
* 当您需要条件执行时,请始终在分支开始处使用**Filter 节点**
* 使分支条件**互斥**,以避免重复操作
* 使用不同数据测试您的工作流,以确保运行正确的分支
* **重命名分支步骤**,使每条路径的作用清晰明了
* **合并分支**,当您在并行处理后需要执行最终操作时
## 相关内容
* [工作流常见问题](/l/zh/user-guide/workflows/how-tos/need-more-help/workflows-faq) — 关于并行执行的解答
* [工作流操作](/l/zh/user-guide/workflows/capabilities/workflow-actions) — 分支可用的操作

View File

@@ -0,0 +1,183 @@
---
title: 使用迭代器
description: 遍历记录数组,对每个项执行操作。
---
迭代器可让你遍历记录数组,并对其中每一项执行操作。 对于需要处理由搜索记录返回或通过 Webhook 接收的多条记录的工作流,它至关重要。
## 何时使用迭代器
| 场景 | 示例 |
| ----------------- | --------------- |
| **处理搜索结果** | 向每位找到的人员发送电子邮件。 |
| **处理 Webhook 数组** | 按顺序为每个项目创建记录 |
| **批量更新** | 使用计算得出的值更新多条记录 |
| **通知** | 就某个事件通知多位人员 |
## 了解迭代器
迭代器需要一个**数组**作为输入。 然后:
1. 从数组中取出第一个元素
2. 使用该元素运行迭代器内的所有操作
3. 移动到下一个元素
4. 重复,直到所有元素处理完毕
### 选择要循环的数组
大多数数组来源(Search Records、Webhook 数组字段、Bulk manual trigger)都可以直接在变量选择器中选择。
当 **Code** 或 **Logic Function** 步骤返回一个*顶级数组*时,其输出会在变量选择器中显示为带索引的条目(`0`、`1`、`2`,…)。 若要对整个数组进行循环,请为该步骤选择 **Whole list** 选项 — Iterator 会自动从列表中推断每个项目的结构。
## 基本设置
### 示例:向搜索结果中的所有人发送电子邮件
**目标**:查找特定公司的所有联系人,并向每个人发送个性化电子邮件。
### 步骤 1:搜索记录
1. 添加 **搜索记录** 操作
2. 对象:**People**
3. 筛选条件:公司等于 "Acme Inc"
4. 这将返回一个人员数组
### 步骤 2:检查是否有结果
1. 添加 **过滤** 操作
2. 条件:`{{searchRecords.length}}` 大于 0
3. 这可防止在结果为空时出现迭代器错误
### 步骤 3:添加迭代器
1. 添加 **Iterator** 操作
2. 数组输入:选择 `{{searchRecords}}`
3. 这会创建一个循环
### 步骤 4:在迭代器内添加操作
在迭代器之后放置的操作会针对每个项运行:
1. 添加 **Send Email** 操作(在迭代器内)
2. 收件人:`{{iterator.currentItem.email}}`
3. 主题:你好,`{{iterator.currentItem.firstName}}`!
4. 正文:使用当前项字段的个性化消息
### 结果
如果 Search Records 返回 5 个人,迭代器将:
* 向第 1 个人发送电子邮件
* 向第 2 个人发送电子邮件
* ... 对全部 5 人继续执行
## 访问当前项数据
在迭代器内,使用 `{{iterator.currentItem}}` 访问当前记录:
| 变量 | 描述 |
| --------------------------------------- | ----------------- |
| `{{iterator.currentItem}}` | 整个当前记录对象 |
| `{{iterator.currentItem.id}}` | 记录 ID |
| `{{iterator.currentItem.email}}` | 电子邮件字段 |
| `{{iterator.currentItem.company.name}}` | 关联的公司名称 |
| `{{iterator.index}}` | 在数组中的当前位置(从 0 开始) |
在变量选择器中,你可以深入当前项目的特定字段,或者选择 **Use the whole item** 来引用整个当前项目(`{{iterator.currentItem}}`)。 在你希望将完整记录直接传入下游步骤,而不是逐个字段重新构建时,选择整个项目会非常方便。
## 常见模式
### 更新多条记录
**目标**:将所有逾期任务标记为 "Late"
```
1. Search Records (Tasks, Due Date < Today, Status ≠ Completed)
2. Filter (length > 0)
3. Iterator (searchRecords)
└── Update Record
- Object: Tasks
- Record: {{iterator.currentItem.id}}
- Status: Late
```
### 从数组创建记录
**目标**:Webhook 接收到包含多个项目的订单,为每个项目创建一条记录。
```
1. Webhook Trigger (receives items array)
2. Filter (items.length > 0)
3. Iterator (trigger.body.items)
└── Create Record
- Object: Order Items
- Name: {{iterator.currentItem.name}}
- Quantity: {{iterator.currentItem.qty}}
- Related Order: {{trigger.body.orderId}}
```
### 在循环内进行条件处理
**目标**:仅向电子邮件地址有效的联系人发送邮件
```
1. Search Records (People)
2. Iterator (searchRecords)
└── Filter (currentItem.email is not empty)
└── Send Email
- To: {{iterator.currentItem.email}}
```
## 故障排除
### "迭代器需要一个数组"
**原因**:你传递的是单个记录而不是数组。
**修复方法**:请确保传递的是 Search Records 的结果或数组字段,而不是单个记录。
```
✅ Correct: {{searchRecords}}
❌ Wrong: {{searchRecords[0]}}
```
### 迭代器未运行
**原因**:数组为空。
**修复方法**:在迭代器之前添加筛选条件以检查数组长度:
```
Filter: {{searchRecords.length}} > 0
```
### 操作运行次数过多
**原因**:Search Records 返回的记录数超出预期。
**修复方法**:
* 在 Search Records 中添加更具体的筛选条件
* 在 Search Records 中设置限制(最多 200)
* 在迭代器内部添加筛选条件用于附加条件
## 性能注意事项
* **额度使用**:每次迭代都会为其操作消耗额度
* **时间**:较大的数组处理时间更长
* **限制**:对于非常大的操作,考虑分批处理
* **速率限制**:大量迭代的外部 API 调用可能触发速率限制
## 最佳实践
1. **在迭代器之前始终检查数组长度**,以避免错误
2. **当并非所有项都需要处理时,在循环中添加筛选条件**
3. **重命名你的迭代器步骤**,以描述它正在遍历的内容
4. **先使用小数组进行测试**,再处理大型数据集
5. **监控工作流运行**,以确保迭代按预期完成
## 相关内容
* [工作流操作](/l/zh/user-guide/workflows/capabilities/workflow-actions)
* [如何使用分支](/l/zh/user-guide/workflows/capabilities/use-branches-in-workflows)
* [工作流常见问题](/l/zh/user-guide/workflows/how-tos/need-more-help/workflows-faq)

View File

@@ -0,0 +1,332 @@
---
title: 工作流动作
description: 了解 Twenty 工作流中可用的操作。
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
## 关于操作
动作定义触发后将发生的事件。 你可以将多个操作串联在一起,以构建复杂的自动化流程。
<Tip>
* 使用变量选择器(点击`(x+)`图标)浏览来自先前步骤的可用数据
* 将鼠标悬停在任意输入字段上即可查看变量来自哪个步骤——当相同字段(例如,ID)存在于多个先前步骤时,这很有帮助
* 为每个操作指定一个具有描述性的名称,以便于维护
</Tip>
## 记录操作
<img src="/images/user-guide/workflows/workflow_actions.png" style={{width:'100%'}} />
### 创建记录
在选定的对象中添加新记录。
**配置**:
* 选择目标对象
* 填写必填和可选字段
* 使用来自先前步骤的数据,或手动输入值来填充字段
**输出**:新创建的记录数据可在后续步骤中使用。
### 更新记录
修改选定对象中的现有记录。
<img src="/images/user-guide/workflows/update_record.png" style={{width:'100%'}} />
**配置**:
* 选择目标对象
* 选择要更新的特定记录.
* 你可以通过下拉菜单选择一个固定记录,该菜单会显示所有可用记录。
* 或者通过使用`(x+)`指定在先前步骤中找到的记录,让记录被动态选择。 此阶段无法根据不同条件搜索该记录。 如果你尚未确定该记录,请在此`Update Record`步骤之前添加一个`Search Record`步骤。
* 选择要修改的字段并输入新值
**输出**:更新后的记录数据可用于后续步骤。
### 删除记录
从选定的对象中删除记录。
**配置**:
* 选择目标对象
* 选择要删除的特定记录
**输出**:已删除的记录数据可继续用于后续步骤。
### 搜索记录
在选定对象中使用过滤条件查找记录。
**配置**:
* 选择要搜索的对象
* 设置过滤条件以缩小结果
* 配置排序和限制
**输出**:返回可在后续步骤中使用的匹配记录。
<Note>
**限制**:Search Records 最多返回 **200 条记录**。 如果需要处理更多,请添加特定筛选器以减少结果,或使用计划的工作流分批处理。
</Note>
**最佳实践**:在 Search Records 之后使用[分支](/l/zh/user-guide/workflows/capabilities/workflow-branches)来处理"找到"与"未找到"场景。
### Upsert 记录
根据匹配条件创建新记录或更新现有记录。 当你不确定记录是否已存在时,这非常有用。
<img src="/images/user-guide/workflows/upsert_double_identifier.png" style={{width:'100%'}} />
**配置**:
* 选择目标对象
* 请注意哪些字段可用于匹配:People 使用 email,Companies 使用 domain,任何对象使用 ID,或任何标记为 "Unique" 的字段。 你需要在下方至少填充其中一个。
* 填写字段值。 别忘了至少填充一个唯一标识符。
<Note>
**仅添加一个唯一标识符时,匹配通常效果更好。** 例如,下面的截图将基于其域名匹配公司。 不一定需要 ID。
</Note>
<img src="/images/user-guide/workflows/upsert_simple_identifier.png" style={{width:'100%'}} />
* 使用来自先前步骤的数据填充字段
**工作原理**:
1. 搜索与您的条件匹配的记录
2. 如果找到 → 更新现有记录
3. 如果未找到 → 创建新记录
**输出**:已创建或已更新的记录数据可用于后续步骤。
## 工作流操作
### 迭代器
**循环遍历**前一步返回的记录数组,允许你对每条记录分别执行操作。
**配置**:
* 从前一步中选择记录数组(例如,来自“搜索记录”的结果、来自具有批量可用性的手动触发、来自代码节点)。 当 Code 或逻辑函数步骤返回顶级数组时,选择其 **Whole list** 选项以遍历整个输出。
* 定义要对循环中每个记录执行的动作.
<Note>
- 你可以在迭代器中添加多个操作。
- 在迭代器中使用分支时,确保每个分支的最后一步连接回迭代器以闭合循环。
</Note>
* 访问 `Current Item` 字段:要使用当前正在处理的记录中的字段,点击 **Iterator** 步骤,然后选择 **Current item**。 将显示该记录可用字段的列表,并可选择用于后续操作。 你也可以选择 **Use the whole item**,将当前整个条目传递到下游步骤。
<VimeoEmbed videoId="1146577247" title="视频演示" />
### 过滤
根据指定条件过滤记录,仅允许满足条件的记录通过。
**配置**:
* 选择要过滤的记录
* 定义过滤条件和标准
* 配置哪些记录应通过到后续步骤
<Note>
1. **输出**:筛选器节点不返回数据——它们充当闸门。 如果满足条件,工作流将继续。 否则,工作流会在该分支停止。
2. `IS` 运算符可用于数值字段。 其作用等同于 `EQUAL`。
</Note>
### 延迟
将工作流执行暂停指定时长或直到特定日期/时间。
**延迟类型**:
| 类型 | 描述 |
| -------- | ----------------- |
| **持续时间** | 等待特定时长(天、小时、分钟、秒) |
| **计划日期** | 等待直到特定日期和时间 |
**持续时间的配置**:
* 设置天、小时、分钟和/或秒
* 组合多个单位(例如 2 天 4 小时)
**计划日期的配置**:
* 选择日期和时间
* 可以引用前一步的日期字段(例如,在会议后 3 天跟进)
**用法**:
* 在发送跟进邮件前等待 24 小时
* 暂停直到商机的关闭日期
* 将操作安排在工作时间内
<Note>
计划日期不能早于当前时间。 如果使用了前一步的日期字段且该日期已过去,工作流将失败。
</Note>
**限制与点数**:
* **无最长期限限制**——你可以设置分钟、天、周或更长的延迟
* **消耗 1 个点数**——无论持续时间如何,延迟节点执行时会消耗。
* **等待期间不消耗点数**——5 分钟的延迟与 5 天的延迟成本相同
## 通信操作
### 发送邮件
从工作流发送电子邮件。 这非常适合使用模板的群发邮件。 邮件看起来就像你从邮箱发送的邮件。
它不适合新闻简报(需要更丰富的格式)或自动化邮件序列。
**先决条件**:在“设置” → “账户”中添加电子邮件账户
**配置**:
* 选择发件邮箱账户
<Note>
你只能从与自己 Twenty 账户同步的邮箱发送邮件。 从其他团队成员的邮箱发送(例如账户所有者的邮箱)已在规划中。
</Note>
对于以下所有步骤,你可以引用前面步骤中的变量以实现个性化。
* 输入收件人电子邮件地址.
<Note>
目前只能指定一个收件人。
</Note>
* 设置主题行。
* 撰写消息内容. 你可以设置链接格式、创建编号列表、项目符号列表,并添加附件。
<Note>
目前无法添加 HTML 签名。
</Note>
### 表单
在工作流执行期间提示表单以收集用户输入。 随后可在后续步骤中使用这些响应,根据输入创建记录、发送电子邮件或执行其他任何操作。
<Warning>
**表单当前仅设计用于手动触发。** 对于具有其他触发器(记录创建、更新等)的工作流,表单仅可通过工作流运行界面访问,这不是预期的用户体验。 将于 2026 年发布通知中心,以适当支持自动化工作流中的表单。
</Warning>
**配置**:
* 配置要求用户填写的字段。 针对每个字段,选择
* 一种类型:文本、数字、日期、指定记录、选择字段。 所有对象中的字段都可供选择。
* 一个标签
* 在 `Placeholder` 下设置默认值(可选)
* 编辑表单标题
**输出**:表单响应可在后续步骤中使用。
**示例**:"Quick Lead" 工作流在所有工作区中默认可用,可在任意位置通过命令菜单 `Cmd+K` 调用。
**如何填写表单**:
* 从命令菜单 `Cmd+K` 触发你的手动工作流
* 在侧边面板中填写显示的表单并点击 `Submit`。
<Note>
这些字段无法设为必填。
</Note>
<VimeoEmbed videoId="1147277989" title="视频演示" />
## 集成操作
### 代码
在工作流中运行自定义 JavaScript。
在幕后,每个 Code 操作都由其自己的 **逻辑函数** 支持——一个在 Twenty 平台上运行的服务器端 TypeScript 函数。 当你添加 Code 操作时,Twenty 会为该步骤创建一个专用的逻辑函数,并内联显示其编辑器,因此你编写的代码与工作流共存。
**配置**:
* 访问先前步骤中的变量. 你可以动态编辑变量名称。
<VimeoEmbed videoId="1147281795" title="视频演示" />
* 在编辑器中编写 JavaScript 代码
* 返回变量以供后续步骤使用
* 直接在步骤中测试代码
<Note>
如果需要在代码中使用外部 API 密钥,必须将其直接输入到函数主体中。 你无法在其他位置配置 API 密钥并在逻辑函数中引用它们。
</Note>
<Tip>
**处理数组?** 来自外部系统或前序步骤的数组可能以字符串形式传入。 解决方案请参见 [如何在 Code 操作中处理数组](/l/zh/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)。
</Tip>
<Tip>
点击代码编辑器右上角的方形图标以全屏显示——这很有用,因为默认编辑器宽度有限。
</Tip>
#### 在多个工作流中复用逻辑函数
内联 Code 操作用于一次性逻辑非常合适,但其中的代码仅属于该单个步骤。 当你希望在多个工作流之间共享相同逻辑,或在应用中将其维护为有版本控制的源码时,应定义一个**可复用逻辑函数**,而不是在每个 Code 操作中复制粘贴代码。
逻辑函数在应用中定义一次(使用 SDK 的 `defineLogicFunction`),并通过添加 `workflowActionTriggerSettings` 暴露给工作流构建器。 安装应用后,该函数会作为独立操作出现在工作流构建器中,与内置操作并列。 选择它会渲染你声明的输入字段(带有变量选择器,与其他操作相同),并运行你的共享代码 —— 无需内联 JavaScript。
| | Code 操作 | 可复用逻辑函数 |
| ---------- | ---------------- | ------------------- |
| **代码所在位置** | 内联编辑器,绑定到单个工作流步骤 | 在应用中定义,在源码管理中进行版本控制 |
| **复用** | 按步骤复制粘贴 | 可作为操作添加到任意工作流中 |
| **输入** | 在编辑器中接入的变量 | 根据你声明的输入模式渲染出的字段 |
| **最适合** | 快速、特定于工作流的逻辑 | 在多个工作流中复用的共享逻辑 |
二者运行在同一逻辑函数运行时上,因此你在内联完成原型的 Code 操作,之后可以以最小改动升级为可复用逻辑函数。
<Tip>
有关为开发者提供的定义逻辑函数并将其暴露给工作流构建器的参考文档,请参阅 [Logic Functions](/l/zh/developers/extend/apps/logic/logic-functions) —— 尤其是 **Exposing a function as an AI tool or workflow action** 部分以及 `workflowActionTriggerSettings`。
</Tip>
### HTTP请求
作为工作流的一部分,向外部API发送请求。
<img src="/images/user-guide/workflows/http_action.png" style={{width:'100%'}} />
**配置**:
* 输入 API 端点 URL. 可以使用前面步骤中的参数。
* 选择 HTTP 方法(GET、POST、PUT、PATCH、DELETE)
* 添加必需的标头和值
* 提供示例响应以供结构预览
## AI 操作
### AI 代理 - 即将推出
在你的工作流中运行 AI 代理以执行智能任务。
**配置**:
* **代理**:选择一个现有 AI 代理或使用默认代理
* **提示**:为 AI 代理编写指令
* 在提示中引用前面步骤中的变量
**AI 代理能做什么**:
* 分析并总结数据
* 对记录进行分类或归类
* 生成文本内容
* 基于数据做出决策
* 使用工具与你的 CRM 数据交互
**输出**:AI 代理的响应可用于后续步骤。 如果代理具有结构化的输出模式,响应将遵循该格式。
<Note>
AI 代理操作会根据所用 AI 模型消耗工作流点数。 详见 [工作流点数](/l/zh/user-guide/workflows/capabilities/workflow-credits)。
</Note>
<Note>
AI 代理遵循基于角色的权限。 你可以在 **设置 → 成员 → 角色** 下为代理分配特定角色,以控制其可访问的数据。 详见 [权限](/l/zh/user-guide/permissions-access/capabilities/permissions)。
</Note>

View File

@@ -0,0 +1,66 @@
---
title: 工作流分支
description: 在你的工作流中创建并行路径和条件逻辑。
---
分支可以将你的工作流拆分为多个路径,这些路径可根据你的数据同时运行或按条件运行。
<img src="/images/user-guide/workflows/branches.png" style={{width:'100%'}} />
## 分支的工作原理
当你从单个节点创建多个连接时,每条路径都会成为一个分支。 默认情况下,**所有分支都会并行执行**——它们不会相互等待。
## 创建分支
### 添加新分支
1. **在主画布上右键单击**(在工作流中,不要在现有节点上)
2. 点击**添加节点**
3. 为你的新分支选择节点类型
4. 将箭头从上一步的底部拖到此新操作的顶部
5. 重复以上操作,从同一节点添加更多分支。
<Note>
每个分支都是独立的。 添加分支不会影响该节点的其他现有路径。
</Note>
### 可视化布局
在工作流编辑器中,分支显示为并行路径。 你可以拖动节点来重新排列可视化布局,而不会影响执行。
## 条件分支
由于默认情况下所有分支都会运行,请使用**筛选**节点来控制哪些路径实际执行:
| 分支 | 筛选条件 | 操作 |
| -- | --------- | ------ |
| A | 阶段 = "赢单" | 发送祝贺邮件 |
| B | 阶段 = "丢单" | 创建跟进任务 |
| C | 阶段 = "谈判" | 通知经理 |
1. 从你的触发器或操作创建分支
2. 在每个分支的第一步添加一个**筛选**节点
3. 为每个筛选节点配置互斥条件
4. 在每个筛选之后添加你的操作
只有满足筛选条件的分支才会继续执行。
## 合并分支
**分支不会自动合并。** 每个分支都会独立运行直至结束。 对此你有充分的灵活性:
* **选项 1:保持分支独立**
每个分支独立处理其后续操作。 当分支不需要汇合时,这是最简单的方法。
* **选项 2:手动合并分支**
在创建工作流时,你可以手动将多个分支连接到同一个下游操作。 只需将每个分支末端的箭头拖到同一个节点。
<Note>
虽然你可以使用[延迟](/l/zh/user-guide/workflows/capabilities/workflow-actions#delay)节点来暂停执行,但目前无法配置为等待"直到另一个分支结束"。
</Note>
## 相关
* [如何在工作流中使用分支](/l/zh/user-guide/workflows/capabilities/use-branches-in-workflows) - 分步指南
* [工作流操作](/l/zh/user-guide/workflows/capabilities/workflow-actions) - 可用操作(包括筛选)

View File

@@ -0,0 +1,75 @@
---
title: 工作流程积分
description: 了解工作流程积分的消耗与管理。
---
在 Twenty 中,工作流程积分为您的自动化提供支持。 了解其如何运作,有助于优化成本并有效管理您的自动化预算。
## 积分分配
工作流程积分基于您的计费周期分配,而非您的计划:
| 计费周期 | 积分 |
| -------- | -------- |
| **月度订阅** | 每月 5 积分 |
| **年度订阅** | 每年 50 积分 |
<Note>
每月 5 积分对于标准自动化而言已相当充足。 大多数团队在典型的工作流程使用中不会超出此限制。 额外积分主要用于高级 Code 操作和由 AI 驱动的工作流程。
</Note>
## 积分消耗工作原理
工作流程执行时消耗积分,而不是创建时。 每个工作流程操作根据其复杂性消耗积分:
### 按操作类型消耗积分
* **基本内部操作**:非常低的积分消耗
* 搜索记录
* 创建记录
* 更新记录
* 删除记录
* 表单操作
* **复杂操作**:更高的积分消耗
* 代码操作(JavaScript 执行)
* 向外部服务发送HTTP请求
* **AI 功能**:更高的积分消耗
* AI 代理操作会根据所用 AI 模型消耗积分
* 更复杂的提示词和更长的输出会消耗更多积分
* **延迟操作**:积分消耗极少
* Delay 节点在执行时会消耗**1 积分**
* 在等待期间**不会消耗积分**
* 5 分钟的延迟与 5 天的延迟消耗的积分相同
### 实时扣减
工作流程执行时,积分实时扣减。 这意味着:
* 草稿工作流程不消耗积分
* 仅激活并运行中的工作流程使用您的积分额度
* 失败的工作流程仍为已完成的步骤消耗积分
## 管理积分
### 检查积分使用情况
1. 前往**设置 → 结算**
2. 查看您当前的积分消耗和剩余余额
3. 监控使用模式以优化工作流程
### 购买额外的积分
如果您需要超出计划分配的更多积分:
1. 前往**设置 → 结算**
2. 点击选项以购买额外的积分。 提供不同大小的套餐。
3. 积分将添加到您当前的余额
## 最佳实践
* **批处理**:有效利用批量操作和迭代器操作,以减少单个操作的调用次数
* **手动触发优化**:对于手动触发,选择 `Bulk` 可用性以在单个工作流程运行中处理多个记录
* 优化代码操作以提高效率

View File

@@ -0,0 +1,93 @@
---
title: 工作流运行
description: 监控并管理工作流执行。
---
## 关于运行
**运行** 是一条工作流执行记录。 每当工作流被触发——无论是由记录事件、计划、手动操作还是 Webhook——都会创建一个新的运行。
## 查看运行
### 在工作流编辑器中
1. 打开你要监控的工作流
2. 单击右侧的**运行**面板
3. 查看最近的运行及其状态列表
### 在工作流运行视图中
1. 前往侧边栏中的**工作流运行**
2. 查看所有工作流的运行
3. 按状态、工作流或日期进行筛选
## 运行状态
| 状态 | 描述 |
| -------- | ------------------------------ |
| **正在运行** | 工作流当前正在执行 |
| **已完成** | 工作流已成功完成 |
| **失败** | 工作流遇到错误并已停止 |
| **等待中** | 工作流处于暂停状态(例如,等待 Delay 操作或表单提交) |
## 运行详情
单击任意运行以查看:
* **状态**:运行的当前状态
* **开始时间**:运行开始的时间
* **持续时间**:运行耗时
* **触发数据**:启动工作流的输入
* **步骤输出**:各步骤返回的数据
* **错误消息**:如果运行失败,出了什么问题
## 逐步执行
每次运行都会显示工作流中的执行过程:
1. 查看哪些步骤已成功完成
2. 确定失败发生的位置
3. 查看步骤之间传递的数据
4. 通过检查步骤的输入和输出来调试问题
## 错误处理
当运行失败时:
1. 打开失败的运行
2. 找到导致失败的步骤
3. 查看错误消息以了解详细信息
常见问题:
* 缺少必填字段
* 数据格式无效
* 外部 API 错误
* 权限问题
## 重新运行工作流
如果某次运行失败,你可以:
* 修复根本问题并等待下一次触发
* 对于手动工作流,使用相同或更新的数据再次触发
* 检查工作流逻辑以防止将来发生失败
## 性能提示
### 管理运行历史
* 运行会被保留以供历史参考
* 非常久远的运行可能会被自动归档
* 如果需要保留记录,请导出运行数据
### 监控最佳实践
* 在启用新的工作流后定期检查运行
* 审查失败的运行以识别模式
## 相关
* [工作流触发器](/l/zh/user-guide/workflows/capabilities/workflow-triggers)
* [工作流操作](/l/zh/user-guide/workflows/capabilities/workflow-actions)
* [工作流故障排除](/l/zh/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)

View File

@@ -0,0 +1,137 @@
---
title: 工作流程触发器
description: 了解可启动你的工作流的不同触发器。
---
## 关于触发器
工作流程总是从一个单一触发器开始,定义自动化运行的条件。
<img src="/images/user-guide/workflows/workflow_triggers.png" style={{width:'100%'}} />
<Tip>
**支持高级对象!** 除了标准 CRM 对象(人员、公司、商机)之外,你还可以基于以下对象触发工作流并执行操作:
* 工作区成员
* 日历事件
* 消息(电子邮件)
* 任务、备注以及许多其他系统对象
这将带来强大的自动化能力,例如在创建日历事件时通知团队成员,或自动处理收到的电子邮件。
</Tip>
## 记录已创建
当在选定的对象(人员、公司、机会或任何自定义对象)中创建新记录时,启动工作流程。
**配置**:选择要监控新记录的对象类型。
<Note>
* 此触发器对于CSV、邮箱和日历同步或 API 创建的记录非常棒。
* **不建议用于手动创建的记录**:使用此触发器,记录一创建就会启动工作流。 因为二十个用户界面在运行时自动保存(没有编辑模式,然后进行验证以保存记录), 在用户输入所有字段之前,将触发工作流。
若要在手动创建的记录上触发此工作流,建议改用触发器 `Record is created or updated`。
</Note>
## 记录已更新
当对现有记录进行更改时,启动工作流程。
**配置**:
* 选择对象类型
* 可以选择指定要监控更改的字段
## 记录已更新或创建
当在选定的对象中创建或更新记录时,启动工作流程。
**重要性**:此触发器尤其有用,因为通过不同方法创建的记录行为不同:
* **API/CSV导入**:记录立即以填充所有字段的方式创建
* **手动创建**:首先创建记录,然后在随后的更新中添加字段
**配置**:
* 选择要监控的对象类型
* 可以选择指定要监控更改的字段
* 工作流程将在初始创建和后续更新时触发
## 记录已删除
当从对象中移除记录时,启动工作流程。
**配置**:选择要监控删除的对象类型。
## 手动触发器
当由用户操作触发时启动工作流程。 此触发器可以通过 `Cmd+K` 菜单访问,或在选择记录后通过顶部导航栏中显示的自定义按钮进行访问。
<img src="/images/user-guide/workflows/add_to_newsletter_button.png" style={{width:'100%'}} />
**可用性配置**:
选择工作流程如何处理记录选择:
* **全局**:无需记录即可触发此工作流程。 工作流是从命令菜单`Cmd+K`(来自任何对象)触发的,不使用记录作为输入。
因为**单点** 和 **批量** 可用性,所选记录将传递到您的工作流。 这是为给定对象配置的,在触发工作流之前可以选择几项记录。
* **单一** :工作流将从开始到结束,因为有记录被选中。
<Note>
**软限制:100 次/分钟**。 超过该限制后,工作流将保持在 "Not Started" 状态,并会逐步处理—由后台作业处理,或在另一个工作流进入队列时处理。 这意味着你可以通过一次触发选择超过 100 条记录;只是执行会更慢。
</Note>
* **批量**:工作流程将运行一次,提供完整的记录列表作为输入。 这意味着工作流需要包含一个[迭代器操作](/l/zh/user-guide/workflows/capabilities/workflow-actions#iterator)。
<Note>
这更为高级,最适合希望优化工作流运行次数的人。
</Note>
<img src="/images/user-guide/workflows/manual_trigger.png" style={{width:'100%'}} />
**附加配置**:
* 选择目标对象(用于单个和批量可用性)
* 为工作流程触发器选择一个命令图标
* 配置导航栏位置(已固定或未固定)
**访问方法**:
* 使用 `Cmd+K` 菜单查找并启动手动工作流
* 导航栏顶部的自定义按钮(如果已配置)
## 基于时间的触发器:按计划
在您定义的重复基础上启动工作流程。
**配置**:
* 选择时间单位(分钟、小时、天)
* 输入值或使用自定义 Cron 表达式进行高级调度
<Note>
**时区**:计划的工作流在 **UTC** 下运行。 为每日计划设置时间时,请将本地时间换算为 UTC。
</Note>
## 外部触发器:Webhook
当接收到外部服务的 GET 或 POST 请求时启动工作流程。
<img src="/images/user-guide/workflows/webhook_trigger.png" style={{width:'100%'}} />
**配置**:
* 该工作流会提供唯一的 webhook URL—复制它并将其添加到你的外部系统,作为调用的端点。
* 对于 POST 请求,定义预期的正文结构,以便 Twenty 知道将接收哪些数据。 在此添加你将接收的字段,这些字段将在下方的工作流中使用。
* 配置认证(即将推出)。
## 选择合适的触发器
| 用例 | 推荐的触发器 |
| --------- | ------------ |
| 新线索需要处理 | 记录已创建 |
| 数据变更需要同步 | 记录已更新 |
| 导入/手动数据处理 | 记录已更新或创建 |
| 删除后的清理 | 记录已删除 |
| 用户发起的操作 | 手动启动 |
| 定期报告 | 计划 |
| 外部集成 | Webhook 或按计划 |

View File

@@ -0,0 +1,84 @@
---
title: 工作流版本
description: 管理工作流的版本和草稿。
---
## 关于版本
每次您激活一个工作流时,都会创建一个新版本。 这使您能够随时间跟踪更改,并在需要时恢复到先前的配置。
## 版本状态
| 状态 | 描述 |
| ------- | --------------- |
| **草稿** | 正在编辑,尚未发布 |
| **活跃** | 运行中的版本,响应触发器 |
| **已停用** | 之前为活跃状态,但已被手动停止 |
| **已归档** | 为历史记录保留的过去版本 |
## 处理草稿
当您编辑活跃的工作流时,您的更改将保存为**草稿**。 在您进行更新时,活跃版本会继续运行。
完成编辑后,您可以:
* **激活**:将草稿发布为新的活跃版本(先前的版本会被归档)
* **丢弃**:删除草稿并保留当前的活跃版本
## 版本历史
### 查看历史版本
1. 打开该工作流
2. 点击**版本**选项卡
3. 查看包含时间戳的所有先前版本
### 还原版本
1. 找到您要还原的版本
2. 点击**用作草稿**
3. 该版本会被复制为一个新的草稿
4. 进行任何必要的更新
5. 准备就绪后激活
## 最佳实践
### 版本管理
* 仅在准备好用于生产环境时再激活
* 在各版本之间仅保留有意义的更改
* 记录工作流名称或描述中的重大更改
* 在激活前先在草稿模式下进行测试
### 还原更改
* 如果新版本引发问题,请还原到上一版本
* 使用版本历史来跟踪发生了哪些更改
* 在激活之前务必测试已还原的版本
## 常见工作流
### 快速编辑
1. 对活跃的工作流进行小幅更改
2. 在草稿模式下测试
3. 激活新版本
### 重大修订
1. 以先前版本为起点
2. 在草稿中进行重大更改
3. 全面测试所有场景
4. 确认无误后再激活
### 回滚
1. 找出现有版本的问题
2. 在历史记录中找到最后一个可用的版本
3. 点击**用作草稿**
4. 激活以恢复原有行为
## 相关内容
* [工作流入门](/l/zh/user-guide/workflows/overview)
* [工作流运行](/l/zh/user-guide/workflows/capabilities/workflow-runs)