Добавить подписчика в список Mailchimp через Google App Script

Я пытаюсь автоматизировать добавление подписчиков в список рассылки mailchimp, используя документ Google и скрипт приложения Google, который подключается к внешнему API mailchimp. Всякий раз, когда я пытаюсь протестировать свой сценарий, я получаю исключение «неверное значение» из журнала StackDriver.

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 я обнаружил, что ручная отправка запроса с той же полезной нагрузкой и заголовками дала такой ответ.

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."}]

Почему API не распознает адрес электронной почты, который я предоставляю?


person Griffin Brome    schedule 05.09.2020    source источник


Ответы (1)


Основная проблема заключается в том, что вы передаете строку JSON в качестве аргумента params, когда объект ожидается в UrlFetchApp.fetch(url, params). Вместо того, чтобы приводить в строку все data, вам нужно только преобразовать в строку полезную нагрузку. (Обратите внимание на пример, указанный в документации Apps Script.)

Я подозреваю, что вы также столкнетесь с проблемой Utilities.jsonStringify(), так как это устарело. Вместо этого используйте 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);
}

Если вы только собираетесь добавлять подписчиков, я рекомендую вам использовать добавить участников в конечную точку списка. Это немного проще и не требует создания хэша члена.

person Diego    schedule 05.09.2020