联系人左右合并的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());
}

减少重复的代码和嵌套的层级

  1. uniqueContactsMap:用于存储去重后的联系人。

  1. addContact:一个辅助函数,用于将单个联系人添加到 uniqueContactsMap 中。

  1. flattenAndAdd:一个递归函数,用于展平数组并调用 addContact 添加联系人。

  1. contactsGroups.forEach(flattenAndAdd):开始递归处理 contactsGroups

多个记录遍历合并

选择合并

入参合并2种方案

方法一:直接遍历入参的记录ID
方法二:先取出所有数据记录,再筛选ID
🔔
2种方案解析

2种方案解析

性能和资源利用
  • 方法一:每次遍历都调用 Application.Record.GetRecord,这可能导致多次网络请求或数据库查询,特别是当 行id_rid 数组很大时,性能可能会受到影响。

  • 方法二:首先获取表中所有记录,然后在内存中进行筛选。这种方法减少了网络请求或数据库查询的次数,但可能会增加内存使用量,特别是当表中记录非常多时。

代码复杂性和可维护性
  • 方法一:代码结构简单,逻辑清晰,易于理解和维护。

  • 方法二:代码稍微复杂一些,因为需要先获取所有记录,然后再进行筛选。但这种方法在处理大量数据时可能更高效。

推荐方案
  • 如果表中的记录数量不多,推荐使用 方法一,因为它代码简单,易于维护。

  • 如果表中的记录数量非常多,推荐使用 方法二,因为它可以减少网络请求或数据库查询的次数,提高性能。

最终选择哪种方法取决于你的具体应用场景和性能要求。如果你对性能有较高要求,并且表中的记录数量较多,建议使用 方法二。如果表中的记录数量不多,使用 方法一 更为简单直接。

辽宁省
浏览 121
收藏
1
分享
1 +1
1
+1
全部评论 1
 
陈波
陈波

@金山办公

厉害啦
· 广东省
回复