我有以下用于拆分 JSON 字串的腳本。
目前,它在 Col A 中具有唯一 ID,在 Col B 中具有唯一 ID。我希望能夠在任何列中包含資料,前提是該列稱為 DATA。我希望腳本查找標題為資料的列,并將所有列保留在輸出選項卡中。
我嘗試了幾件事,但沒有一個有效。
我在這里創建了一個示例作業簿來展示我在拆分器示例
之后的內容,
這里的任何幫助都會很棒!
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熱心網友回復:
我相信你的目標如下。
Currently it has a unique ID in Col A, and the Data in Col B. I want to be able to have the data in any column, provided the column is called DATA. I want the script to look for column titled data and keep all columns left of that in the out put tab.例如,當您使用“Sample Data 1”表時,您希望實作以下情況。From:這是輸入表的標題行。
Contract Oid,Name,Age,DATATo:這是輸出表的標題行。在您的情況下,需要
DATA為每個輸入表搜索列。Contract Oid,Name,Age,{keys parsed from JSON data of "DATA"}
當我看到你的腳本時,似乎沒有搜索“DATA”列。如果我的理解是正確的,那么下面的示例腳本怎么樣?
示例腳本:
function JSON_SPLITTER2() {
var ss = SpreadsheetApp.getActive();
var inputsheet = ss.getSheetByName("Sample Data 1");
var outputsheet = ss.getSheetByName("Current Output");
// 1. Retrieve values from the input sheet.
var [head, ...additionalinfo] = inputsheet.getDataRange().getValues();
// 2. Check "DATA" column.
var dataIdx = head.indexOf("DATA");
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) : [];
}))];
// 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] || "") : Array(headers.length).fill("");
});
// 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);
}
- 在此腳本中,如果找不到“DATA”表,則會發生錯誤。如果要完成而不是報錯,請修改
if (dataIdx == -1) throw new Error("No DATA column.");為if (dataIdx == -1) return;
參考:
- 地圖()
- 拼接()
添加:
從您的回復來看,下面的示例腳本怎么樣?
示例腳本:
function JSON_SPLITTER3() {
var ss = SpreadsheetApp.getActive();
var inputsheet = ss.getSheetByName("Sample Data 1");
var outputsheet = ss.getSheetByName("Current Output");
// 1. Retrieve values from the input sheet.
var [head, ...additionalinfo] = inputsheet.getDataRange().getValues();
// 2. Check "DATA" column.
var dataIdx = head.indexOf("DATA");
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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/449481.html
下一篇:谷歌表上傳到GCS按鈕
