Google Sheets基于经纬度/地址计算里程报错排查求助
问题分析与解决
你遇到的 TypeError: Cannot read properties of undefined (reading 'legs') 错误,本质是当使用经纬度作为起点/终点时,Google Maps Directions API 返回的响应里没有有效路线(routes 数组为空),或是经纬度格式不符合API要求,导致直接访问 routes[0].legs[0] 时触发 undefined 报错。
核心问题点
- 经纬度格式问题:API要求经纬度必须是
纬度,经度格式的纯字符串(不能带空格,数值需在有效范围:纬度-9090,经度-180180),若拼接时出现格式错误,API无法解析坐标,会返回无路线结果。 - 无错误处理:原代码直接嵌套访问
routes[0].legs[0],未考虑API返回失败、无路线的情况,一旦routes为空就会报错。
修复后的代码
function getDistance(origin, destination) { // 调用Google Maps路线API var directions = Maps.newDirectionFinder() .setOrigin(origin) .setDestination(destination) .getDirections(); // 先检查API返回状态是否正常 if (directions.status !== "OK" || !directions.routes || directions.routes.length === 0) { return "路线获取失败:" + directions.status; } // 检查路线是否包含有效路段 var firstRoute = directions.routes[0]; if (!firstRoute.legs || firstRoute.legs.length === 0) { return "该路线无有效行驶路段"; } // 返回距离文本 return firstRoute.legs[0].distance.text; } // 调用示例: // 地址→经纬度:getDistance("北京市天安门", "31.2304,121.4737") // 经纬度→经纬度:getDistance("39.9042,116.4074", "31.2304,121.4737") // 地址→地址:getDistance("北京市天安门", "上海市东方明珠")
修复说明
- 格式兼容:合并了原有的两个函数,
getDistance可以直接接收地址字符串或经纬度字符串作为参数,无需单独拼接经纬度。 - 错误防护:逐层检查API返回的状态、
routes数组、legs数组是否有效,避免直接访问undefined属性,同时返回明确的错误提示。 - 状态判断:通过
directions.status可以快速定位问题(比如INVALID_REQUEST表示坐标格式错误,ZERO_RESULTS表示两地无可行路线)。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

