联系人左右合并的3种方案(区分单、多记录,支持字段:多类型)
社区字数所限,详细文档:联系人左右合并的3种方案(区分单、多记录)
可以应用到新增联系人、任意多个字段合并
单个记录合并
第1种,2个函数
第2种,合并函数
// 定义需要处理的字段配置
const fieldsConfig = {
"联系人账户": "联系人账户",
"触发人": "触发人"
// 可以在这里添加更多字段,例如:
// "创建人": "创建人",
// "最后修改人": "最后修改人",
// "引用人": "引用人"
};
let 行id = Context.argv.id, 表id = Context.argv.sheetId; //自动化触发
if (行id === undefined && 表id === undefined) { //手动定位行
表id = Application.Selection.GetActiveSheet().sheetId; //视图
let selectedRecords = Application.Selection.GetSelectionRecords()
if (selectedRecords.length > 0) {
行id = Application.Selection.GetSelectionRecords()[0][0].id; //测试的时候修改
} else {
console.error("没有选中的记录");
};
}
// let 行id = Context.argv.rid[0], 表id = Context.argv.sid[0]; //自动化入参
let records_perm = Application.Record.GetRecord({ SheetId: 表id, RecordId: 行id });
// 根据配置生成 fields_Array
let fields_Array = Object.keys(fieldsConfig).map(key => records_perm.fields[key]);
let combinedContacts = flattenAndCombineContact([fields_Array]);
Application.Record.UpdateRecords({
SheetId: 表id,
Records: [{ id: 行id, fields: { "联系人账户": combinedContacts } }],//也可以是其他任意联系人账号
});
// 合并联系人
function flattenAndCombineContact(contactsGroups) {
// 使用 Map 来去重
const uniqueContactsMap = new Map();
// 确保 contactsGroups 是数组,如果不是,则返回空数组
if (!Array.isArray(contactsGroups)) return [];
contactsGroups.forEach(group => {
// 如果 group 是数组,则递归展平;如果不是数组但有值,则直接处理
if (Array.isArray(group)) {
group.forEach(val => {
// 如果 val 是数组,则递归展平;如果不是数组但有值,则添加到 Map
if (Array.isArray(val)) {
val.forEach(contact => {
if (contact && contact.id) {
uniqueContactsMap.set(contact.id, contact);
}
});
} else if (val !== null && val !== undefined && val && val.id) {
uniqueContactsMap.set(val.id, val);
}
});
} else if (group !== null && group !== undefined && group && group.id) {
uniqueContactsMap.set(group.id, group);
}
});
// 返回去重后的联系人数组
return Array.from(uniqueContactsMap.values());
}
第3种,简化函数
// 定义需要处理的字段配置
const fieldsConfig = {
"联系人账户": "联系人账户",
"触发人": "触发人"
// 可以在这里添加更多字段,例如:
// "创建人": "创建人",
// "最后修改人": "最后修改人",
// "引用人": "引用人"
};
let 行id = Context.argv.id, 表id = Context.argv.sheetId; //自动化触发
if (行id === undefined && 表id === undefined) { //手动定位行
表id = Application.Selection.GetActiveSheet().sheetId; //视图
let selectedRecords = Application.Selection.GetSelectionRecords()
if (selectedRecords.length > 0) {
行id = Application.Selection.GetSelectionRecords()[0][0].id; //测试的时候修改
} else {
console.error("没有选中的记录");
};
}
// let 行id = Context.argv.rid[0], 表id = Context.argv.sid[0]; //自动化入参
let records_perm = Application.Record.GetRecord({ SheetId: 表id, RecordId: 行id });
// 根据配置生成 fields_Array
let fields_Array = Object.keys(fieldsConfig).map(key => records_perm.fields[key]);
let combinedContacts = flattenAndCombineContact([fields_Array]);
Application.Record.UpdateRecords({
SheetId: 表id,
Records: [{ id: 行id, fields: { "联系人账户": combinedContacts } }],//也可以是其他任意联系人账号
});
// 合并联系人
function flattenAndCombineContact(contactsGroups) {
// 使用 Map 来去重
const uniqueContactsMap = new Map();
// 确保 contactsGroups 是数组,如果不是,则返回空数组
if (!Array.isArray(contactsGroups)) return [];
// 递归函数来展平并添加到 Map
function addContact(contact) {
if (contact && contact.id) {
uniqueContactsMap.set(contact.id, contact);
}
}
function flattenAndAdd(group) {
if (Array.isArray(group)) {
group.forEach(flattenAndAdd); // 递归处理数组
} else if (group !== null && group !== undefined) {
addContact(group); // 添加单个联系人
}
}
// 开始递归处理 contactsGroups
contactsGroups.forEach(flattenAndAdd);
// 返回去重后的联系人数组
return Array.from(uniqueContactsMap.values());
}
减少重复的代码和嵌套的层级
uniqueContactsMap:用于存储去重后的联系人。
addContact:一个辅助函数,用于将单个联系人添加到 uniqueContactsMap 中。
flattenAndAdd:一个递归函数,用于展平数组并调用 addContact 添加联系人。
contactsGroups.forEach(flattenAndAdd):开始递归处理 contactsGroups。
多个记录遍历合并
选择合并
入参合并2种方案
方法一:直接遍历入参的记录ID
方法二:先取出所有数据记录,再筛选ID
🔔 | 2种方案解析 |
2种方案解析
性能和资源利用
方法一:每次遍历都调用 Application.Record.GetRecord,这可能导致多次网络请求或数据库查询,特别是当 行id_rid 数组很大时,性能可能会受到影响。
方法二:首先获取表中所有记录,然后在内存中进行筛选。这种方法减少了网络请求或数据库查询的次数,但可能会增加内存使用量,特别是当表中记录非常多时。
代码复杂性和可维护性
方法一:代码结构简单,逻辑清晰,易于理解和维护。
方法二:代码稍微复杂一些,因为需要先获取所有记录,然后再进行筛选。但这种方法在处理大量数据时可能更高效。
推荐方案
如果表中的记录数量不多,推荐使用 方法一,因为它代码简单,易于维护。
如果表中的记录数量非常多,推荐使用 方法二,因为它可以减少网络请求或数据库查询的次数,提高性能。
最终选择哪种方法取决于你的具体应用场景和性能要求。如果你对性能有较高要求,并且表中的记录数量较多,建议使用 方法二。如果表中的记录数量不多,使用 方法一 更为简单直接。
@金山办公