UpdateCellsRequest - 范围不符合预期

时间:2017-03-12 09:09:15

标签: javascript node.js google-apps-script google-sheets google-sheets-api

尝试使用UpdateCellsRequest来更新一系列单元格的格式,但它只更新该范围内的第一个单元格。

let fixFormats = () => {
    return new Promise((resolve, reject) => {
        var sheets = google.sheets('v4');

        var options = {
            auth: auth,
            spreadsheetId: spreadsheetId,
            resource: {
                requests: [{
                    updateCells: {
                        range: {
                            sheetId: 0,
                            startColumnIndex: 0,
                            endColumnIndex: 2,
                        },
                        rows: [{
                            values: {
                                userEnteredFormat: {
                                    numberFormat: {
                                        type: "CURRENCY",
                                        pattern: "$#,##0.00"
                                    }
                                }
                            }
                        }],
                        fields: "userEnteredFormat.numberFormat",
                    }
                }]
            }
        }

        sheets.spreadsheets.batchUpdate(options, (err, res) => {
            if (err) {
                reject(err);
            } else {
                resolve(res);
                console.log(res);
            }
        });
    });
}

根据this post,它应该是可能的。我已浏览参考文档并验证我的请求格式正确。特别注意range的定义方式。

编辑:来自startColumnIndex(包括)和endColumnIndex(独家)的更令人困惑的行为..

虽然sheetId:0,startColumnIndex:0,endColumnIndex:2 仅更新单元格A1,例如... 虽然sheetId:0,startColumnIndex:0,endColumnIndex:3 是一样的。

但是......如果在sheetId:0,startColumnIndex:1,endColumnIndex:2 然后只更新B列(colIndex:1)......

这是一个错误还是我错过了什么?

编辑:按请求输出...但不确定这会显示正确的响应。

{ spreadsheetId: '<mysheet>',
  replies: [ {} ],
  updatedSpreadsheet: 
   { spreadsheetId: '<mysheet>',
     properties: 
      { title: 'OLR',
        locale: 'en_US',
        autoRecalc: 'ON_CHANGE',
        timeZone: 'America/Los_Angeles',
        defaultFormat: [Object] },
     sheets: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
     namedRanges: [ [Object] ],
     spreadsheetUrl: 'https://docs.google.com/a/company.com/spreadsheets/d/<mysheet>/edit' } }

如果我JSON.stringify响应它给它的范围内的每个单元格格式化,这是很多单元格。但是,在选择的3列中,第一列中的第一个单元格已更新,但其余单元格保持不变。

2 个答案:

答案 0 :(得分:1)

想出来!虽然我能够通过使用&#39; repeatCells&#39;来实现这一点。函数而不是“更新细胞”,我不确定为什么它不起作用,因为它似乎是该函数的预期目的。我将不得不再次阅读这篇文章,但为后人提供了有效的更新代码:

var options = {
            auth: auth,
            spreadsheetId: spreadsheetId,
            resource: {
                requests: [{
                    repeatCell: {
                        fields: "userEnteredFormat.numberFormat",
                        range: {
                            sheetId: 1564685276,
                            startColumnIndex: 1, // inclusive
                            endColumnIndex: 3, // exclusive
                        },
                        cell: {
                            userEnteredFormat: {
                                numberFormat: {
                                    type: "CURRENCY",
                                    pattern: "$#,##0.00"
                                }
                            }
                        }
                    }
                }],
            }
        }

答案 1 :(得分:0)

在传递给options的{​​{1}}有效负载中,sheets.spreadsheets.batchUpdate()-更具体地说,resources.requests[].updateCells.rows[].values[]字段实际上应该是一个数组。您将其作为示例中的哈希。

https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#RowData