Skip to content

Instantly share code, notes, and snippets.

@danielwestendorf
Created June 10, 2019 22:58
Show Gist options
  • Save danielwestendorf/255cd02b6244a06fb5e09bf5d391e198 to your computer and use it in GitHub Desktop.
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
/*
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