【问题标题】:How to pull data from multiple Mailchimp endpoints?如何从多个 Mailchimp 端点提取数据?
【发布时间】:2020-03-25 17:16:45
【问题描述】:

以下代码从 Mailchimp API 报告端点提取数据并将其添加到表格中。

我想从其他端点添加更多数据(例如来自“列表/受众”端点的字段:member_count、total_contacts 即),但对此没有巧妙的解决方案。

这里的最佳做法/解决方案是什么?这个任务可以保留在同一个函数中还是一个单独的函数更可取?

我是这个领域的新手,所以请多多包涵:)

function chimpCampaigns() {
var API_KEY = 'X'; // MailChimp API Key
var REPORT_START_DATE = '2018-01-01 15:54:00'; // Report Start Date (ex. when you sent your first MailChimp Newsletter)

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("CampaignData");

var dc = API_KEY.split('-')[1];
var api = 'https://'+ dc +'.api.mailchimp.com/3.0';
var count = 100; // Max rows to return

var campaignList = '/campaigns?&count='+count+'&since_send_time='+REPORT_START_DATE
var options = {"headers": {"authorization": 'apikey '+API_KEY}};
    var apiCall = function(endpoint){
        apiResponseCampaigns = UrlFetchApp.fetch(api+endpoint,options);
        json = JSON.parse(apiResponseCampaigns);
        return json
    }

var campaigns = apiCall(campaignList);
var total = campaigns.total_items;
var campaignData = campaigns.campaigns;

 if (campaignData) {
    sheet.clear(); // Clear MailChimp data in Spreadsheet
   // Append Column Headers
    sheet.appendRow(["Sent Time", "Campaign ID", "Audience", "Campaign Title", "Subject Line", "Emails Sent", "Abuse Reports", "Unsubscribed", "Unsubscribe Rate", "Hard Bounces", "Soft Bounces", "Bounces Total", "Syntax Errors", "Forwards Count", "Forwards Opens", "Opens Total", "Unique Opens", "Open Rate", "Last Open", "Clicks Total", "Unique Clicks","Unique Subscriber Clicks", "Click Rate", "Last Click"]);
  }  

for (i=0; i< campaignData.length; i++){
    var c = campaignData[i];
    var cid = c.id;
    var title = c.title;
    var subject = c.subject;
    var send_time = c.send_time;

    if (send_time){
        apiResponseReports = UrlFetchApp.fetch('https://'+ dc +'.api.mailchimp.com/3.0/reports/'+cid,options);
        reports = JSON.parse(apiResponseReports);
        reportsSendTime = reports.send_time;
        if(reportsSendTime){

          var campaign_title = c.settings.title;
          var subject_line = c.settings.subject_line;
          var emails_sent = reports.emails_sent;
          var list_name = reports.list_name;            
          var fields = reports.fields;           
          var abuse_reports = reports.abuse_reports;
          var unsubscribed = reports.unsubscribed;       
          var unsubscribe_rate = unsubscribed/emails_sent;
          var hard_bounces = reports.bounces.hard_bounces;
          var soft_bounces = reports.bounces.soft_bounces;
          var bounces = hard_bounces+soft_bounces;
          var syntax_errors = reports.bounces.syntax_errors;
          var forwards_count = reports.forwards.forwards_count;
          var forwards_opens = reports.forwards.forwards_opens;
          var opens_total = reports.opens.opens_total;
          var unique_opens = reports.opens.unique_opens;
          var open_rate = reports.opens.open_rate;
          var last_open = reports.opens.last_open;
          var clicks_total = reports.clicks.clicks_total;
          var unique_clicks = reports.clicks.unique_clicks;
          var unique_subscriber_clicks = reports.clicks.unique_subscriber_clicks;
          var click_rate = reports.clicks.click_rate;
          var last_click = reports.clicks.last_click;

          // the report array is how each row will appear on the spreadsheet
          var report = [send_time, fields, cid, list_name, campaign_title, emails_sent, subject_line, abuse_reports, unsubscribed, unsubscribe_rate, hard_bounces, soft_bounces, bounces, syntax_errors, forwards_count, forwards_opens, opens_total, unique_opens, open_rate, last_open, clicks_total, unique_clicks, unique_subscriber_clicks, click_rate, last_click];

      sheet.appendRow(report);
      }
    }
  }
}

【问题讨论】:

    标签: google-apps-script google-sheets mailchimp-api-v3.0


    【解决方案1】:

    您可以使用错误优先模式连续调用每个端点。更多关于这个here。 如果您之前的调用返回数据并且没有出错,则将下一个函数作为回调传递,等等。 在下面的示例中,我省略了构建 URL 端点、查询字符串和“选项”对象的逻辑,因为这些可以简单地从您的代码中借用。 基本上,您为每个 API 端点定义一个带有回调参数的函数。 每当您需要调用多个端点时,您都​​会创建一个连续调用它们的第三个函数,将每个新函数调用作为参数传递给前一个。 内部函数仍然可以访问外部范围,因此您可以在执行最后一次调用后组合来自多个端点的数据(前提是您为返回的数据分配唯一名称 - 'campaigns'、'reports' 等)

      //function for the 'campaings' endpoint
      function getCampaings(options, callback) {
    
           //API call
           var response = UrlFetchApp.fetch(campaignsEndpoint, options);
          if (res.getStatusCode() == 200) {
    
                  var campaigns = JSON.parse(res.getContentText());
                  callback(false, campaigns);
    
           } else {
                 callback("Error: Server responded with the status code of " + res.getStatusCode());
               }             
         }
    

    使用相同方法创建调用“报告”端点的函数后,在第三个函数中合并调用。

        function getCampaignsAndReports(){
          var combinedData = {};
          getCampaigns(options, function(err, campaigns){
            if (!err && campaigns) {
                 //Call is successful - proceed to the next call
                getReports(options, function(err, reports){
    
                   //Call successful
                   if (!err && reports) {
                        //Proceed to the next call or combine data from
                        //multiple endpoints
                        combinedData.campaigns = campaigns.campaigns;
                        combinedData.reports = reports.reports;
                        //write to sheet
                        //...
                    } else {
                     //Error calling reports endpoint
                       throw err;
                     }
    
                 });
            } else {
                //Error calling 'campaigns' endpoint. Throw error or write 
                //another function to show it to the user
                throw err;
            }
        });
        }
    

    这可能会因 MailChimp API 数据的结构而异,因此请相应地更改代码。此外,如果您需要为“campaings”端点中的每个条目多次调用“reports”端点,则可以使用 UrlFetchApp.fetchAll(request[]) 更改函数以处理多个请求(选项)对象。更多关于这个here。调用此方法将返回多个您可以迭代的响应对象。

    【讨论】:

    • 感谢您的评论!您是否有机会使用我示例中的数据?我不知道哪个部分与哪个部分相关。新手很难看出这一切是如何结合在一起的 :)
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2021-10-02
    • 2022-12-04
    • 1970-01-01
    相关资源
    最近更新 更多