Google Apps Script遍历地址生成静态地图存Drive报错求助
解决Google Apps Script遍历地址生成卫星地图并保存到Drive的错误
你需要遍历表格中的地址列表生成卫星静态地图并保存到Google Drive,后续计划根据第二列的值将地图分类到不同文件夹。目前单个地址生成地图的代码可正常运行,但遍历代码报错 TypeError: Cannot read property 'createFile' of undefined,同时不清楚如何正确生成Blob并保存为PNG格式。
现有错误代码
function save_adresses() { var sheet = SpreadsheetApp.getActiveSheet(); var addresses = sheet.getRange(1,1,13,1).getValues() for (var i = 0; i <= 8; i = i + 1) { Maps.newStaticMap() .setMapType(Maps.StaticMap.Type.SATELLITE) .setCenter(addresses[i]) .setZoom(19) .getBlob() .DriveApp.createFile(addresses[i]) .getAs('image/png') } }
错误原因分析
- 链式调用逻辑错误:
getBlob()返回的是Blob对象,该对象没有DriveApp属性,直接链式调用.DriveApp.createFile()会导致找不到该属性,触发报错。正确的做法是用DriveApp.createFile()方法接收Blob对象。 - 数组取值错误:
getValues()返回的是二维数组,addresses[i]是一个包含单个元素的数组(如["XX街道XX号"]),直接传给setCenter或作为文件名会引发异常,需要取出数组内的具体值addresses[i][0]。 - 格式转换位置错误:
getAs('image/png')应该在Blob对象上调用,而非createFile返回的File对象之后。
修正后的代码
function saveAddresses() { var sheet = SpreadsheetApp.getActiveSheet(); // 获取A列第1到13行的地址数据 var addresses = sheet.getRange(1, 1, 13, 1).getValues(); for (var i = 0; i < addresses.length; i++) { var address = addresses[i][0]; // 跳过空地址 if (!address) continue; // 生成卫星地图Blob并指定为PNG格式 var mapBlob = Maps.newStaticMap() .setMapType(Maps.StaticMap.Type.SATELLITE) .setCenter(address) .setZoom(19) .getBlob() .getAs('image/png'); // 保存到Google Drive根目录,文件名带PNG后缀 DriveApp.createFile(mapBlob, address + '.png', MimeType.PNG); } }
后续按第二列分类到不同文件夹的实现思路
- 获取分类值:在循环内通过行号获取第二列的分类内容(注意表格行号从1开始,对应循环索引i+1)。
- 查找/创建文件夹:检查Drive中是否存在对应分类的文件夹,不存在则创建。
- 保存到目标文件夹:调用目标文件夹的
createFile方法,而非DriveApp的全局方法。
示例代码片段:
// 在循环内部添加以下代码 var category = sheet.getRange(i+1, 2).getValue(); var targetFolder = null; // 查找同名文件夹 var folders = DriveApp.getFoldersByName(category); if (folders.hasNext()) { targetFolder = folders.next(); } else { // 不存在则新建文件夹 targetFolder = DriveApp.createFolder(category); } // 将地图文件保存到目标文件夹 targetFolder.createFile(mapBlob, address + '.png', MimeType.PNG);
内容的提问来源于stack exchange,提问作者Julie-Anne
相关产品推荐
相关产品推荐

