只有在没有获取数据的情况下,如何才能使我的函数 运行 ?

How can I make my function run only if there is no fetched data?

我有一个 Google Apps 脚本项目,我可以在其中在 Google Sheet 的 A 列中输入位置名称,并使用 Google 地点 API。我一直在研究这个 for a bit,我最近的修订旨在解决一个问题,即我的函数发出了太多请求,导致我在 Google 云平台上耗尽了 200 美元的免费信用额度.

我注意到每次我打开 Google Sheet 时,它都必须再次获取所有数据,通过更多的请求来查找它已经找到的信息。

为了获取所有信息并将其保存在我的 Sheet 中,我最好的选择是什么,这样它就不会在每次打开 Sheet 时都发出新的信息请求?只是一个 If 语句,用于检查一旦函数获得 运行?

,其中一个单元格中是否已经有一个值被填充

下面是我的代码。现在,我只是在单元格 B2 中 运行 =COMINED2(A2) 来获取 A2 中位置的信息,并将其放置在 B2、C2、D2、E2 等中。如果人们有其他东西,我很乐意重新配置有什么建议吗?

function COMBINED2(text) {
  var API_KEY = 'AIzaSyvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxQ';
  var baseUrl = 'https://maps.googleapis.com/maps/api/place/findplacefromtext/json';
  var queryUrl = baseUrl + '?input=' + text + '&inputtype=textquery&key=' + API_KEY + "&locationbias=point:" + LOC_BASIS_LAT_LON;
  var response = UrlFetchApp.fetch(queryUrl);
  var json = response.getContentText();
  var placeId = JSON.parse(json);
  var ID = placeId.candidates[0].place_id;

  var fields = 'name,geometry,formatted_address,formatted_phone_number,website,url,types,opening_hours';
  var baseUrl2 = 'https://maps.googleapis.com/maps/api/place/details/json?placeid=';
  var queryUrl2 = baseUrl2 + ID + '&fields=' + fields + '&key='+ API_KEY + "&locationbias=point:" + LOC_BASIS_LAT_LON;

  if (ID == '') {
    return 'Give me a Google Places URL...';
  }

  var response2 = UrlFetchApp.fetch(queryUrl2);
  var json2 = response2.getContentText();
  var place = JSON.parse(json2).result;

  var placeName = place.name;
  var placeAddress = place.formatted_address;
  var placePhoneNumber = place.formatted_phone_number;
  var placeWebsite = place.website;
  var placeURL = place.url;  

  var weekdays = '';
  place.opening_hours.weekday_text.forEach((weekdayText) => {
    weekdays += ( weekdayText + '\r\n' );
  } );

  var data = [ [
    place.name,
    place.formatted_address,
    place.formatted_phone_number,
    place.website,
    place.url,
    weekdays.trim(),
  
  ] ];

  return data;
}

我认为自定义公式不适用于您的情况,因为自定义公式应该独立于范围,即它不应检查 特定 单元格或范围是否有价值

您最好创建一个调用 COMBINED2 的常规 Apps 脚本函数,然后使用脚本 UI 手动触发它,或者可能将其分配给按钮。

// this function calls COMBINED2()
function call_COMBINED2() {
  var ss = SpreadsheetApp.getActiveSheet();
  var text = ss.getRange("A2").getValue();
  var data = COMBINED2(text);
  var dest = ss.getRange("B2:G2");
  dest.setValues(data);
}