使用Google Apps Script从Google Sheets向Hubspot创建营销事件API报错求助
问题:Google Apps Script调用HubSpot营销事件API失败排查
需求
从Google Sheets单元格提取数据,在HubSpot「联系人→联系人→营销事件」模块创建营销事件(如网络研讨会数据)。
已执行操作
- 创建私有应用并获取token,测试阶段开放所有权限
- 从HubSpot私有应用页面提取8位账号编号
- 尝试使用端点:
https://api.hubapi.com/marketing/v3/marketing-events/attendance/NUMBER//email-create
现有代码
//loads data to Hubspot function loadData(email,eventName,startDateTime,timeEvent,type,eventOrganizer,subscriberState) { var url = 'https://api.hubapi.com/marketing/v3/marketing-events/attendance/NUMBER//email-create'; var body = { "email": email, "eventName": eventName, "startDateTime": startDateTime, "timeEvent": timeEvent, "type": type, "eventOrganizer": eventOrganizer, "subscriberState":subscriberState } var option = { "muteHttpExceptions" :true, "method":"POST", 'payload': body, "headers": { "authorization": ’TOKEN’, "content-type": "application/json" } } var response = UrlFetchApp.fetch(url, option); }
错误排查与修正方案
1. API端点错误
- 域名错误:你的账号是欧盟区(
app-eu1),需使用欧盟专属API域名https://api.eu1.hubapi.com,而非通用的api.hubapi.com,跨区域请求会直接失败。 - 格式错误:端点中存在多余的双斜杠
//,正确格式应为https://api.eu1.hubapi.com/marketing/v3/marketing-events/attendance/{portalId}/email-create,需将{portalId}替换为你的8位账号编号。
2. 请求体格式错误
Google Apps Script中,当指定content-type: application/json时,必须将payload转换为JSON字符串,直接传入JS对象会默认以表单格式发送,不符合API要求。需修改为:
"payload": JSON.stringify(body)
3. 身份验证头错误
- 私有应用token需以
Bearer前缀开头,正确格式为"authorization": "Bearer YOUR_PRIVATE_APP_TOKEN"。 - 代码中使用了中文单引号
’,需替换为英文单引号'或双引号",否则会导致语法错误。
4. 请求字段不符合API规范
HubSpotemail-create端点仅接受特定字段,多余字段会被忽略或触发报错:
- 移除
timeEvent、type、eventOrganizer等非标准字段,若需传递自定义数据,需放入properties对象中。 - 确保
subscriberState取值为API允许的枚举值:REGISTERED、ATTENDED、NO_SHOW、CANCELLED。
5. 缺少调试日志
开启muteHttpExceptions: true后,需添加日志输出查看错误详情,便于定位问题:
Logger.log("状态码: " + response.getResponseCode()); Logger.log("响应内容: " + response.getContentText());
修正后的完整代码
//loads data to Hubspot function loadData(email, eventName, startDateTime, timeEvent, type, eventOrganizer, subscriberState) { // 替换为你的8位账号编号 const portalId = "YOUR_PORTAL_ID"; // 替换为你的私有应用token const privateAppToken = "YOUR_PRIVATE_APP_TOKEN"; // 欧盟区正确API端点 var url = `https://api.eu1.hubapi.com/marketing/v3/marketing-events/attendance/${portalId}/email-create`; var body = { "email": email, "eventName": eventName, "startDateTime": startDateTime, "subscriberState": subscriberState, // 自定义字段放入properties "properties": { "timeEvent": timeEvent, "type": type, "eventOrganizer": eventOrganizer } }; var option = { "muteHttpExceptions": true, "method": "POST", "payload": JSON.stringify(body), "headers": { "authorization": `Bearer ${privateAppToken}`, "content-type": "application/json" } }; var response = UrlFetchApp.fetch(url, option); // 输出调试信息 Logger.log("状态码: " + response.getResponseCode()); Logger.log("响应内容: " + response.getContentText()); }
内容的提问来源于stack exchange,提问作者kiki
相关产品推荐
相关产品推荐

