我有一个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);
}
}
任何想法都将不胜感激。预先感谢!
答案 0 :(得分:2)
扩大我的评论,例如:使用Google Sheets REST API访问和修改行/列分组:
行/列组是与Sheet
资源相关联的元数据,因此可以使用对spreadsheets.get
的单个HTTP请求以及适当的{{1} }规范:
fields
上面的请求返回一个具有GET https://sheets.googleapis.com/v4/spreadsheets/{YOUR_SPREADSHEET_ID}?fields=sheets(columnGroups%2Cproperties(sheetId%2Ctitle)%2CrowGroups)&key={YOUR_API_KEY}
属性的对象,该对象是具有3个属性的对象数组(电子表格中每张纸1个):sheets
,rowGroups
和{ {1}}。组属性是DimensionGroup
对象的数组,而columnGroups
对象包含工作表的gridId / sheetId(在各种API请求中标识工作表所需的信息)及其名称(这可能对您有用自己的脚本逻辑)。
要删除每个行/列组,您需要发出DeleteDimensionGroupRequest
一样多的次数,这与查询组中返回的最大properties
一样。如果您未在请求中指定DimensionRange
的索引,则将其解释为电子表格的整个范围(所有行/所有列,具体取决于方向)。
一个示例请求(需要OAuth身份验证,而不仅仅是API密钥):
properties
每个删除请求都有一个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();
}
}