Nieprawidłowy ładunek JSON w Sheets.Spreadsheets.BatchUpdate
Próbuję pracować z Arkuszami.Spreadsheets.Get and Sheets.Spreadsheets.Batchupdate. Próbuję pobrać formatowanie z jednego arkusza kalkulacyjnego i wkleić to formatowanie do innego. To jest po prostu dowód słuszności koncepcji do dalszego zastosowania. Otrzymuję błąd ładunku JSON z następującym kodem i nie mogę dowiedzieć się, jak go sformatować, aby wstawić tablicę.
function Test() {
//sheets[].data[].rowData[].values[].cellData.effectiveFormat.backgroundColor
var TestArray = Sheets.Spreadsheets.get("1eAq-RbtrCSMRPZ0p7XIpG3vd29yL-3SQ3D3JGyiUhKg", {
ranges:"Awesome!A1:C3",
fields:"sheets(data(rowData(values(effectiveFormat.backgroundColor))))"
});
var spreadsheetId = "1eAq-RbtrCSMRPZ0p7XIpG3vd29yL-3SQ3D3JGyiUhKg";
var result = Sheets.Spreadsheets.batchUpdate({
requests: [{
updateCells: {
rows: [{
values: [{
userEnteredValue: {
stringValue: 'Test String'
}, userEnteredFormat: {
backgroundColor: TestArray
}
}]
}],//rows
fields: 'userEnteredValue.stringValue,userEnteredFormat.backgroundColor',
start: {
sheetId: 1616717220,
rowIndex: 0,
columnIndex: 0
}
}//update cell
}]//requests
}, spreadsheetId)
} ```
**EDIT:**
Rebuilt function copying both Text and Background colors.
function myFunction() {
var TestArray = Sheets.Spreadsheets.get("1eAq-RbtrCSMRPZ0p7XIpG3vd29yL-3SQ3D3JGyiUhKg", {
ranges:"Awesome!A1:C3",
fields:"sheets(data(rowData(values(effectiveFormat.backgroundColor))))"
});
var backgroundColors = TestArray["sheets"][0]["data"][0]["rowData"]
.map(row => row["values"]
.map(value => value["effectiveFormat"]["backgroundColor"]));
var TotalText = Sheets.Spreadsheets.Values.get("1eAq-RbtrCSMRPZ0p7XIpG3vd29yL-3SQ3D3JGyiUhKg", "Awesome!A1:C3").values;
//Map Text
var textrows = TotalText.map(rowText => {
return {
values: rowText.map(cellText => {
return {
userEnteredValue: {
stringValue: cellText
}
}
})
}
})
//Map Background Colors
var colorrows = backgroundColors.map(rowColors => {
return {
values: rowColors.map(cellColor => {
return {
userEnteredFormat: {
backgroundColor: cellColor
}
}
})
}
})
var spreadsheetId = "1eAq-RbtrCSMRPZ0p7XIpG3vd29yL-3SQ3D3JGyiUhKg";
var result = Sheets.Spreadsheets.batchUpdate({
requests: [{
updateCells: {
rows: textrows,
fields: 'userEnteredValue.stringValue',
start: {
sheetId: 1616717220,
rowIndex: 0,
columnIndex: 0
}
}//update cell
},{
updateCells: {
rows: colorrows,
fields: 'userEnteredFormat.backgroundColor',
start: {
sheetId: 1616717220,
rowIndex: 0,
columnIndex: 0
}
}
}]
}, spreadsheetId)
}
Edit #2:
function myFunctionOneRequest() {
var TestArray = Sheets.Spreadsheets.get("1eAq-RbtrCSMRPZ0p7XIpG3vd29yL-3SQ3D3JGyiUhKg", {
ranges:"Awesome!A1:C3",
fields:"sheets(data(rowData(values(effectiveFormat.backgroundColor))))"
});
var backgroundColors = TestArray["sheets"][0]["data"][0]["rowData"]
.map(row => row["values"]
.map(value => value["effectiveFormat"]["backgroundColor"]));
var TotalText = Sheets.Spreadsheets.Values.get("1eAq-RbtrCSMRPZ0p7XIpG3vd29yL-3SQ3D3JGyiUhKg", "Awesome!A1:C3").values;
//Map Text
var textrows = TotalText.map((rowText,i) => {
return {
values: rowText.map((cellText,j) => {
return {
userEnteredValue: {
stringValue: cellText
}
}
})
}
})
//Map Background Colors
var colorrows = backgroundColors.map((rowColors,k) => {
return {
values: rowColors.map((cellColor,l) => {
return {
userEnteredFormat: {
backgroundColor: cellColor
}
}
})
}
})
var spreadsheetId = "1eAq-RbtrCSMRPZ0p7XIpG3vd29yL-3SQ3D3JGyiUhKg";
var result = Sheets.Spreadsheets.batchUpdate({
requests: [{
updateCells: {
rows: textrows,
fields: 'userEnteredValue.stringValue',
start: {
sheetId: 1616717220,
rowIndex: 0,
columnIndex: 0
}
}//update cell
}]
}, spreadsheetId)
}
Odpowiedzi
Kwestia:
Dostarczasz w Zasobie arkusza kalkulacyjnego ( TestArrayzwróconym przez arkusz kalkulacyjny.get ), gdzie należy podać kolor . W związku z tym otrzymujesz nieprawidłowy błąd ładunku JSON.
Dzieje się tak, ponieważ fieldsparametr będzie filtrować, które zagnieżdżone pola zostaną wypełnione w odpowiedzi na Twoje pierwsze wywołanie, ale te zagnieżdżone pola będą nadal zagnieżdżone w Twoim JSON i będziesz musiał uzyskać do nich dostęp, określając odpowiednie właściwości nadrzędne.
Rozwiązanie:
Odpowiedź na Twoje pierwsze wezwanie brzmi następująco:
{
"sheets": [
{
"data": [
{
"rowData": [
{
"values": [
{
"effectiveFormat": {
"backgroundColor": {
"red": 1,
"green": 1,
"blue": 1
}
}
},
// Other cells in row
]
},
// Other rows in the requested range
]
} // Only one range is specified, so there's only one GridData element
]
},
// Other sheets
]
}
Na przykład, jeśli chcesz uzyskać dostęp do backgroundColorpierwszej komórki pierwszego wiersza w żądanym zakresie, wykonaj następujące czynności:
var backgroundColor = TestArray["sheets"][0]["data"][0]["rowData"][0]
["values"][0]["effectiveFormat"]["backgroundColor"];
Lub alternatywnie, jeśli chcesz pobrać tablicę 2D backgroundColorswszystkich komórek w żądanym zakresie, możesz zrobić to:
var backgroundColors = TestArray["sheets"][0]["data"][0]["rowData"]
.map(row => row["values"]
.map(value => value["effectiveFormat"]["backgroundColor"]));
Jeśli chcesz zaktualizować kilka komórek, musisz odpowiednio edytować treść żądania, dodając dodatkowe rowsi valuesdo odpowiednich tablic.
Edytować:
Na przykład, jeśli chcesz, aby komórki docelowe miały te same kolory tła co źródło i wszystkie miały tę wartość Test String, możesz zbudować treść żądania w następujący sposób:
var rows = backgroundColors.map(rowColors => {
return {
values: rowColors.map(cellColor => {
return {
userEnteredValue: {
stringValue: 'Test String'
},
userEnteredFormat: {
backgroundColor: cellColor
}
}
})
}
})
var result = Sheets.Spreadsheets.batchUpdate({
requests: [{
updateCells: {
rows: rows,
fields: 'userEnteredValue.stringValue,userEnteredFormat.backgroundColor',
start: {
sheetId: 1616717220,
rowIndex: 0,
columnIndex: 0
}
}//update cell
}]//requests
}, spreadsheetId)
Jeśli każda komórka powinna mieć różne wartości ciągów, należy je przechowywać w tablicy 2D i podawać w mapmetodach, zamiast Test Stringokreślać odpowiednie indeksy (podawane jako opcjonalny parametr w każdej z nich map).
Edycja 2:
W celu aktualizacji obie wartości i kolory Tło z tego samego wniosku, można po prostu iterację jednego z nich mapi używać odpowiednich parametrów wskaźnikowych (są opcjonalne parametry mapmetody, zwanej ia jw próbce poniżej), aby uzyskać dostęp do różnych wartości drugiego.
Na przykład, jeśli backgroundColorsi stringstablice 2D, których chcesz użyć do zbudowania rows, możesz to zrobić:
var backgroundColors = [["2D array with colors"]];
var strings = [["2D array with strings"]];
var rows = backgroundColors.map((rowColors,i) => {
return {
values: rowColors.map((cellColor,j) => {
return {
userEnteredValue: {
stringValue: strings[i][j]
},
userEnteredFormat: {
backgroundColor: cellColor
}
}
});
}
});