使用 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。