如何使用 google sheets api v4 javascript 删除 google sheet 中的空白行?

How to remove a blank row in google sheet using google sheets api v4 javascript?

var params1 = {
      spreadsheetId: '1g9y32IkyujOupw6O6eRhtlCcwhn5vv9mM_Yr4peRRmo', 
      range: str,
};
    
var clearValuesRequestBody = {
};
    
var request = await gapi.client.sheets.spreadsheets.values.clear(params1, clearValuesRequestBody);

以上代码是从googlesheet中删除一行。现在,我的问题是如何通过移动其余行从 google sheet 中删除该空白行?

答案:

您需要使用 batchUpdate 来执行此操作。

请求示例:

{
  "requests": [
    {
      "deleteDimension": {
        "range": {
          "sheetId": sheetId,
          "dimension": "ROWS",
          "startIndex": 0,
          "endIndex": 1
        }
      }
    }
  ]
}

上述请求将从具有给定 gid 的 sheet 中删除第一行。

这些行是从 0 开始索引的,因此从 0 开始到 1 结束将删除第一行。同样,从 8 开始到 18 结束将删除第 9-18 行。

方法如下:

gapi.client.sheets.spreadsheets.batchUpdate(resource)

注意:这是 spreadsheets.batchUpdate 不是 spreadsheets.values.batchUpdate.

现在一起:

const resource = {
  "requests": [
    {
      "deleteDimension": {
        "range": {
          "sheetId": sheetId,
          "dimension": "ROWS",
          "startIndex": 0,
          "endIndex": 1
        }
      }
    }
  ]
}

const response = gapi.client.sheets.spreadsheets.batchUpdate({
  "spreadsheetId": "your-spreadsheet-id",
  "resource": resource
})
  .then(function(response) {
    console.log("Response is: \n", response)
  }, function(err) { 
       console.error("Execute error", err)
     })

为了获得哪些行是空白的,您将不得不使用 spreadsheets.values.get 并手动遍历响应。

响应将采用以下形式;你需要遍历 response.values:

{
  "range": "Sheet1!A1:Z1000",
  "majorDimension": "ROWS",
  "values": [
    [] // each row is an array
  ]
}

在这个例子中,我使用的 Spreadsheet 看起来像这样:

对于此点差sheet,response 将是:

{
  "range": "Sheet1!A1:Z1000",
  "majorDimension": "ROWS",
  "values": [
    [ "1", "1", "1", "1", "1", "1", "1", "1", "1", "1" ],
    [ "2", "2", "2", "2", "2", "2", "2", "2", "2", "2" ],
    [ "3", "3", "3", "3", "3", "3", "3", "3", "3", "3" ],
    [ "4", "4", "4", "4", "4", "4", "4", "4", "4", "4" ],
    [],
    [ "6", "6", "6", "6", "6", "6", "6", "6", "6", "6" ],
    [],
    [],
    [ "9", "9", "9", "9", "9", "9", "9", "9", "9", "9" ],
    [ "10", "10", "10", "10", "10", "10", "10", "10", "10", "10" ],
  ]
}

所以我们只需要检查 response.result.values 的哪些元素是空数组: 假设 Spreadsheet 的列最多为 ZZZ,因此要封装整个范围,您可以提出请求:

const emptyRows = []

gapi.client.sheets.spreadsheets.values.get({
  "spreadsheetId": "your-spreadsheet-id",
  "range": "A:ZZZ"
})
  .then(function(response) {
    response.result.values.forEach(function(row, index) {
      if (row.length == 0) emptyRows.push(index)
    })  
  }, function(err) { 
       console.error("Execute error", err)
     })

然后循环遍历此数组向后,将值传递到先前的batchUpdate请求以将它们从中完全删除sheet。重要的是从下往上删除,以免更改行号并意外删除其中包含数据的行。

注意:这不会删除最后一个数据行之后的空行,只会删除数据集中的空行。

参考文献: