如何通过编程批量修改maps.google.com已创建地图的图层名称?
核心原因说明
你当前脚本报错且无法生效有两个核心问题:
- 你在Drive中读取的是Google我的地图专属格式文件,不属于普通二进制/文本文件,DriveApp原生接口不支持直接读取其内容,所以触发
getBlob相关报错 - 即使是标准KMZ文件,本质也是ZIP压缩包,直接调用
getDataAsString()只能拿到乱码,无法匹配到XML标签内容做替换
可行解决方案
方案一:批量导出本地处理后回传(实现门槛更低)
- 全选Drive中存储的67份我的地图文件,右键选择下载,平台会自动将所有地图导出为KMZ格式并打包下载到本地
- 本地编写简单脚本批量处理所有KMZ文件:
- 逐个解压KMZ压缩包,获取根目录下的doc.kml文本文件
- 对kml文件执行全局字符串替换,完成所有待修改图层名的更新
- 将修改后的kml文件重新压缩为KMZ格式,保证kml文件在压缩包根目录
- 将处理完成的KMZ文件批量上传回Drive,打开验证图层名修改正确后,可删除或归档原文件即可
方案二:通过My Maps API在Apps Script中批量修改(无需本地操作)
首先需要提前开启Google My Maps API,给你的Apps Script项目绑定对应权限,再运行如下脚本即可批量处理:
function batchUpdateMapLayerNames() { // 替换为存储67份地图的Google Drive文件夹ID const mapFolder = DriveApp.getFolderById("替换为你的文件夹ID"); const mapFiles = mapFolder.getFilesByMimeType("application/vnd.google-apps.map"); // 配置待替换的图层名映射,可添加多组替换规则 const layerNameReplaceRules = { "2021 Proposed PA House": "2021 FDPA Proposed PA House" }; while (mapFiles.hasNext()) { const currentMap = mapFiles.next(); const currentMapId = currentMap.getId(); // 获取当前地图的所有图层 const mapLayers = Maps.MapsLayers.list(currentMapId).layers; mapLayers.forEach(layer => { if (layerNameReplaceRules.hasOwnProperty(layer.name)) { const updatedLayerInfo = { name: layerNameReplaceRules[layer.name] }; // 调用接口仅更新图层名字段 Maps.MapsLayers.patch(updatedLayerInfo, currentMapId, layer.id, { updateMask: "name" }); } }) } }
注意:运行脚本前需要在Apps Script编辑器中添加My Maps API服务,运行时按提示完成权限授权即可。
内容的提问来源于stack exchange,提问作者Frank Wilder
相关产品推荐
相关产品推荐

