如何在NodeJS(google-sheets-api)中不清除先前值的情况下更新单元格数据

时间:2019-05-30 17:40:37

标签: node.js google-sheets-api

我正在研究NodeJS和Google Sheets API 我尝试将一些日志添加到工作表上的单元格中,每次我的代码执行函数(创建日志)时都会创建日志。每次代码更新单元格时,我以前的日志都会被删除。如何摆脱单元格中的覆盖?我希望我的新日志保存在旧日志中

我尝试将sheets.spreadsheets.values.batchUpdate({})更改为 sheets.spreadsheets.batchUpdate({}),但在那里找不到相关参数

async regressionMapBatchUpdateSheet(auth, cellsRange = "", ...restValues) {
        return new Promise((resolve, reject) => {
            const sheets = google.sheets({ version: 'v4', auth });
            sheets.spreadsheets.values.batchUpdate({
                spreadsheetId: 'spreadsheetId',
                requestBody: {
                    data: [
                        {
                            range: cellsRange,
                            values: [
                                restValues
                            ]
                        }
                    ],
                    valueInputOption: "USER_ENTERED",
                    includeValuesInResponse: true
                }
            }, (err, response) => {
                if (err) {
                    console.log(err);
                    return reject(err);
                } else {
                    console.log(`The sheet were updated, cells were updated: "${response.data.responses.map(res => res.updatedData.values)}"`);
                    resolve(response);
                }
            })
        });

值:[restValues] =我输入的日志

我想将日志保存在一个单元格中。如果每次都从新行开始日志,那就太好了。

1 个答案:

答案 0 :(得分:0)

  • 您要使用带有Node.js的Sheets API将值附加到新行。

如果我的理解是正确的,那么该修改如何?

修改点:

  • 我认为使用values.append方法适合您的情况。

修改后的脚本:

请进行如下修改。

发件人:

sheets.spreadsheets.values.batchUpdate({
    spreadsheetId: 'spreadsheetid',
    requestBody: {
            data: [
                {
                    range: dateCell,
                    values: [
                        [date]
                    ]
                },
                {
                    range: resultCell,
                    values: [
                        [result]
                    ]
                },
                {
                    range: commentCell,
                    values: [
                        [comment]
                    ]
                }
            ],
            valueInputOption: "RAW",
            includeValuesInResponse: true
        }
}, (err, response) => {

收件人:

使用此设置时,请设置范围和值。通过此脚本,这些值将追加到新行。

sheets.spreadsheets.values.append(
  {
    spreadsheetId: 'spreadsheetid',
    range: "Sheet1!A:A", // This is a sample range.
    valueInputOption: "RAW",
    resource: { values: [["date", "result", "comment"]] } // This is a sample value.
  }, (err, response) => {

注意:

  • 根据您的问题,我可以确认您已经可以使用Sheets API。
  • 在这种情况下,可以像{ values: [["date", "result", "comment"]] }那样设置值。

参考:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

编辑:

  • 您想要将值添加到相同的单元格而不会被覆盖。例如,单元格A1:B1具有sample1sample2。将sample3sample4的值分别添加到A1B1时,单元格将变为sample1sample3sample2sample4

从您的回复评论中,我可以这样理解。对于这种情况,不幸的是,在当前阶段,这不能通过一个API调用直接实现。因此,需要执行以下流程。

  1. A1:B1获取值。
  2. 通过更新值将值放入A1:B1

例如,要执行此操作,如何使用spreadsheets.values.getspreadsheets.values.update的方法?

修改后的脚本:

发件人:

sheets.spreadsheets.values.batchUpdate({
    spreadsheetId: 'spreadsheetid',
    requestBody: {
            data: [
                {
                    range: dateCell,
                    values: [
                        [date]
                    ]
                },
                {
                    range: resultCell,
                    values: [
                        [result]
                    ]
                },
                {
                    range: commentCell,
                    values: [
                        [comment]
                    ]
                }
            ],
            valueInputOption: "RAW",
            includeValuesInResponse: true
        }
}, (err, response) => {

收件人:

在这种情况下,通过将其他值添加到现有值来更新Sheet1!A1:B1的单元格。例如,当单元格Sheet1!A1:B1具有sample1sample2时,通过运行此脚本,单元格将更新为sample1sample3sample2sample4

const spreadsheetId = "###";
const range = "Sheet1!A1:B1";
const additionalValue = [["sample3", "sample4"]];
sheets.spreadsheets.values.get(
  {
    spreadsheetId: spreadsheetId,
    range: range
  },
  (err1, result1) => {
    if (err1) {
      console.log(err1.errors);
      return;
    }
    const newValue = result1.data.values.map((row, i) =>
      row.map((col, j) => col + additionalValue[i][j])
    );
    sheets.spreadsheets.values.update(
      {
        spreadsheetId: spreadsheetId,
        range: range,
        valueInputOption: "USER_ENTERED",
        resource: { values: newValue }
      },
      (err2, result2) => {
        if (err2) {
          console.log(err2.errors);
          return;
        }
        console.log(result2.data);
      }
    );
  }
);

参考: