Я разработал пользовательскую функцию в Google Sheets, которая использует платный API. Проблема в том, что при каждом открытии листа функция обновляется (нормальное поведение листа Google). Как я могу обойти это? Как функция может работать только в случае изменения аргументов;в противном случае следует сохранить предыдущий результат.
Отредактировано
/**
* Gets distances
*
* @param {string} postalcode The origin
* @param {string} apikey The Google API key
* @param {Array} cities The destinations
* @return The distances
* @customfunction
*/
function C_GETDIST(postalcode, apikey, cities){
if(postalcode == "")
return "";
var placeid = GETPID(postalcode,apikey);
if(placeid == null)
return "NO RESULTS GEO-CODING API";
cities = cities.filter(function(city){ return city[0] !== "" ? true : false }).map(function(city){ return city[0].split(" ").join("+") });
cities = cities.join('|');
var d = new Date();
d.setDate(d.getDate() + 1);
d.setHours(9);
var time = Math.round(d/1000);
var endpoint = "https://maps.googleapis.com/maps/api/distancematrix/json";
var query_basic = "origins=place_id:" + placeid
+ "&"
+ "destinations=" + encodeURIComponent(cities)
+ "&"
+ "arrival_time=" + time
+ "&"
+ "key=" + apikey;
var query_transit = "mode=transit&transit_mode=rail";
var requests = [
endpoint + "?" + query_basic,
endpoint + "?" + query_basic + "&" + query_transit
];
var responses = UrlFetchApp.fetchAll(requests);
var distances_durations = [];
for(var i = 0;i < responses.length; i++){
var response = JSON.parse(responses[i].getContentText());
if(!i)
response["rows"][0]["elements"].map(function(element,index){
distances_durations[index] = element["status"] === "OK" ? [element["distance"]["value"],element["duration"]["value"]] : ["",""];
},distances_durations)
else
response["rows"][0]["elements"].map(function(element,index){
if(element["status"] === "OK")
distances_durations[index].push(element["distance"]["value"],element["duration"]["value"]);
else
distances_durations[index].push("","");
},distances_durations)
}
return distances_durations
}
/**
* Gets place id
*
* @param {string} postalcode Postal code
* @param {string} apikey The Google API key
* @return The place id
*/
function GETPID(postalcode, apikey){
var endpoint = "https://maps.googleapis.com/maps/api/geocode/json";
var query = "address=united%20kingdom&components=postal_code:";
var request = endpoint
+ "?"
+ query
+ encodeURIComponent(postalcode)
+ "&key="
+ apikey;
var response = UrlFetchApp.fetch(request);
var json = JSON.parse(response.getContentText());
return json["status"] === "OK" ? [json["results"][0]["place_id"]] : null; // added as an array item
}