Skip to content

Instantly share code, notes, and snippets.

@apimaker001
Last active March 8, 2021 20:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save apimaker001/3c25b554f8ef36ae42cee99527d40b9d to your computer and use it in GitHub Desktop.
Save apimaker001/3c25b554f8ef36ae42cee99527d40b9d to your computer and use it in GitHub Desktop.
Google Sheets + Apps script + RapidAPI + Zillow
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