You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:33:13