Ajouter un abonné à la liste Mailchimp via Google App Script
J'essaie d'automatiser l'ajout d'abonnés à une liste de diffusion mailchimp à l'aide d'un script google doc et google app, qui se connecte à l'API mailchimp externe. Chaque fois que j'essaie de tester mon script, je reçois une exception de «mauvaise valeur» de StackDriver Log.
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
Après une enquête plus approfondie avec curl, j'ai trouvé que l'envoi manuel d'une demande avec la même charge utile et les mêmes en-têtes donnait cette réponse.
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":"[email protected]","status_if_new":"subscribed","merge_fields":{"LNAME":"test","FNAME":"test"}},"muteHttpExceptions":false}'
"errors":[{"field":"email_address","message":"This value should not be blank."}]
Pourquoi l'API ne reconnaît-elle pas l'e-mail que je fournis?
Réponses
Le problème principal est que vous transmettez une chaîne JSON comme paramsargument dans lequel un objet est attendu UrlFetchApp.fetch(url, params). Au lieu de tout stringifier data, il vous suffit de stringifier la charge utile. (Notez l'exemple lié dans la documentation Apps Script.)
Je soupçonne que vous rencontrerez également un problème Utilities.jsonStringify()car il est obsolète . Utilisez JSON.stringify()plutôt.
J'ai également déplacé contentType de headerset vers l' intérieur data, car c'est ainsi qu'il est spécifié dans la fetch()méthode, mais cela n'a en fait aucun impact sur votre application.
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);
}
Si vous comptez uniquement ajouter des abonnés, je vous recommande d'utiliser l' ajout de membres pour lister le point de terminaison. C'est juste un peu plus simple et ne nécessite pas de générer un hachage de membre.