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

如何在Apps Script的onEdit触发器中为People API提供OAuth 2令牌?

问题根源

简单触发器onEdit()是以匿名身份运行的,不会携带用户的OAuth 2授权令牌,而Google People API的searchContacts接口需要访问用户个人联系人数据,必须经过用户授权才能调用。你手动在编辑器运行时,是用自己的账号完成了授权,所以能正常执行;但简单触发器做不到这一点。另外,API Key仅适用于访问公开数据的接口,无法用于这类需要用户个人授权的场景。

解决方案

改用可安装的编辑触发器,它会以你的用户身份运行,并携带授权令牌,能正常调用People API。具体步骤如下:

  1. 替换简单触发器为可安装触发器逻辑

    • 删除或重命名原有的onEdit()函数(避免和可安装触发器冲突)。
    • 创建新的处理函数,比如:
      function handleEdit(e) {
        // 可添加判断,仅当编辑A2单元格时触发
        if (e.range.getA1Notation() === "A2") {
          displayContact();
        }
      }
      
  2. 创建可安装触发器

    • 在Apps Script编辑器顶部,点击「编辑」→「当前项目的触发器」。
    • 点击右下角「添加触发器」,配置项选择:
      • 要运行的函数:handleEdit
      • 事件源:「电子表格」
      • 事件类型:「编辑时」
    • 保存时会弹出授权窗口,按提示完成账号授权即可。
  3. 优化原函数的变量声明与容错
    原代码存在未声明的全局变量,且未处理联系人无地址的情况,建议调整为:

    function displayContact() {
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MAIN");      
      const range = sheet.getRange("A2");
      const query = range.getValue();
    
      const found = People.People.searchContacts({
        "query": query,
        "readMask": "names,addresses"
      });
    
      if (found.results && found.results.length > 0) 
      {
        const thisResult = found.results[0];
        // 增加地址存在性判断,避免报错
        if (thisResult.person.addresses && thisResult.person.addresses.length > 0) {
          const contactAddress = thisResult.person.addresses[0].streetAddress;
          const outRange = sheet.getRange("A3");
          outRange.setValue(contactAddress);
        } else {
          Logger.log(`未找到${query}的地址信息`);
        }
      } else {
        Logger.log(`未搜索到${query}的联系人`);
      }
    }
    
补充说明

可安装触发器绑定你的Google账号权限,每次触发都会以你的身份执行,因此能正常访问People API;新增的容错判断可以避免因联系人无地址导致的运行报错。

内容的提问来源于stack exchange,提问作者Robert M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:20:24