[英]Google Apps Script OAuth2 Library Error for Service Accounts if private Key is not stored in apps script file directly
[英]Supply API key to avoid Hit Limit error from Maps Service in Apps Script
我有一个Google表格,可以通过Maps Service获取两个纬度/经度之间的行驶距离。 下面的函数有效,但是矩阵是4,500个单元格,因此出现“命中限制”错误。
如何在此处提供我的付费帐户的API密钥?
自定义功能
function drivingMeters(origin, destination) {
if (origin=='' || destination==''){return ''}
var directions = Maps.newDirectionFinder()
.setOrigin(origin)
.setDestination(destination)
.getDirections();
return directions.routes[0].legs[0].distance.value ;
}
使用示例:
A1: =drivingMeters($E10,G$9)
Where E10 = 42.771328,-91.902281
and G9 = 42.490390,-91.1626620
根据文档,您应在调用其他方法之前使用身份验证详细信息初始化Maps服务 :
您的客户ID和签名密钥可以从Google Enterprise支持门户获取。 将这些值设置为
null
可返回使用默认配额限额。
我建议将这些值存储在PropertiesService
并使用CacheService
来提供快速访问。 使用这种方法,而不是在脚本项目的主体中编写它们,意味着如果您的脚本以库的形式发布,它们将不会被其他编辑器无意复制,推送到共享代码存储库或其他开发人员可见。
此外,我建议重写自定义函数以接受数组输入并返回适当的数组输出-这将有助于加快其执行速度。 Google在自定义功能页面上提供了一个示例: https : //developers.google.com/apps-script/guides/sheets/functions#optimization
使用道具/缓存的示例:
function authenticateMaps_() {
// Try to get values from cache:
const cache = CacheService.getScriptCache();
var props = cache.getAll(['mapsClientId', 'mapsSigningKey']);
// If it wasn't there, read it from PropertiesService.
if (!props || !props.mapsClientId || !props.mapsSigningKey) {
const allProps = PropertiesService.getScriptProperties().getProperties();
props = {
'mapsClientId': allProps.mapsClientId,
'mapsSigningKey': allProps.mapsSigningKey
};
// Cache these values for faster access (max 6hrs)
cache.putAll(props, 21600);
}
// Apply these keys to the Maps Service. If they don't exist, this is the
// same as being a default user (i.e. no paid quota).
Maps.setAuthentication(props.mapsClientId, props.mapsSigningKey);
}
function deauthMaps_() {
Maps.setAuthentication(null, null);
}
// Your called custom function. First tries without authentication,
// and then if an error occurs, assumes it was a quota limit error
// and retries. Other errors do exist (like no directions, etc)...
function DRIVINGMETERS(origin, dest) {
if (!origin || !destination)
return;
try {
return drivingMeters_(origin, dest);
} catch (e) {
console.error({
message: "Error when computing directions: " + e.message,
error: e
});
// One of the possible errors is a quota limit, so authenticate and retry:
// (Business code should handle other errors instead of simply assuming this :) )
authenticateMaps_();
var result = drivingMeters_(origin, dest);
deauthMaps_();
return result;
}
}
// Your implementation function.
function drivingMeters_(origin, dest) {
var directions = Maps.newDirectionFinder()
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.