Google apps script 基于单元格值在google工作表中隐藏多行-性能问题
我在一张谷歌表中有一个简单的数据集,占据了几个列(a:N),向下大约100行。每行代表一个任务,任务可能处于打开或关闭状态。状态值在M列中 默认情况下,所有任务的状态都为“打开”,但是,当用户关闭任务并选择状态“关闭”时,我想隐藏该任务的行。 虽然下面的代码可以按预期工作(初始版本1),但它感觉很慢 为了寻找解决方案,我将代码缩短到版本2,但是结果相同,因此我认为这个脚本的工作方式一定有一些基本的东西 我还检查了这个(.)解决方案,但在我的情况下,它根本不起作用,即速度变化不大。 通过使用他们的示例,我生成了代码的第3版 我将感谢任何改进此代码请 多谢各位 附言。 在下面的代码(版本1)中,我正在测试第二列(B),因此是getRange(1,2,lastRow,1)Google apps script 基于单元格值在google工作表中隐藏多行-性能问题,google-apps-script,google-sheets,row,show-hide,google-sheets-api,Google Apps Script,Google Sheets,Row,Show Hide,Google Sheets Api,我在一张谷歌表中有一个简单的数据集,占据了几个列(a:N),向下大约100行。每行代表一个任务,任务可能处于打开或关闭状态。状态值在M列中 默认情况下,所有任务的状态都为“打开”,但是,当用户关闭任务并选择状态“关闭”时,我想隐藏该任务的行。 虽然下面的代码可以按预期工作(初始版本1),但它感觉很慢 为了寻找解决方案,我将代码缩短到版本2,但是结果相同,因此我认为这个脚本的工作方式一定有一些基本的东西 我还检查了这个(.)解决方案,但在我的情况下,它根本不起作用,即速度变化不大。 通过使用他们的
//版本3
函数hideClosed_ver3(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName(“隐藏”);
var currentRange=ss.getRangeByName(“状态”);
var rangeStart=currentRange.getRow();
var values=currentRange.getValues();
var指数=0,行数=1;
变量显示=!(值[0][1]=“已关闭”);
对于(变量i=1,长度=values.length;i
- 当“B”列中有“Closed”值时,您希望隐藏行
- 你们想以低成本跑在上面
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());
}
参考资料:
- 当“B”列中有“Closed”值时,您希望隐藏行
- 你们想以低成本跑在上面
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());
}
参考资料:
如果这不是你想要的结果,请告诉我。我想修改它。这是如何执行的?考虑床单API@tehhowch. 最初我计划为一行行运行脚本,但现在我认为最好在每次选择状态“CLOSED”时隐藏单个行。这是如何执行的?考虑床单API@tehhowch. 最初我打算为一行行运行脚本,但现在我认为最好在每次选择状态“CLOSED”时隐藏单个行。谢谢您的提示。很遗憾,无法启动API。。。但是,我认为每次用户选择“关闭”状态时,我都应该运行OneEdit(e),并单独隐藏每一行。@AlexShevyakov感谢您提供的其他信息。谢谢您的提示。很遗憾,无法启动API。。。但是,我认为每次用户选择“关闭”状态时,我都应该运行OneEdit(e),并单独隐藏每一行。@AlexShevyakov感谢您提供的其他信息。
// 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);
}
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());
}