如何通过Google Apps Script将联系人同步添加到多个Gmail账号
多Gmail账号同步录入联系人实现方案
核心限制说明
你当前使用的ContactsApp是Google Apps Script内置的通讯录服务,默认只会调用运行脚本的当前登录账号的通讯录接口,原生不支持跨账号直接操作其他Gmail账号的通讯录。
可行实现方案
方案1:个人/非Google Workspace域账号适用(无需GCP配置)
通过给每个需要同步的目标Gmail账号单独部署同一份接收脚本为Web App,主脚本批量推送联系人数据到所有Web App端点完成多账号录入。
实现步骤
- 每个目标Gmail账号打开关联表格,粘贴如下接收端代码:
// 每个目标账号部署的Web App接收代码 function doPost(e) { try { const contato = JSON.parse(e.postData.contents); const {nome, sobrenome, email, fone} = contato; const nomeCompleto = `${nome} ${sobrenome}`; // 查重逻辑 if ( !ContactsApp.getContactsByName(nomeCompleto)[0] && !ContactsApp.getContactsByEmailAddress(email)[0] && !ContactsApp.getContactsByPhone(fone)[0] ) { const contatoAtual = ContactsApp.createContact(nome, sobrenome, email); if (fone) { contatoAtual.addPhone(ContactsApp.Field.MOBILE_PHONE, fone); const mainGroup = ContactsApp.getContactGroup("System Group: My Contacts"); contatoAtual.addToGroup(mainGroup); } return ContentService.createTextOutput(JSON.stringify({status: "sucesso"})).setMimeType(ContentService.MimeType.JSON); } else { return ContentService.createTextOutput(JSON.stringify({status: "existente"})).setMimeType(ContentService.MimeType.JSON); } } catch (err) { return ContentService.createTextOutput(JSON.stringify({status: "erro", msg: err.message})).setMimeType(ContentService.MimeType.JSON); } }
- 每个账号将上述代码部署为Web App:
- 点击部署>新建部署
- 类型选择Web App
- 执行身份选择「我(当前登录的目标账号)」
- 谁可以访问选择「任何人」(同域可选择「我的组织内成员」)
- 完成部署后复制生成的Web App URL,汇总到主脚本的配置里
- 替换你原有主脚本的代码为如下版本,把所有目标账号的Web App URL填入
TARGET_WEBAPP_URLS数组:
function cadastrar() { // 配置区:填入所有目标账号的Web App URL const TARGET_WEBAPP_URLS = [ "https://script.google.com/macros/s/xxx1/exec", "https://script.google.com/macros/s/xxx2/exec" ]; const NOMEABA = "Cadastro"; const NOME = 1; const SOBRENOME = 2; const EMAIL = 3; const FONE = 5; const tabelaClientes = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(NOMEABA); const app = SpreadsheetApp.getUi(); const valores = tabelaClientes.getDataRange().getValues(); const linhaINICIAL = 2; for (var linha = linhaINICIAL-1; linha < valores.length; linha++) { if (valores[linha][NOME] === "") continue; const contatoData = { nome: valores[linha][NOME], sobrenome: valores[linha][SOBRENOME], email: valores[linha][EMAIL], fone: valores[linha][FONE] }; // 推送到所有目标账号 TARGET_WEBAPP_URLS.forEach(url => { const options = { method: "post", contentType: "application/json", payload: JSON.stringify(contatoData), muteHttpExceptions: true }; const resp = UrlFetchApp.fetch(url, options); const result = JSON.parse(resp.getContentText()); if (result.status === "erro") { app.alert(`账号录入${contatoData.nome}失败:${result.msg}`); } }); app.alert(`联系人${contatoData.nome}已同步到所有目标账号`); } tabelaClientes.getRange('A2:F').clearContent(); }
方案2:同Google Workspace域下账号适用(无需逐个部署)
使用GCP服务账号加全域委派权限,直接通过Google People API模拟每个目标账号身份录入联系人,步骤如下:
- 在GCP控制台创建服务账号,启用Google People API,配置全域委派,授予
https://www.googleapis.com/auth/contacts权限 - 脚本中引入Apps Script OAuth2库,为每个目标账号生成访问令牌
- 调用People API的
people.createContact接口,传入对应账号的令牌完成录入
注意事项
- 方案1部署Web App后如果修改代码,需要重新部署生成新的URL并更新主脚本配置
- 两种方案都需要在脚本的「服务」中提前启用对应API权限
- 单账号每日录入联系人有配额限制,大批量操作需要拆分执行
内容的提问来源于stack exchange,提问作者Graveto Mellon
相关产品推荐
相关产品推荐

