【问题标题】:Invalid JSON Payload with Sheets.Spreadsheets.BatchUpdate使用 Sheets.Spreadsheets.BatchUpdate 的 JSON 有效负载无效
【发布时间】:2020-10-13 22:27:40
【问题描述】:

尝试使用 Sheets.Spreadsheets.Get 和 Sheets.Spreadsheets.Batchupdate。我正在尝试从一个电子表格中提取格式并将该格式粘贴到另一个电子表格中。这只是进一步应用的概念证明。我收到以下代码的 JSON 有效负载错误,无法弄清楚如何格式化它以插入数组。


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

【问题讨论】:

  • 在黑暗中拍摄...我会尝试从 json 中删除 cmets。
  • 嗨,我发布了一个关于这个的答案。在为请求范围内的每个单元格检索 backgroundColors 后,如果您需要更多关于如何为您的 batchUpdate 构建请求正文的指示,请告诉我。

标签: google-apps-script google-sheets google-sheets-api batch-updates


【解决方案1】:

问题:

您在Spreadsheet resourceTestArray,由spreadsheets.get 返回)提供,您应该提供color。因此,您会收到无效的 JSON 有效负载错误。

这是因为fields 参数将过滤哪些嵌套字段将在您的第一次调用的响应中填充,但这些嵌套字段仍将嵌套在您的 JSON 中,您必须通过指定对应的父属性。

解决办法:

对您的第一个电话的响应类似于:

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

因此,例如,如果您想访问请求范围内第一行的第一个单元格的backgroundColor,您应该执行以下操作:

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

或者,或者,如果您想检索请求范围内所有单元格的backgroundColors 的二维数组,您可以这样做:

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

如果要更新多个单元格,则需要相应地编辑请求正文,将额外的 rowsvalues 添加到相应的数组中。

编辑:

例如,如果您希望目标单元格具有与源单元格相同的背景颜色,并且所有单元格的值都为 Test String,您可以像这样构建您的请求正文:

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)

如果每个单元格应该有不同的字符串值,您应该将它们存储在一个二维数组中,并在 map 方法中提供它们,而不是 Test String,指定相应的索引(在每个 @ 中作为可选参数提供987654337@).

编辑 2:

为了在同一个请求中同时更新值和背景颜色,你可以只用map遍历其中一个,并使用相应的索引参数(它们是map方法的可选参数,称为@ 987654340@ 和 j 在下面的示例中)来访问另一个的不同值。

例如,如果backgroundColorsstrings 是您要用于构建rows 的二维数组,您可以这样做:

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

【讨论】:

  • 感谢您的重播。 “如果你想检索请求范围内所有单元格的背景颜色的二维数组” - 我相信这正是我需要的方向。我不熟悉 .map 及其工作原理。现在我有一些阅读和测试要做!
  • @lamblichus - 一些关于使用 backgroundColors 构建请求正文的指导会很棒。
  • @LANCE 我用如何构建请求正文的示例编辑了我的答案,以便从源范围复制背景颜色。如果这能解决您的问题,请告诉我。
  • @LANCE 另外,如果您在将字符串值设置为目标范围时遇到问题,请告诉我。
  • @Lamblichus - 感谢您的帮助。使用您的代码,我提高了对 .map fxn 的理解。我已经使用重建的代码对我的原始问题添加了一个编辑。我绘制了文本数组,然后分别绘制了颜色数组。我使用了一个批处理请求,但需要两个单独的请求。这是最有效的方法吗?这对我来说是一大步,我为取得的进展感到非常自豪。再次感谢您的所有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2020-12-01
  • 2021-05-23
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
相关资源
最近更新 更多