通过 Google 应用程序脚本将订阅者添加到 Mailchimp 列表
Add Subscriber to Mailchimp list via Google App Script
我正在尝试使用 google 文档和 google 连接到外部 mailchimp API 的应用程序脚本自动将订阅者添加到 mailchimp 邮件列表。每当我尝试测试我的脚本时,我都会收到来自 StackDriver Log 的 'bad value' 异常。
var payload = {
"email_address": email,
"status_if_new": "subscribed",
"merge_fields": {
FNAME: first_name,
LNAME: last_name
},
};
var headers = {
"contentType": "application/json",
"Authorization": "apikey " + API_KEY,
};
var data = {
"method": "PUT",
"muteHttpExceptions": false,
"headers": headers,
"payload": payload,
};
var json = Utilities.jsonStringify(data);
//DEBUG
Logger.log(json);
Logger.log(endpoint);
// call the Mailchimp API
try {
var response = UrlFetchApp.fetch(endpoint, json);
if (response.getResponseCode() === 200) {
// all good!
Logger.log("Success");
Logger.log(response);
} else {
Logger.log("Issues");
Logger.log(response);
}
} catch (err) {
// handle the error here
Logger.log("Error");
Logger.log(err);
}
Sep 5, 2020, 1:02:53 PM Info Exception: Bad value
在进一步调查 curl 后,我发现手动发送具有相同负载的请求并且 headers 给出了这个响应。
curl -X PUT 'https://{server}.api.mailchimp.com/3.0/lists/{my_list}/members/{member_hash}'
-H {"Authorization":"apikey {API_KEY}","contentType":"application/json"}
-d '{"email_address":"test@test.com","status_if_new":"subscribed","merge_fields":{"LNAME":"test","FNAME":"test"}},"muteHttpExceptions":false}'
"errors":[{"field":"email_address","message":"This value should not be blank."}]
为什么 API 无法识别我提供的电子邮件?
主要问题是您传递了一个 JSON 字符串作为 params
参数,而在 UrlFetchApp.fetch(url, params)
中需要一个对象。无需将所有 data
字符串化,您只需将有效负载字符串化。 (请注意 Apps 脚本文档中链接的示例。)
我怀疑您也会遇到 Utilities.jsonStringify()
的问题,因为它是 deprecated. Use JSON.stringify()
。
我还将 contentType 从 headers
移到 data
,因为这是在 fetch()
方法中指定的方式,但它实际上对您的应用程序没有影响。
var payload = {
"email_address": email,
"status_if_new": "subscribed",
"merge_fields": {
FNAME: first_name,
LNAME: last_name
},
};
var headers = {
"Authorization": "apiKey " + API_KEY
};
var data = {
"method": "PUT",
"muteHttpExceptions": false,
"headers": headers,
"contentType": "application/json",
"payload": JSON.stringify(payload) // The payload should be stringified
};
//DEBUG
Logger.log(endpoint);
// call the Mailchimp API
try {
var response = UrlFetchApp.fetch(endpoint, data); // pass in data, not json
if (response.getResponseCode() === 200) {
// all good!
Logger.log("Success");
Logger.log(response);
} else {
Logger.log("Issues");
Logger.log(response);
}
} catch (err) {
// handle the error here
Logger.log("Error");
Logger.log(err);
}
如果您仅 打算添加订阅者,那么我建议您使用 add members to list 端点。它只是更直接一点,不需要您生成成员哈希。
我正在尝试使用 google 文档和 google 连接到外部 mailchimp API 的应用程序脚本自动将订阅者添加到 mailchimp 邮件列表。每当我尝试测试我的脚本时,我都会收到来自 StackDriver Log 的 'bad value' 异常。
var payload = {
"email_address": email,
"status_if_new": "subscribed",
"merge_fields": {
FNAME: first_name,
LNAME: last_name
},
};
var headers = {
"contentType": "application/json",
"Authorization": "apikey " + API_KEY,
};
var data = {
"method": "PUT",
"muteHttpExceptions": false,
"headers": headers,
"payload": payload,
};
var json = Utilities.jsonStringify(data);
//DEBUG
Logger.log(json);
Logger.log(endpoint);
// call the Mailchimp API
try {
var response = UrlFetchApp.fetch(endpoint, json);
if (response.getResponseCode() === 200) {
// all good!
Logger.log("Success");
Logger.log(response);
} else {
Logger.log("Issues");
Logger.log(response);
}
} catch (err) {
// handle the error here
Logger.log("Error");
Logger.log(err);
}
Sep 5, 2020, 1:02:53 PM Info Exception: Bad value
在进一步调查 curl 后,我发现手动发送具有相同负载的请求并且 headers 给出了这个响应。
curl -X PUT 'https://{server}.api.mailchimp.com/3.0/lists/{my_list}/members/{member_hash}'
-H {"Authorization":"apikey {API_KEY}","contentType":"application/json"}
-d '{"email_address":"test@test.com","status_if_new":"subscribed","merge_fields":{"LNAME":"test","FNAME":"test"}},"muteHttpExceptions":false}'
"errors":[{"field":"email_address","message":"This value should not be blank."}]
为什么 API 无法识别我提供的电子邮件?
主要问题是您传递了一个 JSON 字符串作为 params
参数,而在 UrlFetchApp.fetch(url, params)
中需要一个对象。无需将所有 data
字符串化,您只需将有效负载字符串化。 (请注意 Apps 脚本文档中链接的示例。)
我怀疑您也会遇到 Utilities.jsonStringify()
的问题,因为它是 deprecated. Use JSON.stringify()
。
我还将 contentType 从 headers
移到 data
,因为这是在 fetch()
方法中指定的方式,但它实际上对您的应用程序没有影响。
var payload = {
"email_address": email,
"status_if_new": "subscribed",
"merge_fields": {
FNAME: first_name,
LNAME: last_name
},
};
var headers = {
"Authorization": "apiKey " + API_KEY
};
var data = {
"method": "PUT",
"muteHttpExceptions": false,
"headers": headers,
"contentType": "application/json",
"payload": JSON.stringify(payload) // The payload should be stringified
};
//DEBUG
Logger.log(endpoint);
// call the Mailchimp API
try {
var response = UrlFetchApp.fetch(endpoint, data); // pass in data, not json
if (response.getResponseCode() === 200) {
// all good!
Logger.log("Success");
Logger.log(response);
} else {
Logger.log("Issues");
Logger.log(response);
}
} catch (err) {
// handle the error here
Logger.log("Error");
Logger.log(err);
}
如果您仅 打算添加订阅者,那么我建议您使用 add members to list 端点。它只是更直接一点,不需要您生成成员哈希。