Zoho Deluge实现Splynx与Zoho CRM列表匹配及ID同步
需求可行性确认
该需求完全可实现,不需要重新导入已有的Splynx联系人数据,直接通过Deluge脚本完成双系统数据匹配后,批量更新Accounts模块的自定义字段即可。
现有代码的核心问题
你当前的实现逻辑无法支撑最终的字段更新目标,存在以下缺陷:
- 重复三次调用
response.toJSONList()拆分出三个独立平行列表,后续匹配到相同名称时,无法关联到对应的Splynx Customer ID值,根本拿不到要更新的目标数据 - 直接用
==对比两个列表完全无效:列表是顺序敏感结构,只要两边条目顺序不一致、存在部分匹配/重名情况,就会直接判定为不匹配,无法识别出单条符合要求的匹配记录 - 拉取数据的模块选错:你最终要更新的是Accounts模块的记录,但当前代码只从Contacts模块拿关联的账户名,没有获取Accounts记录的唯一ID,根本无法执行更新操作
- 没有做分页处理:Splynx客户接口、Zoho CRM的
getRecords接口默认都有返回条数限制,数据量超过上限时会拿不全全量数据 - 没有做名称归一化处理:两边的客户名称如果存在大小写差异、首尾多余空格、特殊字符不一致的情况,会直接漏匹配
最优实现方案
不需要重复遍历三次接口返回值,核心逻辑是先把Splynx数据处理成「标准化客户名称:客户ID」的键值对映射,再直接拉取Zoho Accounts模块数据做匹配更新,具体步骤:
- 拉取Splynx全量客户数据,单次遍历返回结果,构建以标准化客户名为key、Splynx ID为value的Map,解决多列表无法关联数据的问题
- 直接拉取Accounts模块全量记录(不需要绕路从Contacts拿关联账户名,减少一层关联逻辑),对账户名做和Splynx侧一致的标准化处理
- 遍历Zoho Accounts记录,匹配到对应名称的条目,直接调用CRM批量更新接口把Splynx ID写入自定义字段
- 增加分页逻辑,避免数据量过大时拉取不全
- 名称匹配前统一做转小写、去首尾空格处理,减少无意义的漏匹配
修正后可直接运行的参考代码
// 拉取Splynx全量客户数据,构建名称-ID映射表 headersmap = Map(); headersmap.put("Authorization","Basic 替换为你的实际鉴权信息"); splynxCustomerMap = Map(); // Splynx接口分页配置,默认每页拉100条 page = 1; limit = 100; while(true) { response = invokeurl [ url :"https://selfcare.dotmac.ng/api/2.0/admin/customers/customer?page=" + page + "&limit=" + limit type :GET headers:headersmap ]; rows = response.toJSONList(); if(rows.size() == 0) { break; } for each row in rows { // 名称标准化:转小写、去首尾空格 customerName = row.get("name").toString().trim().toLowerCase(); customerId = row.get("id"); splynxCustomerMap.put(customerName, customerId); } page = page + 1; } // 拉取Zoho Accounts全量记录,匹配后批量更新 crmPage = 1; crmPerPage = 200; matchedCount = 0; while(true) { accounts = zoho.crm.getRecords("Accounts", crmPage, crmPerPage); if(accounts.size() == 0) { break; } updateList = List(); for each acc in accounts { accName = ifnull(acc.get("Account_Name"), "").toString().trim().toLowerCase(); if(splynxCustomerMap.containsKey(accName)) { // 构建更新参数,注意将Splynx_ID替换为你自定义字段的实际API名 updatePayload = Map(); updatePayload.put("id", acc.get("id")); updatePayload.put("Splynx_ID", splynxCustomerMap.get(accName)); updateList.add(updatePayload); } } // 批量更新当前页匹配到的账户 if(updateList.size() > 0) { zoho.crm.updateRecords("Accounts", updateList); matchedCount = matchedCount + updateList.size(); info "本页更新完成,累计更新匹配记录" + matchedCount + "条"; } crmPage = crmPage + 1; } info "全量匹配更新完成,共关联更新" + matchedCount + "条账户记录";
落地注意事项
- 代码中的
Splynx_ID需要替换为你在Zoho Accounts模块创建的「Splynx ID」自定义字段的实际API名称,可在CRM设置-模块与字段-对应字段详情页查看 - 跑完脚本后可导出两边未匹配的记录做人工核对映射,不需要重跑全量联系人导入
- 你之前已经导入的联系人如果已经正确关联对应Accounts,不需要做任何调整,关联的联系人可直接通过账户关联关系读取到对应的Splynx ID
内容的提问来源于stack exchange,提问作者Promise Okoli
相关产品推荐
相关产品推荐

