Sheets.Spreadsheets.BatchUpdate ile Geçersiz JSON Yükü

Oct 05 2020

Sheets.Spreadsheets.Get ve Sheets.Spreadsheets.Batchupdate ile çalışmaya çalışıyorum. Bir elektronik tablodan biçimlendirme almaya ve bu biçimlendirmeyi diğerine yapıştırmaya çalışıyorum. Bu, daha fazla uygulama için sadece bir kavram kanıtıdır. Aşağıdaki kodla bir JSON yük hatası alıyorum ve Diziyi eklemek için nasıl biçimlendireceğimi bulamıyorum.


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)
}

Yanıtlar

Iamblichus Oct 05 2020 at 18:02

Konu:

En vermekteyiz Elektronik Tablo kaynağın ( TestArraytarafından döndürülen, spreadsheets.get bir sağlamalıdır) renk . Bu nedenle, geçersiz bir JSON yük hatası alıyorsunuz.

Bunun nedeni, fieldsparametrenin ilk çağrınızın yanıtında hangi iç içe geçmiş alanların doldurulacağını filtrelemesi, ancak bu iç içe geçmiş alanların yine JSON'nuzda iç içe kalması ve bunlara karşılık gelen üst özellikleri belirterek erişmeniz gerekmesidir.

Çözüm:

İlk aramanıza verilen yanıt şuna benzer:

{
  "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
  ]
}

Bu nedenle, örneğin, backgroundColoristenen aralıktaki ilk satırın ilk hücresine erişmek istiyorsanız , aşağıdakileri yapmanız gerekir:

var backgroundColor = TestArray["sheets"][0]["data"][0]["rowData"][0]
                                 ["values"][0]["effectiveFormat"]["backgroundColor"];

Alternatif olarak, backgroundColorsistenen aralıktaki tüm hücrelerin 2D dizisini almak istiyorsanız, şunu yapabilirsiniz:

var backgroundColors = TestArray["sheets"][0]["data"][0]["rowData"]
                       .map(row => row["values"]
                       .map(value => value["effectiveFormat"]["backgroundColor"]));

Birkaç hücreyi güncellemek istiyorsanız, istek gövdesini uygun şekilde düzenlemeniz ve bunlara karşılık gelen dizilere rowsve eklerini eklemeniz gerekir values.

Düzenle:

Örneğin, hedef hücrelerin kaynakla aynı arka plan renklerine sahip olmasını ve hepsinin değere sahip olmasını Test Stringistiyorsanız, istek gövdesini şu şekilde oluşturabilirsiniz:

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)

Her hücrenin farklı dize değerleri olması gerekiyorsa, bunları bir 2B dizide saklamanız ve karşılık gelen dizinleri (her birinde isteğe bağlı bir parametre olarak sağlanır) belirtmek mapyerine yöntemlerin içinde sağlamanız gerekir .Test Stringmap

Düzenleme 2:

Aynı istekle hem değerleri hem de arka plan renklerini güncellemek için, bunlardan birini yineleyebilir mapve karşılık gelen indeks parametrelerini (bunlar, aşağıdaki örnekte mapçağrılan ive jaşağıdaki örnekte bulunan isteğe bağlı parametrelerdir ) kullanarak farklı diğerinin değerleri.

Örneğin, oluşturmak için kullanmak istediğiniz if backgroundColorsve strings2B dizileri rows, bunu yapabilirsiniz:

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        
        }       
      }             
    });
  }
});