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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:09:19