使用Google Apps Script解析Google Maps XML数据时遇请求错误
问题修正方案
错误原因拆解
- URL拼接错误:Google Apps Script基于JavaScript,字符串拼接要用
+而非VBA的&,原写法导致URL格式完全失效,触发Bad request错误 - 语法细节错误:
getRange(1,1,)多了多余逗号;getContentText、getValue是方法,必须加()调用才能执行 - XML解析层级错误:API返回的XML根节点就是
<GeocodeResponse>,无需再通过getChild重复获取 - 节点调用方式错误:获取XML子节点要用
getChild()方法,不能直接用函数调用的写法
修正后的完整代码
function addressFormat() { var ss = SpreadsheetApp.getActive(); var sheet = ss.getSheetByName("format"); // 获取A1单元格的待格式化地址,修正getRange多余逗号 var rawAddr = sheet.getRange(1, 1).getValue(); var apiKey = "你的API密钥"; // 编码地址中的特殊字符(空格、中文等),避免URL格式错误 var encodedAddr = encodeURIComponent(rawAddr); // 用+正确拼接URL字符串 var addUrl = "https://maps.googleapis.com/maps/api/geocode/xml?address=" + encodedAddr + "&key=" + apiKey; try { var extractXml = UrlFetchApp.fetch(addUrl); // 调用getContentText方法,补全() var contentsXml = extractXml.getContentText(); var xmlDoc = XmlService.parse(contentsXml); // 根节点即为GeocodeResponse var root = xmlDoc.getRootElement(); // 获取第一个匹配的result节点 var result = root.getChild('result'); if (result) { // 获取formatted_address节点并取值,补全getValue() var formattedAddr = result.getChild('formatted_address').getValue(); // 将结果写入B1单元格(可自行修改目标行列) sheet.getRange(1, 2).setValue(formattedAddr); return formattedAddr; } else { sheet.getRange(1, 2).setValue("未找到匹配地址"); return "未找到匹配地址"; } } catch (e) { sheet.getRange(1, 2).setValue("请求错误:" + e.message); return "请求错误:" + e.message; } }
关键优化说明
- 新增地址编码:用
encodeURIComponent处理地址中的特殊字符,避免空格、中文等导致URL失效 - 异常捕获:加入
try-catch块,方便排查API请求或解析错误,同时给单元格写入明确提示 - 空值判断:如果API未返回有效地址结果,给出清晰提示
- 补充写入逻辑:原代码仅返回结果,新增写入Sheet目标单元格的逻辑,满足“写入另一单元格”的需求
内容的提问来源于stack exchange,提问作者alanWall
相关产品推荐
相关产品推荐

