【问题标题】:arrayformula that can "skip" rows可以“跳过”行的数组公式
【发布时间】:2014-09-04 20:46:27
【问题描述】:

我需要在谷歌电子表格中引入功能,允许用户编辑数组公式的结果。要求的原因是 ARRAYFORMULA 为一组单元格设置默认值,但用户有时需要覆盖这些默认值。我想知道这是否可能。

示例:

Row(#)|Array_1 |Array_2
------------------------------------
 1    |a       |=arrayformula(Array_1)
 2    |b       |""
 3    |c       |""
 4    |d       |""

因此,Array_2 中的所有行都由数组公式填充。但是,用户想直接转到 Array_2 中的第二个单元格并更改其值。当然,根据设计,ARRAYFORMULA 会中断。有没有什么方法可以修改 ARRAYFORMULA,让它简单地跳过用户编辑过的单元格并继续前进,就好像什么都没发生一样?

【问题讨论】:

  • 是的,关键是要保留数组公式。但我决定关闭线程,因为它浪费时间。我认为除了 google 开发人员之外没有人可以引入这种类型的功能。
  • 真的。在我在谷歌表格中编写一些自定义函数之前,我问了这个问题,并发现它们不是按设计重新计算的。这意味着每次您想使用“功能”时,您都必须对自定义 onEdit 触发器进行硬编码。对于你得到的东西,似乎太麻烦了。欢迎您分享您的解决方案,我会接受答案,但似乎不可能创建可在整个电子表格中使用的可重用自定义函数。
  • 是的,不幸的是,这是唯一的方法。当然,如果你广泛使用它,性能会受到影响。谷歌表格中自定义函数的行为是 TRWTF 这里。 (只是应用程序中的几个关键设计缺陷之一)

标签: google-sheets


【解决方案1】:

我意识到这是一个老问题,但我今天正在寻找这个并制作了一个适合我的脚本。

当在第二列中编辑单元格时,此脚本会在相邻单元格中放置一个公式。这样,如果您需要手动输入某些内容并且不需要事先将公式放入所有行中,您就可以覆盖公式。我让人们不小心编辑了公式,并且大部分时间都在预填充时搞砸了,所以这对我来说效果更好。

function onEdit() {

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheetList = ["Sheet1","Sheet2","Sheet3"]; // list of sheets to run script on

    for (i = 0; i < sheetList.length; i++) {

        var sheetName = ss.getSheetByName(sheetList[i]);

        // only runs if sheet from sheetList is found
        if (sheetName != null) {

            var aCell = sheetName.getActiveCell();
            var col = aCell.getColumn();
            var adjacentCell = aCell.offset(0, -1);
            var formula = 'INPUT FORMULA HERE'; // put the formula you want in the adjacentCell here. Don't use it in an arrayformula

            // only runs if active cell is in column 2, if the adjacentCell is empty, and if the active cell is not empty(otherwise it runs if you delete something in column 2)
            if(col==2 && adjacentCell.getValue()=="" && aCell.getValue()!="") {

                adjacentCell1.setValue(formula);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    更改值不会丢弃剩余公式的输出吗?

    如果没有,您可以设置 2 个新选项卡:一个将接收用户覆盖值,另一个用于填充的“反射”选项卡

    IF(tabOverride!Rx:Cy, tabOverride!Rx:Cy, tabArray!Rx:Cy)
    

    基本上,新选项卡是数组选项卡的克隆布局,创建了一个覆盖输入层,以及一个使用 IF('覆盖值存在', '然后显示覆盖', 'else 显示数组输出') 的表示层返回所需值的逻辑。

    希望这是有道理的!

    【讨论】:

    • 是的,这就是默认的后备解决方案。我希望有一个单列解决方案,其中一列结合了用户输入和数组公式。我将等待一天,看看是否有人可以暗示解决方案。如果没有,我会接受你的回答并关闭线程。
    • 你说得对,如果你试图“编辑”它的输出,数组公式就必须打破。我正在寻找不会损坏的东西,尽管我怀疑我会找到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    相关资源
    最近更新 更多