GSheets JSON 字符串拆分器,动态列选择,动态 JSON 字符串

GSheets JSON String Splitter, with Dynamic Column Selection, Dynamic JSON Strings

我有下面的脚本用来拆分 JSON 字符串。
目前该脚本适用于某些人但不适用于其他人,有一种极端情况会破坏脚本,它位于第 2 行并突出显示为红色
我希望脚本适用于任何 JSON 字符串,而不依赖于附加信息标签
我在这里创建了一个示例工作簿来突出显示 JSON 字符串打破拆分器 Splitter Example
这里的任何帮助都会很棒!

function JSON_SPLITTER() {
  var ss = SpreadsheetApp.getActive();
  var inputsheet = ss.getSheetByName("Input");
  var outputsheet = ss.getSheetByName("Current Output");

  // 0. 
  var response = SpreadsheetApp.getUi().prompt('JSON String Heading', 'Enter Column Heading for the JSON String in Row 1 Exactly as it appears', SpreadsheetApp.getUi().ButtonSet.OK_CANCEL)
    var JSONcolumnname = response.getResponseText()

  // 1. Retrieve values from the input sheet.
  var [head, ...additionalinfo] = inputsheet.getDataRange().getValues();

  // 2. Check "DATA" column.
  var dataIdx = head.indexOf(JSONcolumnname);
  if (dataIdx == -1) throw new Error("No DATA column.");

  // 3. Retrieve all keys from JSON data of the "DATA" column.
  var headers = [... new Set(additionalinfo.flatMap(r => {
    var obj = JSON.parse(r[dataIdx]);
    return obj.hasOwnProperty("additionalInfo") ? Object.keys(obj.additionalInfo) : Object.keys(obj);
  }))];

  // 4. Create values of JSON data.
  var objValues = additionalinfo.map(r => {
    var obj = JSON.parse(r[dataIdx]);
    return obj.hasOwnProperty("additionalInfo") ? headers.map(h => obj.additionalInfo[h] || "") : headers.map(h => obj[h] || "");
  });

  // 5. Create output values.
  additionalinfo.forEach((r, i) => r.splice(dataIdx, 1, ...objValues[i]));
  head.splice(dataIdx, 1, ...headers)
  var res = [head, ...additionalinfo];

  // 6. Put the values to the output sheet.
  outputsheet.getRange(1, 1, res.length, res[0].length).setValues(res);
}

虽然我不确定我是否能正确理解你的目标,但是下面的修改怎么样?

发件人:

// 3. Retrieve all keys from JSON data of the "DATA" column.
var headers = [... new Set(additionalinfo.flatMap(r => {
  var obj = JSON.parse(r[dataIdx]);
  return obj.hasOwnProperty("additionalInfo") ? Object.keys(obj.additionalInfo) : Object.keys(obj);
}))];

// 4. Create values of JSON data.
var objValues = additionalinfo.map(r => {
  var obj = JSON.parse(r[dataIdx]);
  return obj.hasOwnProperty("additionalInfo") ? headers.map(h => obj.additionalInfo[h] || "") : headers.map(h => obj[h] || "");
});

收件人:

// 3. Retrieve all keys from JSON data of the "DATA" column.
var headers = [... new Set(additionalinfo.flatMap(r => {
  var obj = JSON.parse(r[dataIdx]);
  return obj.hasOwnProperty("additionalInfo") && obj.additionalInfo ? Object.keys(obj.additionalInfo) : Object.keys(obj); // Modified
}))];

// 4. Create values of JSON data.
var objValues = additionalinfo.map(r => {
  var obj = JSON.parse(r[dataIdx]);
  return obj.hasOwnProperty("additionalInfo") && obj.additionalInfo ? headers.map(h => obj.additionalInfo[h] || "") : headers.map(h => obj[h] || ""); // Modified
});
  • 当我看到您的示例 Spreadsheet 时,在您的示例 JSON 数据中,我发现虽然 additionalInfo 的 属性 存在,但 additionalInfonull。所以我提出了上面的修改。

注:

  • 根据你的脚本,我猜提示输入的值是DATA
  • 此修改使用了您提供的样本 sheet of Sample Input 1。请注意这一点。