使用 Google 应用程序脚本将多个 JSON 字符串拆分为结构化 table
Split multiple JSON string into strucutred table using Google App Script
我正在尝试将具有 ID 和 JSON 字符串的数据集拆分为结构化的 table。
困难的部分是我需要它是动态的,JSON 字符串经常变化,我希望标题由当时输入列中的唯一值确定。如果字符串更改而无需重新编码脚本,我需要脚本能够创建标题。
我们有大约 150 个不同的 JSON 字符串,我们希望在其中使用此脚本,而无需为每个字符串重新编码。每个字符串都有很多数据点。
我有一个脚本在工作,但它把它们一个一个地拆分,需要构建一些可以一次性完成的东西,方法是遍历 B 中的所有输出并为所有字符串中的每个唯一字段创建一个列,然后填充它们。
如果我直接粘贴附加信息,脚本就可以工作,但是我无法从 sheet
中读取
var inputsheet = SpreadsheetApp.getActive().getSheetByName("Input");
var outputsheet = SpreadsheetApp.getActive().getSheetByName("Current Output");
var additionalinfo = inputsheet.getRange(1,1).getValue()
Logger.log(additionalinfo)
var rows = [],
data;
for (i = 0; i < additionalinfo.length; i++) {
for (j in additionalinfo[i]) {
dataq = additionalinfo[i][j];
Logger.log(dataq);
rows.push([j, dataq]);
}
dataRange = outputsheet.getRange(1, 1, rows.length, 2);
dataRange.setValues(rows);
}
}
这是示例数据的 link。请注意,示例 1 和 2 中有不同的标题,我们需要脚本来识别这一点并为两者创建标题
https://docs.google.com/spreadsheets/d/1BMiVuAgDbibLw6yUG3IZ9iw4MZTaVVegkw_k3ItQ4mU/edit#gid=0
试试这个根据已阅读的 json 生成动态 headers 的脚本。它收集所有 json 数据,获取其密钥,并删除重复项。
脚本:
function JSON_SPLITTER() {
var spreadsheet = SpreadsheetApp.getActive();
var inputsheet = spreadsheet .getSheetByName("Input");
var outputsheet = spreadsheet .getSheetByName("Current Output");
var additionalinfo = inputsheet.getDataRange().getValues();
var keys = [];
// prepare the additionalInfo data to be parsed for later
var data = additionalinfo.slice(1).map(row => {
// collect all keys in an array
if (JSON.parse(row[1]).additionalInfo) {
keys.push(Object.keys(JSON.parse(row[1]).additionalInfo));
return JSON.parse(row[1]).additionalInfo;
}
else {
keys.push(Object.keys(JSON.parse(row[1])));
return JSON.parse(row[1]);
}
});
// unique values of keys, modified to form header
var headers = [...new Set(keys.flat())]
// Add A1 as the header for the ids
headers.unshift(additionalinfo[0][0]);
// set A1 and keys as headers
var output = [headers]
// build output array
additionalinfo.slice(1).forEach((row, index) => {
var outputRow = [];
headers.forEach(column => {
if(column == 'Contract Oid')
outputRow.push(row[0]);
else
outputRow.push(data[index][column]);
});
output.push(outputRow)
});
outputsheet.getRange(1, 1, output.length, output[0].length).setValues(output);
}
输出:
更新:
- 修改了无-
additionalInfo
键的脚本objects。
我正在尝试将具有 ID 和 JSON 字符串的数据集拆分为结构化的 table。
困难的部分是我需要它是动态的,JSON 字符串经常变化,我希望标题由当时输入列中的唯一值确定。如果字符串更改而无需重新编码脚本,我需要脚本能够创建标题。
我们有大约 150 个不同的 JSON 字符串,我们希望在其中使用此脚本,而无需为每个字符串重新编码。每个字符串都有很多数据点。
我有一个脚本在工作,但它把它们一个一个地拆分,需要构建一些可以一次性完成的东西,方法是遍历 B 中的所有输出并为所有字符串中的每个唯一字段创建一个列,然后填充它们。
如果我直接粘贴附加信息,脚本就可以工作,但是我无法从 sheet
中读取
var inputsheet = SpreadsheetApp.getActive().getSheetByName("Input");
var outputsheet = SpreadsheetApp.getActive().getSheetByName("Current Output");
var additionalinfo = inputsheet.getRange(1,1).getValue()
Logger.log(additionalinfo)
var rows = [],
data;
for (i = 0; i < additionalinfo.length; i++) {
for (j in additionalinfo[i]) {
dataq = additionalinfo[i][j];
Logger.log(dataq);
rows.push([j, dataq]);
}
dataRange = outputsheet.getRange(1, 1, rows.length, 2);
dataRange.setValues(rows);
}
}
这是示例数据的 link。请注意,示例 1 和 2 中有不同的标题,我们需要脚本来识别这一点并为两者创建标题
https://docs.google.com/spreadsheets/d/1BMiVuAgDbibLw6yUG3IZ9iw4MZTaVVegkw_k3ItQ4mU/edit#gid=0
试试这个根据已阅读的 json 生成动态 headers 的脚本。它收集所有 json 数据,获取其密钥,并删除重复项。
脚本:
function JSON_SPLITTER() {
var spreadsheet = SpreadsheetApp.getActive();
var inputsheet = spreadsheet .getSheetByName("Input");
var outputsheet = spreadsheet .getSheetByName("Current Output");
var additionalinfo = inputsheet.getDataRange().getValues();
var keys = [];
// prepare the additionalInfo data to be parsed for later
var data = additionalinfo.slice(1).map(row => {
// collect all keys in an array
if (JSON.parse(row[1]).additionalInfo) {
keys.push(Object.keys(JSON.parse(row[1]).additionalInfo));
return JSON.parse(row[1]).additionalInfo;
}
else {
keys.push(Object.keys(JSON.parse(row[1])));
return JSON.parse(row[1]);
}
});
// unique values of keys, modified to form header
var headers = [...new Set(keys.flat())]
// Add A1 as the header for the ids
headers.unshift(additionalinfo[0][0]);
// set A1 and keys as headers
var output = [headers]
// build output array
additionalinfo.slice(1).forEach((row, index) => {
var outputRow = [];
headers.forEach(column => {
if(column == 'Contract Oid')
outputRow.push(row[0]);
else
outputRow.push(data[index][column]);
});
output.push(outputRow)
});
outputsheet.getRange(1, 1, output.length, output[0].length).setValues(output);
}
输出:
更新:
- 修改了无-
additionalInfo
键的脚本objects。