我希望使用来自 bradjasper 的 ImportJSON 脚本从 2 个 API 端点获取数据。
从第一个 API,我得到了大约 100 个驱动程序对象(ID、名称)的数组。使用司机 ID,我需要轮询第二个 API 以获取每个司机的额外数据(英里数、安全分数)。第二个 API 的速率限制为每秒 5 个请求。
问题是我似乎达到了每个函数 30 秒的 Apps 脚本自定义函数限制。 (错误:超过最大执行时间)。
避免这个 30 秒限制的最佳方法是什么?
function ImportJSONAdvancedDrivers(url, fetchOptions, query, parseOptions, includeFunc, transformFunc) {
var url = 'https://api.samsara.com/v1/fleet/drivers';
var includeFunc = includeXPath_;
var transformFunc = defaultTransform_;
var fetchOptions = {
'headers': {
"Authorization": "XYZ Token",
},
}
var parseOptions = "noInherit, noTruncate";
var jsondata = UrlFetchApp.fetch(url, fetchOptions);
var object = JSON.parse(jsondata.getContentText())['drivers'];
var dateStart = new Date(2023, 0, 1, 2, 0, 0, 0);
var dateStartMiliseconds = dateStart.getTime();
var dateEnd = new Date(2023, 1, 1, 1, 59, 59, 0);
var dateEndMiliseconds = dateEnd.getTime();
var driversArr = [];
for (var driver=0; driver < object.length; driver++){
try {
var driverId = object[driver].id;
var driverName = object[driver].name;
Utilities.sleep(200);
var driverMilesJson = UrlFetchApp.fetch("https://api.samsara.com/v1/fleet/drivers/" + driverId + "/safety/score?startMs=" + dateStartMiliseconds +"&endMs=" + dateEndMiliseconds, fetchOptions);
var driverMilesObject = JSON.parse(driverMilesJson.getContentText());
var driverMeters = driverMilesObject.totalDistanceDrivenMeters;
var driverMilesRounded = Math.round(driverMeters * 0.00062137 * 100) / 100;
var driverSafetyScore = driverMilesObject.safetyScore;
driversArr.push({
Id: driverId,
Name: driverName,
Miles: driverMilesRounded,
SafetyScore: driverSafetyScore
});
} catch (error){
console.error(error);
}
};
var object = driversArr;
return parseJSONObject_(object, query, parseOptions, includeFunc, transformFunc);
}
我尝试通过使用 Utilities.sleep() 来避免 5 个请求/秒的速率限制,但随后我达到了 30 秒的自定义函数运行时间限制。
不确定我是否将您指向您想要的方向,但是如果您对速率限制有疑问并且想自定义请求的时间,您应该考虑使用像bottleneck
这样的包