删除电子表格中所有分组的行/列

时间:2018-09-24 13:19:36

标签: google-apps-script google-sheets google-sheets-api

我有一个Google表格可以对脚本进行动态分组。我正在寻找一个可以再次消除工作表中所有Groups的功能。

类似于expandAllColumnGroups,我想有一个名为removeAllColumnGroups的函数-但似乎没有可用的函数。

我当前的方法非常缓慢且麻烦。我做了相当多的研究,但甚至找不到一种方法来获取工作表中的所有columnGroups或至少起始列ID,因此我遍历了每一列并按字面意思 try 如果有一个群组,则删除该群组,因为无法判断某个群组是否退出。不幸的是,对于大约90列,这需要很长时间(实际上是几分钟)...

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();

  //remove all column-groups
  var group = null;
  var maxCol = sh.getMaxColumns();
  for(var c = 1; c <= maxCol; c++) {
    try {
      group = sh.getColumnGroup(c, 1); // Try to get group
      group.remove(); // Remove the group
    } catch (e) {
      //Logger.log("No Group at ColIndex "+c);
    }
  }

任何想法都将不胜感激。预先感谢!

2 个答案:

答案 0 :(得分:2)

扩大我的评论,例如:使用Google Sheets REST API访问和修改行/列分组:

行/列组是与Sheet资源相关联的元数据,因此可以使用对spreadsheets.get的单个HTTP请求以及适当的{{1} }规范:

fields

Demo link

上面的请求返回一个具有GET https://sheets.googleapis.com/v4/spreadsheets/{YOUR_SPREADSHEET_ID}?fields=sheets(columnGroups%2Cproperties(sheetId%2Ctitle)%2CrowGroups)&key={YOUR_API_KEY} 属性的对象,该对象是具有3个属性的对象数组(电子表格中每张纸1个):sheetsrowGroups和{ {1}}。组属性是DimensionGroup对象的数组,而columnGroups对象包含工作表的gridId / sheetId(在各种API请求中标识工作表所需的信息)及其名称(这可能对您有用自己的脚本逻辑)。

要删除每个行/列组,您需要发出DeleteDimensionGroupRequest一样多的次数,这与查询组中返回的最大properties一样。如果您未在请求中指定DimensionRange的索引,则将其解释为电子表格的整个范围(所有行/所有列,具体取决于方向)。

一个示例请求(需要OAuth身份验证,而不仅仅是API密钥):

properties

Demo link

每个删除请求都有一个reply response,该响应与您从初始查询中获得的行/列组的初始响应非常相似。如果您事先知道gridIds,则可以放弃初始查询,并使用while循环在响应包含维度组时继续发送删除请求。


要将这些方法与Google Apps脚本一起使用,您可以将depth与原始URL资源一起使用,或者利用可用的"advanced service"客户端库Sheets(必须先启用) )。这两种方法都要求您从脚本的Google Cloud Platform project页启用Sheets API。

使用启用的客户端库POST https://sheets.googleapis.com/v4/spreadsheets/{YOUR SPREADSHEET ID}:batchUpdate?fields=replies%2FdeleteDimensionGroup { "requests": [ { "deleteDimensionGroup": { "range": { "sheetId": "{SHEET 1 ID}", "dimension": "COLUMNS" } } }, { "deleteDimensionGroup": { "range": { "sheetId": "{SHEET 2 ID}" "dimension": "COLUMNS", } } }, ... ] } 的示例:

UrlFetchApp

资源:

答案 1 :(得分:0)

这是一个简单的解决方案。

function removeAllGroupsFromSheet() {
  let sheet = SpreadsheetApp.getActiveSheet();
  let lastRow = sheet.getDataRange().getLastRow();
  
  for (let row = 1; row < lastRow; row++) {
    let depth = sheet.getRowGroupDepth(row);
    if (depth < 1) continue;
    sheet.getRowGroup(row, depth).remove();
  }
}