偏移量/while 循环问题 - 使用 google 应用程序脚本从列表下载 mailchimp 'members' 数据

offset / while loop problem - using google apps script to download mailchimp 'members' data from list

嘿,我正在尝试编写一个 google 应用程序脚本,将所有 Mailchimp email addresses 和状态放入 google sheet。但是,它在前 1,000 个后停止,我无法计算出完成这项工作所需的偏移量/get_all。

function mailchimpMembers() {

  // URL and params for the Mailchimp API
  var root = 'https://us19.api.mailchimp.com/3.0/';
  var endpoint = 'lists/' + LIST_ID + '/members?offset=0&count=10000';

  var params = {
    'method': 'GET',
    'muteHttpExceptions': true,
    'headers': {
      'Authorization': 'apikey ' + API_KEY
    }
  };

  try {
    // call the Mailchimp API

    var keep_going = true;
    var offset = 0;
    var memberList = new Array();
    memberList.push(["email","status"]);


     while(keep_going) {
        var response = UrlFetchApp.fetch(root+endpoint+offset, params);
        var data = response.getContentText();
        var json = JSON.parse(data);
      keep_going = json["get_all"];
      offset = json.offset;
      var listGrowth = json['members'];
      listGrowth.forEach(function(el) {
      memberList.push([el.email_address, el.status]);
    });
    Logger.log(memberList);
    };

  writeResults("list",memberList);
  }
  catch (error) {

    Logger.log(error);
  };
}

此 API 的结果已分页。请参阅 MailChimp 的 Getting Started 指南中的 Pagination 部分。这种类型的分页对于这些类型的 APIs 是相当典型的。

对于每个 GET 请求,您需要为每页的结果数设置 count。 (我看到你已经这样做了,但我认为你有错字。你的代码中有“10000”而不是“1000”。)

您还需要设置 offset 以在上一页的最后一个结果之后开始显示每一页的结果。因此,如果您的 count 是 1000,则每次都需要将偏移量增加一千:

offset = offset + 1000

最后,要设置您的 keep_going 布尔值,您需要检查下一个偏移量是否超过结果总数。这个特定的端点 returns a total_items 属性,您可以将其用于此比较:

keep_going = offset > total_items

确保在更新偏移量(与当前代码中的相反)之后进行此比较。否则,您将检查刚刚发出的请求的偏移量。

P.S。您需要重新编写原始的 endpoint 定义,以便不对偏移值进行硬编码,因为您需要在 while 循环中重新编写该值。我推荐:

var endpoint = 'lists/' + LIST_ID + '/members?count=10000&offset=';