从 API 获取数据而不会达到自定义函数运行时间限制(30 秒)

问题描述 投票:0回答:1

我希望使用来自 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 秒的自定义函数运行时间限制。

javascript api google-apps-script quota
1个回答
0
投票

不确定我是否将您指向您想要的方向,但是如果您对速率限制有疑问并且想自定义请求的时间,您应该考虑使用像bottleneck

这样的包
© www.soinside.com 2019 - 2024. All rights reserved.