如何使用batchUpdate在顶部插入新行,然后插入5个数据单元格?

时间:2019-08-19 12:49:22

标签: node.js google-sheets google-sheets-api

我正在使用Google Sheets Client库在电子表格中插入新行,然后在顶部行(但在标题行下方)写入一些数据。

batchUpdate方法应该允许使用它的用户以某种方式组合操作,如果一个操作失败,其他操作也将失败。就我而言,这是最好的选择,因为除非我已经成功地在顶部的第一行插入了新行,否则我不想在第二行插入数据。

但是,我对如何正确使用API​​尚不了解。结果是在顶部插入了新行,但是只有一个数据点正在写入第一个单元格,而不是该行中的所有5个单元格。这是API调用:

const sheets = google.sheets({ version: 'v4', auth });
sheets.spreadsheets.batchUpdate({
    spreadsheetId: SHEET_ID,
    "resource": {
        "requests": [
            {
                "insertDimension": {
                    "range": {
                        "sheetId": 0,
                        "dimension": "ROWS",
                        "startIndex": 1,
                        "endIndex": 2
                    },
                    "inheritFromBefore": false
                }
            },
            {
                "updateCells": {

                    "rows": 
                        {
                            values: [{
                                "userEnteredValue": {
                                    stringValue: "Dec 14-Sep 20"
                                },
                                "userEnteredValue": {
                                    numberValue: 10
                                },
                                "userEnteredValue": {
                                    numberValue: 5
                                },
                                "userEnteredValue": {
                                    numberValue: 1
                                },
                                "userEnteredValue": {
                                    numberValue: 0.2
                                },
                            }]
                        }
                    ,
                    "fields": "*",
                    // "start": {
                    //     "sheetId": 0,
                    //     "rowIndex": 1,
                    //     "columnIndex": 4
                    // },
                    "range": {
                        "sheetId": 0,
                        "startRowIndex": 1,  // I want to write to second row only
                        "endRowIndex": 2,
                        "startColumnIndex": 0, // start at first column
                        "endColumnIndex": 5   // end at 5th column
                    }
                }
            }
        ]
    }
}, (err, res) => {
    if (err) return console.log('The API returned an error: ' + err);
    } else {
        console.log('No data found.');
    }
});

如您所见,我指定了一个范围,但指定了数据;具体来说,数据数组中的最后一个值0.2正在写入工作表的第一列。我也尝试使用“开始” GridCoordinate而不是“范围” GridRange,但是结果是相同的。

我需要做些什么修改才能将数据数组中的所有5个值一次写入一行,一次写入一列?

1 个答案:

答案 0 :(得分:0)

问题不在开始或范围属性中;取而代之的是,问题在于传递到rows数组的对象的格式不正确。

现在,Google确实使使用BatchUpdate修改单元格的API变得相当复杂。首先,在UpdateCellsRequest的文档中,我们看到rows []数组采用了RowData对象。 RowData是一个具有键“值”的对象,其中包含一个CellData对象数组,但是每个CellData对象必须包装在一组{}中。

然后,CellData对象由一个或多个属性组成,在这种情况下,我们选择“ userEnteredValue”。它包含一个ExtendedValue对象,可以是数字,字符串,布尔值,公式或错误,并且是此复杂嵌套对象系列中的最后一个。

上述代码的问题是,在文档中将rows属性标记为数组,但实际上它是一个包含数组的对象;因此,您在“行”之后丢失了花括号。

这是您应该拥有的:

           {
                "updateCells": {
                    "rows":
                    {
                        values: [
                            {
                                "userEnteredValue": {
                                    stringValue: "Dec 14-Sep 20"
                                }
                            },
                            {
                                "userEnteredValue": {
                                    numberValue: 10
                                }
                            },
                            {
                                "userEnteredValue": {
                                    numberValue: 5
                                }
                            },
                            {
                                "userEnteredValue": {
                                    numberValue: 1
                                }
                            },
                            {
                                "userEnteredValue": {
                                    numberValue: 0.2
                                }
                            }
                        ]
                    }
                    ,
                    "fields": "*",
                    "range": {
                        "sheetId": 0,
                        "startRowIndex": 1,
                        "endRowIndex": 2,
                        "startColumnIndex": 0,
                        "endColumnIndex": 5
                    }
                }
            }