You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Google Apps Script函数读取单元格输入调用Google Places API获取信息

需求背景

我有一个开发了一段时间的项目,在本站得到了很多优质帮助,目前基本完成,只差最后一步功能实现即可正常运行。

该脚本作用于Google Sheet,可读取A列输入的地点名称,调用Google Places API查询对应地点的地址、电话等所需信息。

我现在需要实现单元格输入读取组件的功能,此前帮助我的用户给出以下代码:

function writeToSheet(){
  var ss = SpreadsheetApp.getActiveSheet();
  var data = COMBINED2("Food");
  var placeCid = data[4];
  var findText = ss.createTextFinder(placeCid).findAll();
  if(findText.length == 0){
    ss.getRange(ss.getLastRow()+1,1,1, data.length).setValues([data])
  }
} 

这段代码可通过TextFinder检查地点URL是否已存在于表格中,如果未查询到对应结果,就会调用COMBINED2()获取地点信息,再通过writeToSheet()将数据写入表格。

该用户同时指出:

你可以通过ss.getRange(range).getValue()方法让COMBINED2读取单元格输入内容作为参数

我没有编程基础,已经自行拼接了大部分代码,但需要帮助将上述单元格读取能力添加到现有代码中,欢迎各位提供帮助或指导。

完整初始代码如下:

// 该定位参数用于缩小搜索范围,例如你要做一份纽约酒吧的表格,就可以将参数设置为纽约的坐标
// 你可以从Google地图搜索的URL中获取对应坐标
const LOC_BASIS_LAT_LON = "40.74516247433546, -73.98621366765816"; // 示例:"37.7644856,-122.4472203"

function COMBINED2(text) {
  var API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';
  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,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 '请输入Google Places URL...';
  }

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

  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;
}

function getColumnLastRow(range){
  var ss = SpreadsheetApp.getActiveSheet();
  var inputs = ss.getRange(range).getValues();
  return inputs.filter(String).length;
}

function writeToSheet(){
  var ss = SpreadsheetApp.getActiveSheet();
  var data = COMBINED2("Food");
  var placeCid = data[4];
  var findText = ss.createTextFinder(placeCid).findAll();
  if(findText.length == 0){
    ss.getRange(ss.getLastRow()+1,1,1, data.length).setValues([data])
  }
}

function onOpen() {
  const ui = SpreadsheetApp.getUi();  
  ui.createMenu("自定义菜单")
      .addItem("获取地点信息","writeToSheet")
      .addToUi();
}

需求更新

补充说明此前未表述清楚的需求:
我希望可以在A列输入地点名称,之后点击自定义菜单运行函数,如果TextFinder未查询到对应地点的Place URL,就发起查询并将数据写入表格。
我希望通过该逻辑限制API调用次数,同时确保数据写入表格后,每次重新打开表格无需重复拉取数据。


最终实现方案

最终可用代码如下:

// 该定位参数用于缩小搜索范围,例如你要做一份纽约酒吧的表格,就可以将参数设置为纽约的坐标
// 你可以从Google地图搜索的URL中获取对应坐标
const LOC_BASIS_LAT_LON = "ENTER_GPS_COORDINATES_HERE"; // 示例:"37.7644856,-122.4472203"

function COMBINED2(text) {
  var API_KEY = 'ENTER_API_KEY_HERE';
  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,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 '请输入Google Places URL...';
  }

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

  var weekdays = '';
  if (place.opening_hours && place.opening_hours.weekday_text) {
    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;
}

function writeToSheet() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const FIRST_ROW = 2;
  const sourceData = sheet.getRange(FIRST_ROW, 1, sheet.getLastRow()-FIRST_ROW+1, 6)
                          .getValues().filter(row => String(row[0]));
  for (let i = 0; i < sourceData.length; i++) {
    const sourceRow = sourceData[i];
    if (sourceRow[4] === "") {
      const text = sourceRow[0];
      const data = COMBINED2(text);
      sheet.getRange(FIRST_ROW+i, 2, 1, data.length).setValues([data]);
    }
  }
}

function onOpen() {
  const ui = SpreadsheetApp.getUi();  
  ui.createMenu("自定义菜单")
      .addItem("获取地点信息","writeToSheet")
      .addToUi();
}

内容的提问来源于stack exchange,提问作者Jeff Abrahams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:36:03