Salesforce Admin:如何实现指定Public Group仅查看Experience超2年的Teacher?
解决方案
方案一:新增字段同步公式值(可行且常用)
这是最直接的解决办法,核心是把公式字段的实时计算值固化到一个可被共享规则识别的字段中:
- 创建一个数字类型字段(比如命名为
Experience_Year__c),用来存储计算后的经验年限。 - 用触发器或流程同步值:
- 触发器实现(适合开发人员):在Teacher对象的
before insert和before update事件中,复刻公式字段的计算逻辑,把结果赋值给新字段。示例代码:trigger TeacherTrigger on Teacher__c (before insert, before update) { for(Teacher__c t : Trigger.new) { if(t.DateofJoining__c != null) { Integer years = Date.today().year() - t.DateofJoining__c.year(); // 处理未到周年的情况(比如入职2022-10-01,今天2024-09-01,实际不满2年) if(t.DateofJoining__c.addYears(years) > Date.today()) { years--; } t.Experience_Year__c = years; } else { t.Experience_Year__c = 0; } } } - 流程实现(适合非开发人员):创建记录触发流程,当Teacher记录插入或更新时,用公式
FLOOR((TODAY() - DateofJoining__c)/365)(或更精确的年限计算逻辑)算出经验值,赋值给新字段。
- 触发器实现(适合开发人员):在Teacher对象的
- 配置字段级安全,确保相关用户能看到这个新字段。
- 最后创建基于条件的共享规则:筛选
Experience_Year__c > 2,给目标Public Group分配只读权限。
方案二:自定义权限+Apex共享(无需新增字段)
如果不想新增字段,可以通过代码动态控制共享:
- 创建一个自定义权限(比如
View_Experienced_Teachers),给目标Public Group的所有用户分配这个权限。 - 编写Apex共享触发器,在Teacher记录插入、更新时,判断经验年限是否大于2年,给拥有自定义权限的用户添加共享记录:
注意:如果目标用户数量较多,需要注意批量处理的DML限制,必要时分批执行。trigger TeacherShareTrigger on Teacher__c (after insert, after update) { List<Teacher__Share> shareList = new List<Teacher__Share>(); // 获取拥有目标自定义权限的用户ID Set<Id> eligibleUserIds = new Set<Id>(); for(User u : [SELECT Id FROM User WHERE IsActive = true AND PermissionSetAssignment.PermissionSet.CustomPermissions.DeveloperName = 'View_Experienced_Teachers']) { eligibleUserIds.add(u.Id); } for(Teacher__c t : Trigger.new) { // 计算经验年限,和原公式字段逻辑保持一致 Integer experienceYears = 0; if(t.DateofJoining__c != null) { experienceYears = Date.today().year() - t.DateofJoining__c.year(); if(t.DateofJoining__c.addYears(experienceYears) > Date.today()) { experienceYears--; } } if(experienceYears > 2) { // 给符合条件的用户添加只读共享 for(Id userId : eligibleUserIds) { Teacher__Share ts = new Teacher__Share(); ts.ParentId = t.Id; ts.UserOrGroupId = userId; ts.AccessLevel = 'Read'; ts.RowCause = Schema.Teacher__Share.RowCause.Manual; shareList.add(ts); } } else { // 移除已有的共享记录(如果之前添加过) delete [SELECT Id FROM Teacher__Share WHERE ParentId = t.Id AND UserOrGroupId IN :eligibleUserIds]; } } if(!shareList.isEmpty()) { insert shareList; } }
方案三:报表文件夹共享(仅报表查看场景)
如果用户只需要通过报表查看符合条件的记录,不需要直接访问对象列表:
- 创建一个报表,用原Experience公式字段做筛选(报表支持公式字段筛选),只显示经验大于2年的Teacher记录。
- 创建报表文件夹,将该报表移入,然后给目标Public Group分配该文件夹的查看权限。
局限性:用户只能通过报表查看,无法在Teacher对象列表中直接看到这些记录。
内容的提问来源于stack exchange,提问作者Lavanya Pushpakar
相关产品推荐
相关产品推荐

