Last active
March 8, 2021 20:31
-
-
Save apimaker001/3c25b554f8ef36ae42cee99527d40b9d to your computer and use it in GitHub Desktop.
Google Sheets + Apps script + RapidAPI + Zillow
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var endpoint = 'https://zillow-com1.p.rapidapi.com/property'; | |
var key = ''; | |
function _getValue(obj, path){ | |
var keys = path.split('.'); | |
var key = keys.shift(); | |
var value = null; | |
if (obj.hasOwnProperty(key)){ | |
var value = obj[key]; | |
} | |
if (typeof value == "object" && value != null){ | |
return _getValue(value, keys.join('.')); | |
} else { | |
return value; | |
} | |
} | |
function loadKey(){ | |
var spreadsheet = SpreadsheetApp.getActive(); | |
var settingsSheet = spreadsheet.getSheetByName('Settings'); | |
var keySettingsRange = settingsSheet.getRange(1,2); | |
var keySettingsValue = keySettingsRange.getValues(); | |
key= keySettingsValue[0][0]; | |
} | |
function onOpen() { | |
var spreadsheet = SpreadsheetApp.getActive(); | |
var menuItems = [ | |
{name: 'Get property price...', functionName: 'getPropertyPriceByRange'}, | |
{name: 'Get property status...', functionName: 'getPropertyStatusByRange'} | |
]; | |
spreadsheet.addMenu('Zillow API', menuItems); | |
loadKey(); | |
if (!key) { | |
settingsSheet.activate(); | |
Browser.msgBox('Error', 'Not found RapidAPI key at Settings spreadsheet!', | |
Browser.Buttons.OK); | |
return; | |
} else { | |
Logger.log('Key loaded: ' + key); | |
} | |
} | |
function getPropertyByZpId(zpid) | |
{ | |
var cache = CacheService.getScriptCache(); | |
var cached = cache.get(zpid); | |
// cache.remove(zpid); | |
if (cached == null) { | |
if (key) { | |
Logger.log('fetch data for zpid: ' + zpid); | |
var fetchOptions = { | |
'headers': { | |
'x-rapidapi-key': key | |
}, | |
}; | |
var url = endpoint + '?zpid=' + zpid; | |
var jsondata = UrlFetchApp.fetch(url, fetchOptions); | |
var contentText = jsondata.getContentText(); | |
cache.put(zpid, contentText, 1500); | |
} else { | |
throw 'Not found RapidAPI key at Settings spreadsheet!'; | |
} | |
} else { | |
Logger.log('Use cached data for zpid: ' + zpid); | |
var contentText = cached; | |
} | |
return JSON.parse(contentText); | |
} | |
function getPropertyValueByKey(zpid, key) | |
{ | |
try { | |
var property = getPropertyByZpId(zpid); | |
var result = _getValue(property, key); | |
return result; | |
} catch (err){ | |
Logger.log(err); | |
return err.message; | |
} | |
} | |
function getPropertyPriceByRange(){ | |
getPropertyByRange('price'); | |
} | |
function getPropertyStatusByRange(){ | |
getPropertyByRange('homeStatus'); | |
} | |
function getPropertyByRange(key){ | |
var sheet = SpreadsheetApp.getActiveSheet(); | |
var activeRange = sheet.getActiveRange(); | |
var newRangeData = _getNewRangeFromActiveRange(activeRange); | |
var newRange = sheet.getRange(newRangeData.firstRow, sheet.getLastColumn()+1, newRangeData.rowsNum, 1); | |
var values = _getPropertyDataList(activeRange.getValues(), key); | |
newRange.setValues(values); | |
} | |
function _getNewRangeFromActiveRange(activeRange){ | |
var lastRow = activeRange.getLastRow(); | |
var rowsNum = activeRange.getNumRows(); | |
var firstRow = lastRow-rowsNum+1; | |
return {firstRow: firstRow, rowsNum: rowsNum}; | |
} | |
function getPropertyPriceByCustomRange(){ | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
var sheet = ss.getSheetByName("main"); | |
var settingsSheet = ss.getSheetByName('Settings'); | |
var zpidSettingsRange = settingsSheet.getRange(2,2); | |
var zpidSettingsValue = zpidSettingsRange.getValues(); | |
var zpidStart = zpidSettingsValue[0][0]; | |
var startRange = sheet.getRange(zpidStart); | |
var lastRow = sheet.getLastRow(); | |
var firstRow = startRange.getRow(); | |
var firstColumn = startRange.getColumn(); | |
var numRows = lastRow - firstRow + 1; | |
var activeRange = sheet.getRange(firstRow, firstColumn, numRows, 1); | |
var newRangeData = _getNewRangeFromActiveRange(activeRange); | |
var newRange = sheet.getRange(newRangeData.firstRow, sheet.getLastColumn()+1, newRangeData.rowsNum, 1); | |
var values = _getPropertyDataList(activeRange.getValues(), 'price'); | |
newRange.setValues(values); | |
} | |
function _getPropertyDataList(zpidList, key) { | |
loadKey(); | |
var values = []; | |
for (var i = 0; i < zpidList.length; i++) { | |
if (zpidList[i][0] && Number(zpidList[i][0])) { | |
values.push([getPropertyValueByKey(zpidList[i][0], key)]); | |
} else { | |
Logger.log('zpid is not number!'); | |
} | |
} | |
return values; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment