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
相关产品推荐
相关产品推荐

