В соответствии с документацией, вы должны инициализировать службу Карт с вашими данными аутентификации до вызова других методов:
Ваш идентификатор клиента и ключ подписи можно получить в 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()
...
}