使用Google Sheets数据创建联系人时遇GoogleJsonResponseException错误求助
解决Google Contacts批量创建API错误问题
你遇到的错误是因为代码里的contacts数组包含了空对象,API要求每个联系人必须有至少一个非元数据字段(比如姓名、邮箱),空对象不符合这个校验规则。
错误原因
看代码里的obj结构,contacts数组在第一个联系人对象后加了三个多余的逗号:
contacts: [ { contactPerson: { emailAddresses: [{ value: email }], names: [ { familyName: lastName, givenName: firstName }, ], }, }, , , , ],
这些逗号会生成三个空的联系人对象,API处理时就会抛出Must specify a non-metadata contact field on the person错误。
修正后的代码
删掉多余的逗号,确保contacts数组里只有当前要创建的联系人对象:
function newContact () { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("Contacts"); var data = sheet.getDataRange().getValues(); for (var i = 1; i < data.length; i++) { var lastName = data[i][0]; var firstName = data[i][1]; var email = data[i][12]; const obj = { contacts: [ { contactPerson: { emailAddresses: [{ value: email }], names: [ { familyName: lastName, givenName: firstName }, ], }, } ], readMask: "emailAddresses,names", }; const res = People.People.batchCreateContacts(obj); console.log(res); } }
额外优化建议
当前代码循环一次创建一个联系人,效率偏低。可以把所有联系人收集到数组后批量调用API,减少请求次数:
function newContact () { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("Contacts"); var data = sheet.getDataRange().getValues(); const contactsList = []; // 收集所有待创建的联系人 for (var i = 1; i < data.length; i++) { var lastName = data[i][0]; var firstName = data[i][1]; var email = data[i][12]; contactsList.push({ contactPerson: { emailAddresses: [{ value: email }], names: [ { familyName: lastName, givenName: firstName }, ], }, }); } // 批量创建联系人 if (contactsList.length > 0) { const obj = { contacts: contactsList, readMask: "emailAddresses,names", }; const res = People.People.batchCreateContacts(obj); console.log(res); } }
内容的提问来源于stack exchange,提问作者Julie Lewis
相关产品推荐
相关产品推荐

