偏移量/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=';
嘿,我正在尝试编写一个 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=';