我有以下用于拆分 JSON 字串的腳本。
目前該腳本適用于某些人但不適用于其他人,有一個邊緣情況會破壞腳本,這是在第 2 行和突出顯示
的 RED 我希望腳本適用于任何 JSON 字串,不依賴于附加資訊標簽
我在這里創建了一個示例作業簿,以突出顯示打破拆分器的 JSON 字串拆分器示例
這里的任何幫助都會令人驚嘆!
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);
}
uj5u.com熱心網友回復:
雖然我不確定我是否能正確理解你的目標,但是下面的修改怎么樣?
從:
// 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
});
- 當我看到您的示例電子表格時,在您的示例 JSON 資料中,我發現雖然 的屬性
additionalInfo存在,但 的additionalInfo值為null。所以我提出了上面的修改。
筆記:
- 從您的腳本中,我猜到提示的輸入值是
DATA. - 此修改使用您提供的
Sample Input 1. 請注意這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/456281.html
上一篇:通過腳本在Google表格中生成表格時設定單元格或行/列數
下一篇:為什么我會收到此錯誤:TypeError:SpreadsheetApp.getSpreadsheetByIdisnotafunction
