如何在Apps Script的onEdit触发器中为People API提供OAuth 2令牌?
问题根源
简单触发器onEdit()是以匿名身份运行的,不会携带用户的OAuth 2授权令牌,而Google People API的searchContacts接口需要访问用户个人联系人数据,必须经过用户授权才能调用。你手动在编辑器运行时,是用自己的账号完成了授权,所以能正常执行;但简单触发器做不到这一点。另外,API Key仅适用于访问公开数据的接口,无法用于这类需要用户个人授权的场景。
解决方案
改用可安装的编辑触发器,它会以你的用户身份运行,并携带授权令牌,能正常调用People API。具体步骤如下:
替换简单触发器为可安装触发器逻辑
- 删除或重命名原有的
onEdit()函数(避免和可安装触发器冲突)。 - 创建新的处理函数,比如:
function handleEdit(e) { // 可添加判断,仅当编辑A2单元格时触发 if (e.range.getA1Notation() === "A2") { displayContact(); } }
- 删除或重命名原有的
创建可安装触发器
- 在Apps Script编辑器顶部,点击「编辑」→「当前项目的触发器」。
- 点击右下角「添加触发器」,配置项选择:
- 要运行的函数:
handleEdit - 事件源:「电子表格」
- 事件类型:「编辑时」
- 要运行的函数:
- 保存时会弹出授权窗口,按提示完成账号授权即可。
优化原函数的变量声明与容错
原代码存在未声明的全局变量,且未处理联系人无地址的情况,建议调整为: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.
相关产品推荐
相关产品推荐

