Created
June 10, 2019 22:58
-
-
Save danielwestendorf/255cd02b6244a06fb5e09bf5d391e198 to your computer and use it in GitHub Desktop.
A Google App Script for cell(s) which contains JSON, extracting the JSON out to columns in the sheet
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
/* | |
Export a Google Sheet cell which is JSON into columns in the sheet | |
Expects row 1 to define headers for the sheet | |
given the following table | |
| A | B | |
------------------------------------------- | |
1|name|data | |
------------------------------------------- | |
2|Bob|{"foo": "bar", "baz": {"eeh": "ahh"}} | |
Running the code with B2 selected would result in | |
| A | B | C | D | |
------------------------------------------- | |
1|name|data|foo|baz | |
------------------------------------------- | |
2|Bob|{"foo": "bar", "baz": {"eeh": "ahh"}}|bar|{"eeh": "ahh"} | |
*/ | |
function onOpen() { | |
var spreadsheet = SpreadsheetApp.getActive(); | |
var menuItems = [ | |
{name: 'For selected cells...', functionName: 'extractJSON'} | |
]; | |
spreadsheet.addMenu('Extract JSON', menuItems); | |
} | |
function addCols(iRow, obj) { | |
var keys = Object.keys(obj); | |
var spreadsheet = SpreadsheetApp.getActive(); | |
var sheet = spreadsheet.getActiveSheet(); | |
var colMap = addHeaderCols(keys); | |
var rowValues = sheet.getRange(iRow , 1, 1, sheet.getLastColumn()).getValues()[0] | |
for (var i = 0; i < keys.length; i++) { | |
var key = keys[i] | |
var value = obj[key] | |
rowValues[colMap[key]] = value | |
} | |
sheet.getRange(iRow, 1, 1, rowValues.length).setValues([rowValues]) | |
} | |
// Iterate through the passed array of keys | |
// Add additional columns to row 1 if they key doesn't exist | |
function addHeaderCols(cols) { | |
var spreadsheet = SpreadsheetApp.getActive(); | |
var sheet = spreadsheet.getActiveSheet(); | |
var headerRow = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0] | |
var priorLength = headerRow.length | |
var colMap = {} | |
for (var i = 0; i < cols.length; i++) { | |
var index = headerRow.indexOf(cols[i]) | |
if (index == -1) { | |
headerRow.push(cols[i]); | |
colMap[cols[i]] = headerRow.length -1; | |
} else { | |
colMap[cols[i]] = index | |
} | |
} | |
if (priorLength != headerRow.length) { | |
sheet.getRange(1, 1, 1, headerRow.length).setValues([headerRow]) | |
} | |
return colMap | |
} | |
function extractJSON() { | |
var spreadsheet = SpreadsheetApp.getActive(); | |
var sheet = spreadsheet.getActiveSheet(); | |
var activeRange = sheet.getActiveRange(); | |
var metaDataValues = activeRange.getValues() | |
for (var iRow = 0; iRow < metaDataValues.length; iRow++) { | |
var row = metaDataValues[iRow]; | |
for (var iCol = 0; iCol < row.length; iCol++) { | |
var col = row[iCol]; | |
try { | |
var json = JSON.parse(col); | |
addCols(activeRange.getRowIndex() + iRow, json) | |
} catch (e) { | |
Logger.log(e) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment