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
相关产品推荐
相关产品推荐

