首页 > 解决方案 > 如何将 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();
}

标签: arrayslistgoogle-apps-scriptgoogle-sheetsrange

解决方案


我相信你的目标和情况如下。

  • 在您的目标中,您希望在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 一起使用。

参考:


推荐阅读