使用Apex移动ListEmail子类型Task至其他联系人时触发异常的问题
解决Task更新WhoId时出现的FIELD_INTEGRITY_EXCEPTION错误
看起来你在处理ListEmail生成的Task时遇到了一个棘手的问题——更新WhoId(联系人关联)时触发了WhatId的类型错误。让我们一步步拆解问题,找到解决办法:
错误原因分析
这个错误FIELD_INTEGRITY_EXCEPTION, Related To ID: id value of incorrect type: 0XB1N000000XaCuWAK: [WhatId]的核心点在于:
- 你操作的Task的
WhatId字段关联了一个ListEmail记录(ID前缀0XB是ListEmail对象的标准前缀) - 当你尝试修改
WhoId时,Salesforce会重新验证Task的关联完整性,而ListEmail生成的Task通常带有特殊的绑定规则,不允许随意修改关联的WhoId或WhatId;或者你的代码中不小心误修改了WhatId的值(比如笔误把新联系人ID赋值给了WhatId而非WhoId)
排查与解决方案
1. 先检查代码是否存在笔误
首先确认你的更新逻辑里只修改了WhoId,没有碰WhatId。比如你的代码应该是这样的:
// 正确的更新逻辑 for(Task t : task) { t.WhoId = newContactId; // 确保这里是WhoId,不是WhatId } update task;
如果不小心写成了t.WhatId = newContactId,就会直接触发这个类型错误,因为联系人ID(前缀003)和ListEmailID(前缀0XB)类型不匹配。
2. 处理ListEmail生成的Task的特殊限制
ListEmail自动创建的Task属于系统关联的记录,这类Task通常被限制修改WhoId或WhatId,因为它们和邮件发送行为强绑定。如果必须将Task关联到新联系人,建议采用创建新Task+删除原Task的方式:
List<Task> tasksToCreate = new List<Task>(); List<Task> tasksToDelete = new List<Task>(); for(Task originalTask : task) { // 复制原Task的所有字段 Task newTask = new Task(); newTask.Subject = originalTask.Subject; newTask.WhoId = newContactId; // 设置新的联系人ID newTask.WhatId = originalTask.WhatId; // 保留原ListEmail关联(如果允许) newTask.RecordTypeId = originalTask.RecordTypeId; newTask.TaskSubtype = originalTask.TaskSubtype; // 复制其他需要保留的字段... tasksToCreate.add(newTask); tasksToDelete.add(originalTask); } // 先插入新Task,再删除原Task insert tasksToCreate; delete tasksToDelete;
3. 检查RecordType的字段约束
如果上述方法不行,检查该Task对应的RecordType是否对WhatId有对象类型限制:
- 进入Setup → Object Manager → Task → Record Types
- 找到对应的RecordType,查看其“Page Layout”中的
WhatId(Related To)字段是否被设置为只能关联特定对象 - 如果ListEmail不在允许的关联对象列表中,也可能导致更新时的验证错误
内容的提问来源于stack exchange,提问作者shzad
相关产品推荐
相关产品推荐

