Google Apps Script检查联系人存在性异常:始终返回不存在
联系人重复创建问题的代码错误排查与修复
核心错误分析
1. 联系人获取API调用错误
你当前使用People.People.get('people/me', {personFields: 'names'})只能获取当前登录用户自身的个人信息,并非用户的联系人列表。正确的API应该是People.People.connections.list,用于拉取用户的全部联系人。
2. 姓名匹配逻辑不可靠
通过拆分displayName提取名和姓的方式存在诸多问题:
- 部分联系人的
displayName可能包含中间名、后缀(如Jr.),或格式并非"名 姓"(比如中文姓名的"姓 名"结构、复姓等) - 直接使用People API返回的
givenName(名)和familyName(姓)进行对比才是准确的,无需拆分字符串。
3. 未处理联系人分页
若联系人数量超过100个,默认API调用仅返回前100条,必须处理分页才能获取全部联系人。
修正后的完整代码
function checkAndCreateContactsFromSpreadsheet() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Contacts'); var data = sheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { var firstName = data[i][1]; var lastName = data[i][0]; var email = data[i][12]; if (firstName && lastName) { var contact = findContactByName(firstName, lastName); if (contact) { Logger.log('联系人已存在: ' + contact.names[0].displayName); } else { Logger.log('联系人不存在,正在创建...'); createContact(firstName, lastName, email); } } } } function findContactByName(targetFirstName, targetLastName) { try { var pageToken = null; do { // 使用connections.list获取联系人列表,处理分页 const response = People.People.connections.list('people/me', { personFields: 'names', pageToken: pageToken, pageSize: 200 // 每次最多拉取200条,可按需调整 }); var connections = response.connections || []; for (var i = 0; i < connections.length; i++) { var person = connections[i]; if (person.names && person.names.length > 0) { // 取主姓名条目(通常为第一个) var name = person.names[0]; // 统一大小写后对比,避免大小写差异导致匹配失败 const contactFirstName = name.givenName?.toLowerCase() || ''; const contactLastName = name.familyName?.toLowerCase() || ''; const targetFirst = targetFirstName.toLowerCase(); const targetLast = targetLastName.toLowerCase(); if (contactFirstName === targetFirst && contactLastName === targetLast) { return person; } } } pageToken = response.nextPageToken; } while (pageToken); // 循环处理所有分页,确保遍历全部联系人 return null; } catch (e) { Logger.log('查找联系人出错: ' + e.message); return null; } } function createContact(firstName, lastName, email) { try { var newContact = { names: [{ givenName: firstName, familyName: lastName }], emailAddresses: email ? [{ value: email }] : [] // 处理空邮箱情况,避免创建失败 }; var createdContact = People.People.createContact(newContact); Logger.log('已创建新联系人: ' + createdContact.names[0].displayName); } catch (e) { Logger.log('创建联系人出错: ' + e.message); } }
关键修正点说明
- 替换联系人获取API为
People.People.connections.list,并添加分页逻辑确保遍历全部联系人 - 姓名匹配改为直接使用API返回的
givenName和familyName,彻底避免拆分字符串的错误 - 增加空邮箱处理逻辑,防止因邮箱为空导致的联系人创建失败
- 统一大小写对比规则,避免因大小写差异导致的匹配遗漏
内容的提问来源于stack exchange,提问作者Julie Lewis
相关产品推荐
相关产品推荐

