核心原因:
当 Zoho CRM 触发"删除后 (On Delete)"的工作流时,数据库中的那条记录确实已经消失了。因此,任何在 Deluge 脚本中尝试使用 zoho.crm.getRecordById() 去查这条记录的操作都会返回 null 或报错。
解决方案:不要"去查",而是"带着走"。
你必须在配置工作流和函数关联的时候,通过 "编辑参数 (Edit Arguments)" 将你需要的数据直接传给函数,而不是在函数内部去查询。
以下是具体操作步骤:
方法一:利用函数参数映射(适用于主模块字段)
这是最标准的方法。虽然记录被删除了,但在工作流触发的那一毫秒,系统内存中还保留着该记录"临终前"的数据。
-
进入设置:工作流规则 -> 选择触发器为"记录删除 (On Delete)"。
-
关联函数:在动作中选择你的 Deluge 函数。
-
关键步骤 - 编辑参数 (Edit Arguments):
- 在函数配置弹窗中,点击 "编辑参数"。
- 这是你唯一获取数据的机会。
- 定义键名(例如
deleted_subject),按 # 键选择该模块的字段(例如主题)。 - 把你所有需要用到的字段全部映射一遍。
-
Deluge 代码写法:
错误写法 ❌:javascript// 在删除触发中,这绝对查不到数据 rec = zoho.crm.getRecordById("Quotes", quote_id); name = rec.get("Subject");正确写法 ✅:
(假设你在参数映射里已经把
Subject映射给了变量arg_subject)javascript// 直接使用映射进来的变量,不需要查库 info "被删除的记录主题是: " + arg_subject; // 你可以在这里直接把 arg_subject 发送给外部 API
方法二:应对"子表/相关列表"数据(快照法)
痛点: 方法一只能映射主模块的字段(如金额、名称、所有者)。如果你需要获取 "被删除记录底下的子表数据(如报价单里的产品明细)",方法一是不行的,因为参数映射不支持映射整个子表 List。
这时候就必须结合我们之前讨论过的 "快照 (Snapshot)" 方案:
-
前期准备:
在主模块建一个隐藏的长文本字段(例如
JSON_Backup)。 -
保存时备份:
写一个"创建/编辑"时触发的脚本,每次记录保存时,把子表数据转成 JSON 字符串,存入
JSON_Backup字段。 -
删除时获取:
在"删除后"的脚本中,使用 方法一 映射
JSON_Backup这个字段到变量。 -
解析:
代码如下:
javascript// 假设 arg_json_backup 是通过参数映射传进来的长文本 if(arg_json_backup != null && arg_json_backup != "") { // 还原之前保存的子表数据 subform_list = arg_json_backup.toList(); // 现在你可以遍历这个列表,知道删除了哪些详细产品了 for each item in subform_list { // ... } }
总结
- 主字段数据 (如 ID、Name、Total):在工作流配置页面通过 参数映射 (Key-Value Mapping) 直接传进去。
- 复杂数据 (子表、多选列表):必须在删除发生之前(即创建/编辑时),先备份到一个文本字段里,然后删除时读取那个文本字段。