如何用google.maps.places.Autocomplete实现Google表格城市联动填充县州国家
我之前刚好折腾过类似的需求,其实Google Maps Places API完全能实现这个自动填充功能,只是得结合Google Apps Script来搞,不是直接在表格里用Autocomplete控件就行的。下面给你分享两个可行的方案,一步步来:
方案一:结合Google Apps Script + Places API实现自动填充
这个方案能实现输入城市名称后自动触发填充,还能可选添加输入时的Autocomplete提示,精准度很高。
步骤1:启用Google Maps Places API
首先得去Google Cloud控制台开启Places API,然后创建一个API密钥。记得给密钥加个使用限制(比如只允许Google Apps Script调用),避免被滥用产生不必要的费用。
步骤2:编写Apps Script代码
打开你的Google表格,点击「扩展程序」→「Apps脚本」,新建一个脚本文件,把默认代码替换成下面的内容:
// 当单元格编辑时自动触发的函数 function onEdit(e) { const sheet = e.source.getActiveSheet(); const targetRange = e.range; // 这里假设城市列是A列,县、州、国家分别对应B、C、D列,可根据你的表格调整 if (sheet.getName() === "Sheet1" && targetRange.getColumn() === 1 && targetRange.getValue() !== "") { const cityName = targetRange.getValue(); const placeInfo = fetchPlaceDetails(cityName); if (placeInfo) { // 把获取到的信息填充到对应列 targetRange.offset(0, 1).setValue(placeInfo.county || ""); targetRange.offset(0, 2).setValue(placeInfo.state || ""); targetRange.offset(0, 3).setValue(placeInfo.country || ""); } else { // 如果没找到匹配信息,清空对应列 targetRange.offset(0, 1, 1, 3).clearContent(); } } } // 调用Places API获取地点详细信息 function fetchPlaceDetails(cityName) { const apiKey = "你的API密钥"; // 替换成你在Google Cloud获取的密钥 const apiUrl = `https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=${encodeURIComponent(cityName)}&inputtype=textquery&fields=address_components&key=${apiKey}`; try { const response = UrlFetchApp.fetch(apiUrl); const responseData = JSON.parse(response.getContentText()); if (responseData.status === "OK" && responseData.candidates.length > 0) { const addressParts = responseData.candidates[0].address_components; const info = {}; // 遍历地址组件,提取需要的县、州、国家信息 addressParts.forEach(part => { if (part.types.includes("administrative_area_level_2")) { info.county = part.long_name; // 大部分地区的县是level2 } else if (part.types.includes("administrative_area_level_1")) { info.state = part.long_name; // 州/省是level1 } else if (part.types.includes("country")) { info.country = part.long_name; } else if (part.types.includes("locality")) { // 有些地区的城市本身是locality,这里可以根据需求调整 info.county = info.county || part.long_name; } }); return info; } } catch (error) { console.log("获取地点信息出错:", error); } return null; }
代码说明:
onEdit函数会监听表格的编辑操作,当指定列(这里是A列)有输入时自动触发。fetchPlaceDetails函数调用Places API,根据输入的城市名称提取对应的行政区域信息,注意不同国家的地址组件类型可能有差异,你可以根据自己的需求调整types的判断逻辑。
步骤3:授权脚本权限
保存脚本后,手动运行一次onEdit函数(或者随便编辑一个单元格触发),会弹出授权提示,按照步骤授权脚本访问你的表格和调用外部API即可。
可选:添加输入时的Autocomplete提示
如果想要输入城市时出现下拉提示(类似Google地图的Autocomplete效果),可以做一个自定义侧边栏:
// 显示带Autocomplete的侧边栏 function showCityAutocompleteSidebar() { const sidebarHtml = HtmlService.createHtmlOutput(` <div style="padding: 10px;"> <input type="text" id="cityInput" placeholder="输入城市名称" style="width: 100%; padding: 8px;"> <button onclick="fillSelectedPlace()" style="margin-top: 10px; padding: 8px 16px;">填充到表格</button> </div> <script> // 初始化Places Autocomplete控件 const inputElement = document.getElementById('cityInput'); const autocomplete = new google.maps.places.Autocomplete(inputElement); autocomplete.setFields(['address_components']); function fillSelectedPlace() { const selectedPlace = autocomplete.getPlace(); if (!selectedPlace.address_components) return; let county = '', state = '', country = ''; selectedPlace.address_components.forEach(part => { if (part.types.includes('administrative_area_level_2')) county = part.long_name; if (part.types.includes('administrative_area_level_1')) state = part.long_name; if (part.types.includes('country')) country = part.long_name; }); // 调用脚本函数把信息填充到当前选中的单元格 google.script.run.fillPlaceInfoToSheet(county, state, country); } </script> <script src="https://maps.googleapis.com/maps/api/js?key=你的API密钥&libraries=places"></script> `).setTitle('城市自动填充'); SpreadsheetApp.getUi().showSidebar(sidebarHtml); } // 把选中的地点信息填充到表格 function fillPlaceInfoToSheet(county, state, country) { const activeSheet = SpreadsheetApp.getActiveSheet(); const activeCell = activeSheet.getActiveCell(); // 确保选中的是城市列(这里是A列) if (activeCell.getColumn() === 1) { activeCell.offset(0, 1).setValue(county); activeCell.offset(0, 2).setValue(state); activeCell.offset(0, 3).setValue(country); } }
添加这段代码后,你可以在脚本编辑器的「运行」菜单里执行showCityAutocompleteSidebar,表格会弹出侧边栏,输入城市时就会有自动提示,选好后点击按钮就能填充信息。
方案二:使用Google Sheets内置地理函数(无需API)
如果不想折腾API和脚本,也可以试试表格内置的GEOCODE函数,适合简单场景:
- 在县列(比如B2)输入:
=IFERROR(INDEX(GEOCODE(A2),,3), "") - 在州列(比如C2)输入:
=IFERROR(INDEX(GEOCODE(A2),,2), "") - 在国家列(比如D2)输入:
=IFERROR(INDEX(GEOCODE(A2),,4), "")
不过这个方法的局限性比较大:重名城市容易匹配错误,返回的行政区域名称格式也可能不一致,精准度不如API方案。
注意事项
- 一定要给你的API密钥设置使用限制,比如只允许
https://script.google.com调用,防止被盗用。 - Places API有免费额度,超出后会产生费用,记得关注Google Cloud的账单提醒。
- 不同国家的行政区域划分不同,比如有些国家没有
administrative_area_level_2,需要根据实际情况调整代码里的地址组件判断逻辑。
内容的提问来源于stack exchange,提问作者Edwards Sean
相关产品推荐
相关产品推荐

