如何让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
相关产品推荐
相关产品推荐

