You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Google表单绑定脚本调用Maps遇配额限制,求免费解决方案

解决Google Apps Script调用Maps服务配额超限问题(非付费方案)

嘿,我明白你遇到的问题了——作为童子军团的非盈利项目,肯定不想为Maps服务付费,同时还被配额限制卡了脖子。别担心,咱们有几个免费的解决方案可以试试,都是针对你这种场景的:

1. 优化调用逻辑,缓存重复请求

Google Apps Script原生的Maps服务免费配额有限,但大部分情况下,你可能在重复查询相同的地址。咱们可以用缓存来存储已经查询过的结果,避免每次都调用Maps服务,直接减少请求量。

比如修改你的setLocation函数,加入缓存逻辑:

function setLocation() {
  var whereString = "这里替换成你实际的地址变量";
  var cache = CacheService.getScriptCache();
  var cachedLocation = cache.get(whereString);

  // 先检查缓存,有结果直接用
  if (cachedLocation) {
    var location = JSON.parse(cachedLocation);
    // 这里写你后续处理位置的逻辑
    Logger.log("使用缓存的位置:" + location.lat + ", " + location.lng);
    return;
  }

  // 缓存没有结果,再调用Maps服务
  try {
    var geocoder = Maps.newGeocoder();
    var response = geocoder.geocode(whereString);
    
    if (response.results.length > 0) {
      var location = response.results[0].geometry.location;
      // 把结果存入缓存,有效期设为1小时(3600秒),可以根据需求调整
      cache.put(whereString, JSON.stringify(location), 3600);
      // 后续处理逻辑...
      Logger.log("新获取的位置:" + location.lat + ", " + location.lng);
    } else {
      Logger.log("未找到对应地址");
    }
  } catch (e) {
    Logger.log("Maps服务调用失败:" + e.message);
    // 可以加个提示,比如通知表单提交者稍后重试
  }
}

另外,如果是批量处理地址,记得在每次调用之间加一点延迟,避免短时间内请求过于密集:

// 每次调用后延迟200毫秒
Utilities.sleep(200);

2. 改用Google Geocoding API(通过URL Fetch调用)

你已经有Maps API密钥了,虽然用不了Maps.setAuthentication(),但可以直接通过HTTP请求调用Google的Geocoding API——这个API有独立的免费配额(每月40,000次请求),和Apps Script原生服务的配额不共享,能帮你缓解压力。

注意:免费版的Geocoding API有速率限制(每秒最多5次请求),所以一定要结合缓存和延迟使用。示例代码如下:

function getLocationWithAPIKey(address) {
  var apiKey = "你的Maps API密钥";
  var encodedAddress = encodeURIComponent(address);
  // 构造Geocoding API请求URL
  var requestUrl = `https://maps.googleapis.com/maps/api/geocode/json?address=${encodedAddress}&key=${apiKey}`;

  try {
    var response = UrlFetchApp.fetch(requestUrl);
    var result = JSON.parse(response.getContentText());

    if (result.status === "OK") {
      return result.results[0].geometry.location;
    } else {
      Logger.log("地址解析失败:" + result.status);
      return null;
    }
  } catch (e) {
    Logger.log("API请求出错:" + e.message);
    return null;
  }
}

3. 复用表单历史数据

如果你的表单绑定了Google Sheet,可以在处理新提交时,先检查Sheet里的历史记录——如果相同的地址已经被处理过,直接复用之前的位置结果,完全不用调用Maps服务。

比如可以写个函数查询Sheet里的历史地址:

function checkExistingLocation(address) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("表单响应");
  var data = sheet.getDataRange().getValues();
  
  // 遍历历史记录,查找匹配的地址
  for (var i = 1; i < data.length; i++) {
    if (data[i][1] === address) { // 假设地址存在第二列,根据实际情况调整列索引
      return { lat: data[i][2], lng: data[i][3] }; // 假设经纬度存在第三、四列
    }
  }
  return null;
}

4. 利用Google Cloud免费额度

Google Cloud给新用户提供12个月的免费使用额度,其中Geocoding API的免费额度和普通免费版一致,但如果你的项目还没关联Google Cloud,可以把Apps Script项目关联过去,这样能更清晰地监控API使用情况,避免不小心超配额。

关联步骤很简单:在Apps Script编辑器右上角点击「项目设置」,勾选「显示appsscript.json清单文件」,然后在清单里确保包含必要的权限(比如https://www.googleapis.com/auth/script.external_request用于URL Fetch),之后在Google Cloud控制台关联你的Apps Script项目即可。

最后提醒

所有免费方案的核心都是减少不必要的请求——缓存、复用历史数据、控制请求速率,这三点做到了,基本能解决配额超限的问题。另外,作为非盈利的童子军团项目,如果后续确实需要更多配额,也可以尝试申请Google的非盈利组织免费配额豁免,不过先试试上面的方法应该足够了。

内容的提问来源于stack exchange,提问作者Troop276 CrossroadsOfAmericaCo

火山引擎 最新活动