Google apps script 如何从多个Mailchimp端点提取数据?

Google apps script 如何从多个Mailchimp端点提取数据?,google-apps-script,google-sheets,mailchimp-api-v3.0,Google Apps Script,Google Sheets,Mailchimp Api V3.0,下面的代码从Mailchimp API报告端点提取数据,并将其添加到工作表中 我想从其他端点添加更多数据(如“列表/受众”端点的字段:成员计数、联系人总数),但没有一个灵活的解决方案 这里的最佳实践/解决方案是什么?该任务是否可以保留在同一个功能中,或者最好是单独的功能 我是这方面的新手,请耐心点:) 函数(){ var API_KEY='X';//MailChimp API KEY var REPORT_START_DATE='2018-01-01 15:54:00';//报告开始日期(例如,

下面的代码从Mailchimp API报告端点提取数据,并将其添加到工作表中

我想从其他端点添加更多数据(如“列表/受众”端点的字段:成员计数、联系人总数),但没有一个灵活的解决方案

这里的最佳实践/解决方案是什么?该任务是否可以保留在同一个功能中,或者最好是单独的功能

我是这方面的新手,请耐心点:)

函数(){
var API_KEY='X';//MailChimp API KEY
var REPORT_START_DATE='2018-01-01 15:54:00';//报告开始日期(例如,当您发送第一份MailChimp时事通讯时)
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName(“活动数据”);
var dc=API_KEY.split('-')[1];
VarAPI='https://'+dc+'.api.mailchimp.com/3.0';
var count=100;//要返回的最大行数
var campaignList='/campaigns?&count='+count+'&自发送时间='+REPORT开始日期
var options={“headers”:{“authorization”:“apikey”+API_KEY}};
var apiCall=函数(端点){
apiResponseCampaigns=UrlFetchApp.fetch(api+端点,选项);
json=json.parse(apiResponseCampaigns);
返回json
}
var活动=apiCall(活动列表);
var total=活动总数\u项;
var-campaignData=活动。活动;
if(活动数据){
sheet.clear();//清除电子表格中的MailChimp数据
//附加列标题
表.附录行([“发送时间”、“活动ID”、“观众”、“活动标题”、“主题行”、“发送的电子邮件”、“滥用报告”、“取消订阅”、“取消订阅率”、“硬反弹”、“软反弹”、“反弹总数”、“语法错误”、“转发次数”、“转发打开次数”、“打开总数”、“唯一打开次数”、“打开次数”、“上次打开次数”、“单击总数”、“唯一单击次数”),“唯一订户点击次数”、“点击率”、“上次点击”];
}  
对于(i=0;i
您可以使用错误优先模式连续调用每个端点。更多关于这个。 如果上一个调用返回数据并且没有出错,则将下一个函数作为回调传递,以此类推。 在下面的示例中,我省略了构建URL端点、查询字符串和“options”对象的逻辑,因为这些可以简单地从代码中借用。 基本上,您可以为每个API端点定义一个带有回调参数的函数。 每当需要调用多个端点时,都会创建一个连续调用它们的第三个函数,将每个新函数调用作为参数传递给前一个。 内部函数仍然可以访问外部作用域,因此在执行最后一次调用后,您可以合并来自多个端点的数据(前提是为返回的数据指定唯一的名称—“活动”、“报告”等)

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

    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[])处理多个请求(选项)对象。更多关于这个。调用此方法将返回多个可迭代的响应对象。

您可以使用错误优先模式连续调用每个端点。更多关于这个。 如果上一个调用返回数据并且没有出错,则将下一个函数作为回调传递,以此类推。 在下面的示例中,我省略了构建URL端点、查询字符串和“options”对象的逻辑,因为这些可以简单地从代码中借用。 基本上,您可以为每个API端点定义一个带有回调参数的函数。 只要你需要c
  //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;
        }
    });
    }