arrays - 如何将 B 列中的值更直接地设置为选择行的高度并激活下一行?
问题描述
C 到 K 列被隐藏。第一行是标题行。K 列在每个以 K2 开头的单元格中都包含以下公式。
=IF(SUBTOTAL(103,INDIRECT("$A"&ROW())),ROW(),"")
这允许检测未被过滤器或用户隐藏的行。相关的 A 单元格位于 K 单元格的行中。如果包含某些内容,则会显示行号。以下函数检查 K 中的值是否出现在所选单元格的行中。如果是这样,则在 B 列中设置一个 x。如果选择了完整的行,则它不起作用。代码可能很复杂。如何在不减少执行时间(1 到 3 秒)的情况下简化它?也许可以通过不为每个选定的非连续单元格存储值来减少执行,而是使用更直接的方式,以便即使选择了完整的行也可以工作。
然后,在A列中,将激活在最低选择下一行的下一个非隐藏单元格(A166)。下面的代码会很快激活 A84,但仍会导致适当的转变。
function x() {
var s = SpreadsheetApp.getActive().getActiveSheet();
var list = s.getActiveRangeList().getRanges();
var ranges = [];
var ranges2 = [];
var exp = new RegExp(/[a-z]+/gi);
for (var i = 0; i < list.length; i++) {
var range = list[i].getA1Notation();
var range = range.replace(exp, 'K');
var values = s.getRange(range).getValues();
for (var i2 = 0; i2 < values.length; i2++) {
if (/\S/.test(values[i2])) {
ranges.push('B'+values[i2]);
ranges2.push(values[i2]);
}
}
}
s.getRangeList(ranges).setValue('x');
var shifting = 'A' + (Math.max(...ranges2) + 1);
s.getRange(shifting).activate();
}
解决方案
我相信你的目标和情况如下。
- 在您的目标中,您希望在
x
选择行时将 的值放入“B”列。 - 即使选择了整行,您也希望运行脚本。
- 您想忽略隐藏的行。
- In your current issue, when the entire rows are selected, an error occurs.
- 您想降低脚本的处理成本。
修改点:
- 在这种情况下,我想从选定范围中检索行索引。在您当前的脚本中,使用了 A1Notation。这样,当使用整行时,不包括列字母。所以会发生错误。
当这一点反映到您的脚本中时,它变成如下。
修改后的脚本:
function x() {
var s = SpreadsheetApp.getActive().getActiveSheet();
var list = s.getActiveRangeList().getRanges();
var values = s.getRange("K1:K" + s.getLastRow()).getValues();
var selectedRows = list.reduce((ar, r) => {
var row = r.getRow();
for (var i = 0; i < r.getNumRows(); i++) {
var rowPosition = row + i;
if (!s.isRowHiddenByUser(rowPosition)) ar.push(rowPosition);
}
return ar;
}, []);
var ranges = selectedRows.reduce((ar, r) => {
if (values[r - 1][0].toString() != "") ar.push("B" + r); // or ar.push("B" + values[r - 1][0]);
return ar;
}, []);
if (ranges.length > 0) { // Modified
s.getRangeList(ranges).setValue('x');
s.getRange(`A${Math.max(...selectedRows) + 1}`).activate();
}
}
- 在此修改中,首先从“K”列中检索值。然后,使用它创建范围列表。这样一来,我认为流程成本会有所降低。
笔记:
- 请将此脚本与 V8 一起使用。
参考:
推荐阅读
- python - 无法建立基本的简单烧瓶 SocketIO websocket 服务器
- sql - SQL-需要先按日期排序,然后总是先有一个特定的变量值
- flutter - 颤振错误:未处理的异常:NoSuchMethodError:方法'findAncestorStateOfType'在null上被调用
- c++ - 如何显示不带小数的整数
- jmeter - 一台机器上运行多个jmeter任务,如何指定端口停止jmeter测试
- python - 通过在 python 回归模型中添加噪声来增强数据
- arrays - 用它们的顺序迭代字典(关联数组)
- python - 根据索引的公式更改数组的布尔值
- reactjs - 如何从 react.js 页面中的 iframe 中删除控制台错误
- hyperledger-fabric - 这可以在结构通道内添加通道吗?