基于单元格值在谷歌工作表中隐藏多行-性能浪漫问题



我在谷歌表单中有一个简单的数据集,占据了几个列(a:N),向下大约100行。每一行代表一个任务,任务可能处于打开或关闭状态。状态值在M列中。

默认情况下,所有任务的状态都是"打开",但是,当用户关闭任务并选择状态"关闭"时,我想隐藏该任务的行。尽管下面的代码可以正常工作(最初的版本1),但它感觉滞后且缓慢。

为了寻找解决方案,我将代码缩短到了版本2,但结果相同,因此我认为这个脚本的工作方式一定有一些基本的东西。

我也检查过这个(Google sheets Script to Hide Rows in Batch)解决方案,但在我的情况下,它根本不起作用,即速度并没有真正改变那么多。通过使用他们的示例,我生成了代码的第3版。

如果有任何改进,我将不胜感激。

谢谢。

PS。在下面的代码(版本1)中,我正在测试第二列(B),因此getRange(1,2,lastRow,1)

// Version 1
function hideClosed_ver1() {
var sheet = SpreadsheetApp.getActive().getSheetByName("Hide"); 
var lastRow =  sheet.getLastRow();
var arr = sheet.getRange(1,2,lastRow,1).getValues();
for(var i = 0; i < arr.length; i++)
{
if(arr[i][0]==='Closed')
{
sheet.hideRows(i + 1);
}
}
}
// Version 2
function hideClosed_ver2() {
var app = SpreadsheetApp.getActive().getSheetByName('Hide');
app.getRange('B:B').getValues().forEach(function (r, i) {
if (r[0] == "Closed")
app.hideRows(i + 1)
});   
}
// Version 3
function hideClosed_ver3() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Hide");
var currentRange = ss.getRangeByName("Status");
var rangeStart = currentRange.getRow();
var values = currentRange.getValues();
var index = 0, rows = 1;
var show = !(values[0][1] == "Closed" );
for (var i = 1, length = values.length; i < length; i++) {
if (values[i][0] == "Closed" ) {
if (show) {
sheet.showRows(rangeStart + index, rows);
show = false;
index = i;
rows = 1;
} else
rows++;
} else {
if (show)
rows++;
else {
sheet.hideRows(rangeStart + index, rows);
show = true;
index = i;
rows = 1;
}
}
}
if (show)
sheet.showRows(rangeStart + index, rows);
else
sheet.hideRows(rangeStart + index, rows);
}
  • 如果列"B"中有"Closed"值,则需要隐藏行
  • 你们想以较低的成本在上面运行

如果我的理解是正确的,那么使用Sheets API如何?当使用API表的批更新方法时,一个API调用可以隐藏多行。

当您使用Sheets API时,请在高级Google服务和API控制台启用Sheets API。您可以在此处查看如何启用Sheets API

修改的脚本:

请复制并粘贴以下脚本并运行。

function sample() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); // Added
var sheet = ss.getSheetByName("Hide"); // Modified
var lastRow =  sheet.getLastRow();
var rng = sheet.getRange(1,2,lastRow,1);
var arr = rng.getValues();
// Following script was added.
var sheetId = sheet.getSheetId();
var reqs = arr.reduce(function(ar, e, i) {
if (e[0] === 'Closed') {
var req = {"updateDimensionProperties": {
"properties": {"hiddenByUser": true},
"range": {"dimension": "ROWS", "startIndex": i, "endIndex": i + 1, "sheetId": sheetId},
"fields": "hiddenByUser",
}};
ar.push(req);
}
return ar;
}, []);
Sheets.Spreadsheets.batchUpdate({"requests": reqs}, ss.getId());
}

参考文献:

  • spreadsheets.values.batchUpdate
  • 更新维度属性请求

如果这不是你想要的结果,请告诉我。我想修改它。

最新更新