Google Apps Script:如何通过People API添加联系人标签且不覆盖原有标签?
问题解答
1. 是否存在直接添加新标签而非覆盖的方法?
Google People API 的 People.updateContact 接口在指定 updatePersonFields: "memberships" 时,会完全覆盖该联系人原有的所有成员关系(标签),没有提供直接追加新标签的内置操作,因此不存在一步到位的简便方法。
2. 获取现有标签合并后更新是否为最优方案?
这种方案是当前场景下的标准且推荐的实现方式,但需要注意几个细节来保证健壮性:
- 必须通过
People.People.get获取联系人的现有标签,调用时要指定personFields: "memberships"才能拿到完整的成员关系数据 - 合并时要做去重处理,避免重复添加同一个标签
- 必须携带最新的
etag,防止并发更新导致的数据冲突
修改后的实现代码
function addContactLabel(personResourceName, newLabelResourceName, etag) { Logger.log("Adding label to: " + personResourceName + " --> " + newLabelResourceName); // 1. 获取联系人现有标签 const existingContact = People.People.get(personResourceName, { personFields: "memberships" }); // 2. 提取现有标签的resourceName,整理为集合方便去重 const existingLabels = new Set(); if (existingContact.memberships) { existingContact.memberships.forEach(membership => { if (membership.contactGroupMembership?.contactGroupResourceName) { existingLabels.add(membership.contactGroupMembership.contactGroupResourceName); } }); } // 3. 添加新标签(自动去重) existingLabels.add(newLabelResourceName); // 4. 转换回API要求的memberships格式 const updatedMemberships = Array.from(existingLabels).map(label => ({ contactGroupMembership: { contactGroupResourceName: label } })); // 5. 执行更新 return People.People.updateContact({ resourceName: personResourceName, etag: etag, memberships: updatedMemberships }, personResourceName, { updatePersonFields: "memberships" }); }
关键细节说明
- 去重处理:用
Set存储现有标签,避免重复添加同一个标签导致的冗余数据 - etag校验:确保更新操作基于最新的联系人数据,防止多人同时修改时覆盖对方的操作
- 字段指定:调用
People.get时必须明确personFields: "memberships",否则API不会返回标签数据
内容的提问来源于stack exchange,提问作者Corinne Jacobo
相关产品推荐
相关产品推荐

