Ajouter un abonné à la liste Mailchimp via Google App Script

Sep 06 2020

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

2 Diego Sep 06 2020 at 06:49

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.