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

Google Sheets调用OpenWeather API脚本授权被阻止的解决方法求助

Google Sheets OpenWeather API脚本授权被拦截问题解决

我们有一个用于Google Sheets的OpenWeather API脚本,运行时Google拒绝授权。该脚本调用OpenWeather API获取城市级天气数据(气温、天气状况等)。已知部分App Script会因安全原因被拦截,但未找到具体解决步骤。

拦截提示信息:

此应用被阻止
该应用尝试访问您Google账户中的敏感信息,为保护账户安全,Google已阻止此访问

脚本片段

var WEATHER_SHEET = 'weather_feed'
var API_KEY_SHEET = 'API_key'
var BASE_API = 'http://api.openweathermap.org/data/2.5/group'
var HOW_MANY_CITIES_FETCHED_IN_ONE_CALL = 20
var CITY_ID_COLUMN = 'openweather_city_id'

完整代码

var WEATHER_SHEET = 'weather_feed'
var API_KEY_SHEET = 'API_key'
var BASE_API = 'http://api.openweathermap.org/data/2.5/group'
var HOW_MANY_CITIES_FETCHED_IN_ONE_CALL = 20
var CITY_ID_COLUMN = 'openweather_city_id'

function updateContent() {
  var apiSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(API_KEY_SHEET)
  API_KEY =    apiSheet.getRange("A2").getValue()
  
  var mainSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(WEATHER_SHEET)
  var cityIds = getColumnFromSheetAsArray(mainSheet, CITY_ID_COLUMN)
  var weatherData = chunkArray(cityIds, HOW_MANY_CITIES_FETCHED_IN_ONE_CALL).reduce(function(acc, ids) {
    return acc.concat(getCurrentWeatherForCities(ids))
  }, []).map(flattenOpenWeatherObject)
  
  writeData(mainSheet, weatherData)
}

function chunkArray(arr, len) {
  var chunks = []
  var i = 0
  var n = arr.length
  while (i < n) {
    chunks.push(arr.slice(i, i += len))
  } return chunks
}

function getJSON(url) {
  var response = UrlFetchApp.fetch(url)
  return JSON.parse(response.getContentText())
} 

function getIndexForColumn(sheet, columnHeader) {
  var headerData = sheet.getSheetValues(1, 1, 1, sheet.getLastColumn())[0]
  return headerData.indexOf(columnHeader)
}

function getColumnFromSheetAsArray(sheet, columnHeader) {
  var index = getIndexForColumn(sheet, columnHeader)
  var rows = sheet.getSheetValues(2, 1, sheet.getLastRow()-1, sheet.getLastColumn())
  return rows.map(function(row) {
    return row[index]
  }) 
}

function writeData(sheet, data) {
  var headerData = Object.keys(data[0])
  sheet.getRange(2, 1, sheet.getMaxRows(),headerData.length).clearContent()
  sheet.getRange(1, 1, 1, headerData.length).setValues([headerData])
  var matrixData = data.map(function(el) {
    return headerData.map(function(key) {
      return el[key]
    })
  })
  sheet.getRange(2, 1, matrixData.length, headerData.length).setValues(matrixData)
}

function getOpenWeatherUrl(cityIds) {
  return BASE_API + '?units=metric&appid=' + API_KEY + '&id='+cityIds.join(',')
}

function getCurrentWeatherForCities(cityIds) {
  var weathers = getJSON(getOpenWeatherUrl(cityIds)).list || []
  return orderedWeathers(cityIds, weathers)
}  

function orderedWeathers(cityIds, weathers) {
  var weathersByID = weathers.reduce(function(weathersByID, weather) {
    weathersByID[weather.id] = weather;
    return weathersByID;
  }, {})

  return cityIds.map(function(cityId) {
    return weathersByID[cityId]
  })
}

function flattenOpenWeatherObject(weather) {
  return {
    weather_main: (weather.weather || [{}])[0].main || '', 
    description: (weather.weather || [{}])[0].description || '',
    temperature: (weather.main || {}).temp || 0,
    rain: (weather.rain || {})['3h'] || 0,
    wind_speed: (weather.wind || {})['speed'] || 0,
    snow: (weather.snow || {})['3h'] || 0,
    clouds: (weather.clouds || {})['all'] || 0,
    _timestamp: new Date()
  }
}

解决步骤

1. 明确权限触发原因

你的脚本用到了SpreadsheetApp(访问Google表格数据)和UrlFetchApp(对外发起网络请求),这两个属于Google定义的敏感权限,未经过审核的脚本会被默认拦截。

2. 部署为自用测试版本

  • 打开Google Apps Script编辑器,点击右上角「部署」→「新建部署」
  • 点击齿轮图标,选择「Web应用」
  • 配置参数:
    • 执行:选择「我自己」
    • 谁可以访问:选择「仅限我自己」
  • 点击「部署」,完成后重新运行脚本测试授权

3. 提交Google审核(需共享给外部用户时)

如果要让外部用户使用脚本,必须通过Google审核:

  • 进入「管理部署」,编辑对应部署
  • 将「谁可以访问」改为「任何人,甚至匿名」,此时会触发审核提示
  • 点击「提交审核」,按要求填写脚本用途、权限说明等信息,等待审核通过

4. 临时绕过拦截(仅测试用)

自己使用时遇到拦截,可临时跳过提示:

  • 在拦截页面右下角点击「高级」
  • 选择「转到[你的脚本名称](不安全)」,完成授权
    注意:此方法仅适合临时测试,长期使用仍需走正规部署或审核流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:15:55