You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GSheets App Script中Maps API setArrive/setDepart未生效问题

问题根源

你的代码无法返回对应时间的通行时长,是踩了以下接口规则限制:

  • setArrive()(到达时间参数)仅对公共交通出行模式生效,驾车、步行、骑行模式均不支持设置到达时间,仅可设置出发时间
  • 未配置交通模型参数时,即使传入出发时间,接口也不会计算对应时段的拥堵预测时长,只会返回固定的历史平均通行时长
  • 代码读取的duration字段是无时间参考的固定平均时长,随时间变化的预测时长存储在duration_in_traffic字段中
  • 传入的时间如果是过去的时间,接口会直接忽略时间参数,回退返回平均时长
  • 带缓存的实现中如果缓存key未包含时间维度,会命中旧缓存返回固定值
修正实现

方案1(硬编码时间版本)

function GetDuration(location1, location2, mode) {
   // 驾车模式仅支持设置出发时间,时间必须为当前时间或未来时间
   var depart= new Date();
   // 示例:设置为当前时间往后3小时出发,可根据需求调整
   depart.setHours(depart.getHours() + 3);
   var directions  = Maps.newDirectionFinder()
  .setDepart(depart)
  // 必须指定交通预测模型,才会返回对应时段的预测时长,可选值:BEST_GUESS、PESSIMISTIC、OPTIMISTIC
  .setTrafficModel(Maps.DirectionFinder.TrafficModel.BEST_GUESS)
  .setOrigin(location1)
  .setDestination(location2)
  .setMode(Maps.DirectionFinder.Mode[mode])
  .getDirections();
 // 读取带拥堵预测的时长字段,不要用固定的duration字段
 return directions.routes[0].legs[0].duration_in_traffic.text;
}

方案2(表格读取时间版本)

const GOOGLEMAPS_DURATION = (origin, destination, adrive, mode = "driving") => {
  if (!origin || !destination) {
    throw new Error("No address specified!");
  }
  if (origin.map) {
    return origin.map(DISTANCE);
  }
  // 兼容表格日期格式,转为标准时间对象
  const departTime = new Date(adrive);
  // 校验时间合法性:驾车模式出发时间不能早于当前时间
  if (departTime.getTime() < Date.now()) {
    throw new Error("驾车模式出发时间必须设置为当前时间或未来时间");
  }
  // 缓存key必须加入时间戳,避免不同时间的请求命中旧缓存
  const key = ["duration_in_traffic", origin, destination, departTime.getTime(), mode].join(",");
  const value = getCache(key);
  if (value !== null) return value;
  const { routes: [data] = [] } = Maps.newDirectionFinder()
    .setOrigin(origin)
    .setDepart(departTime)
    // 新增交通模型配置,触发预测时长计算
    .setTrafficModel(Maps.DirectionFinder.TrafficModel.BEST_GUESS)
    .setDestination(destination)
    .setMode(mode)
    .getDirections();
  if (!data) {
    throw new Error("No route found!");
  }
  // 读取带拥堵预测的时长字段
  const { legs: [{ duration_in_traffic: { text: time } } = {}] = [] } = data;
  setCache(key, time);
  return time;
};
使用注意事项
  • 仅公共交通模式支持setArrive()设置到达时间,其他出行模式不要调用该方法
  • 传入的出发时间必须为当前时间或未来时间,过去时间会被接口直接忽略
  • 必须调用setTrafficModel()指定预测模型,否则不会返回对应时段的动态时长
  • 不要读取duration字段,该值为固定历史平均时长,不会随设置的时间变化
  • 缓存逻辑的key必须包含时间维度,否则会返回旧缓存的固定值

内容的提问来源于stack exchange,提问作者ThrowAway23948238

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:27:25