【问题标题】:Insert a row in the middle of existing data在现有数据中间插入一行
【发布时间】:2018-07-09 15:48:51
【问题描述】:

我正在尝试使用node.jsGoogle Sheets API v4 在电子表格中间插入一个空行。过去几天我一直在到处研究,但找不到任何有关它的文档。

Google 电子表格文档只讨论了.append(),它在电子表格的末尾附加了一行。这不是我想要的哈哈。

有没有办法在数据中间插入一个空行??


所以..这是我到目前为止编辑的内容。

function newRow() {
  return new Promise((resolve, reject) => {
    return getAuthorizedClient().then(client => {
      const sheets = google.sheets({
        version: 'v4',
        auth: client
      });
      var requests = [];

      requests.push({
        insertDimension: {
          range: {
            sheetId: MY_SHEET_ID,
            dimension: 'row',
            startIndex: 50,
            endIndex: 1
          },
          inheritFromBefore: false
        }
      });
      var batchUpdateRequest = { requests: requests };

      sheets.spreadsheets.values.batchUpdate({
        spreadsheetId: CONFIG_SHEET_ID,
        resource: batchUpdateRequest
      });
    });
  });
}

getAuthorizedClient 是我为 auth 制作的函数。无论如何,我遇到的问题是

错误:收到无效的 JSON 负载。未知名称“请求”:找不到字段。

我不太确定我做错了什么 - 我直接从 Google API 文档中进行操作。

【问题讨论】:

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


【解决方案1】:

根据 Sheets API 参考,要插入行,您需要发送具有有效 DimensionRange 属性的 InsertDimensionRequest

确实,你这部分代码是正确的:

{
  insertDimension: {
    range: {
      sheetId: MY_SHEET_ID,
      dimension: 'row',
      startIndex: 50,
      endIndex: 1
    },
    inheritFromBefore: false // Use start (true) or end (false) index to set defaults.
  }
}

(虽然我相信您希望结束索引为 51 而不是 1。然后会在第 50 个索引处插入一行,其中第 1 行是索引 0。)

来自错误信息

错误:收到无效的 JSON 负载。未知名称“请求”:找不到字段。

我们可以确定您的特定batchUpdate 请求不正确。句法。请注意,Sheets API 中有多个实现batchUpdate 方法的类:spreadsheets.batchUpdatespreadsheets.values.batchUpdate。仅对于 spreadsheets 资源的 batchUpdate 方法,输入数组 Requests 是一个有效参数 - values 资源的批量更新需要 data 参数(即,要写入目标的值细胞)。

因此,解决方法是更改​​用于构造batchUpdate 请求的类:

function newRow(sheets, config, options) {
  var newRowRequest = {
    insertDimension: {
      range: {
        sheetId: options.sheetId,
        dimension: 'row',
        startIndex: options.start,
        endIndex: options.start + options.howMany
      },
      inheritFromBefore: options.inheritBefore
    }
  };

  var batchUpdateRequest = {
    requests: [newRowRequest]
    // includeSpreadsheetInResponse: ...,
    // responseRanges: [...],
    // responseIncludeGridData: ...
  };
  return sheets.spreadsheets.batchUpdate({
    spreadsheetId: config.spreadsheetId,
    resource: batchUpdateRequest
  }); // Returns AxiosPromise
}

【讨论】:

  • 您好,非常感谢您的回复。一个快速的问题:sheetIDs 和 insertDimensionsheets.spreadsheets.batchUpdate 可以相同吗?
  • @YegeonSeo 我不确定我是否理解您的问题 - node.js 方法 sheets.spreadsheets.batchUpdate 采用电子表格 ID(技术上是 Google Drive 文件 ID)作为参数,它选择应该接收提供的请求。捆绑到该 batchUpdate 请求中的请求可能采用工作表 ID,该 ID 标识工作簿中请求适用的工作表(例如 insertDimensionrepeatCell)。 developers.google.com/sheets/api/samples/sheet
  • 啊哈,这很有道理。我还按照您的示例代码让我的工作!非常感谢。
  • 我认为它需要是`维度:“ROWS”,`而不是dimension: "row"
【解决方案2】:

Google Apps 脚本文档非常适合这类事情。

https://developers.google.com/apps-script/reference/spreadsheet/sheet

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

// This inserts a row after the first row position.
sheet.insertRowAfter(1);

【讨论】:

  • 嘿!谢谢你。但是有一个问题:如何导入 SpreadsheetApp?我按照设置指南做了$ npm install googleapis@27 --save,但不知道应该如何在我的代码中导入它。
  • @YegeonSeo 此答案不适用于 node.js,它使用 Google Apps 脚本环境独有的功能。我评论了相关 Sheets API 更新请求的链接。如果您在实施时遇到问题,请编辑您的问题,我们可以提供合适的建议/答案
猜你喜欢
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多