【问题标题】:Active recalculation主动重新计算
【发布时间】:2020-01-11 18:26:56
【问题描述】:

我试图弄清楚如何在使用脚本编辑器功能时主动重新计算单元格值,就像使用 googlesheet 一样。

例如,如果我们在单元格 A1 中有数字 2,在 A2 中有数字 2,那么如果我们在单元格 A3 中执行“=A1+A2”,然后我们将结果放入单元格 A4,如果我们将 A1 或 A2 都更改为 A3 A4 会主动更新。

如果我们这样做,那么在脚本编辑器中:

Function sum_cells(){
 var sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 sheet.getRange("A1").setValue(2);
 sheet.getRange("A2").setValue(2);
 var cell1=sheet.getRange("A1").getValue();
 var cell2=sheet.getRange("A2").getValue();
 sheet.getRange("A3").setValue(cell1+cell2);
 var cell3=sheet.getRange("A3").getValue();
 sheet.getRange("A4").setValue(cell3/4)}

如果A1和A2中的单元格值发生变化,是否可以主动更新A4和A3中的结果?

【问题讨论】:

    标签: javascript google-apps-script google-sheets custom-function


    【解决方案1】:

    是的,可以使用自定义函数。详情请阅读https://developers.google.com/apps-script/guides/sheets/functions

    使用 JavaScript + 运算符和两个操作数的非常简单的自定义函数如下所示:

    /**
     *
     * @customfunction
     */
    function mySum(a,b){
      return a + b;
    }
    

    注意事项:

    自定义函数

    1. 不应使用内置函数的名称
    2. 只能返回一个二维值数组的值,不能更改其他单元格的值,也不能执行需要授权的方法,例如发送电子邮件。

    当电子表格打开时,每次ab 更改自定义函数都会重新计算。

    也可以通过使用编辑时简单或可安装的触发器来实现,但我认为使用自定义函数是更合适的方式。


    例如,如果我们在单元格 A1 中有数字 2,在 A2 中有数字 2,那么如果我们在单元格 A3 中执行“=A1+A2”,然后我们在单元格 A4 中执行结果,如果我们更改 A1 或 A2 两者都是 A3 A4 会主动更新。

    要使用上面的代码示例执行上面引用问题的描述,请执行以下操作:

    1. 在 A1 中写入 2
    2. 在 A2 中写入 2
    3. 在 A3 中写 =mySum(A1,A2)
    4. 在 A4 中写 =A3

    A3 和 A4 将显示 4

    那么当 A1 或 A2 中输入的值发生变化时,A3 和 A4 中的值也会发生变化。

    1. 将 A1 从 2 更改为 3

    A3 和 A4 将显示 5

    1. 将 A2 从 2 更改为 1

    A3 和 A4 将显示 4

    相关

    【讨论】:

    • 我会发布整个代码吗?如何在函数中传递两个单元格的值以及如何将自定义函数分配给某个单元格?我只想通过使用脚本编辑器来做到这一点
    • 是否可以通过脚本编辑器将函数分配给单元格?像 sheet.getRange().setValue(mysum(A1,A2) ?它对我不起作用....
    【解决方案2】:

    如果你在你的 GS 文件中这样写一个函数:

    function onEdit(e) {
    //Logic Goes Here
    }
    

    每次有人编辑单元格时都会触发,更重要的是,它会为您提供一个参考对象,您可以使用该对象来确定更改发生的地点和时间。在函数内部使用 Logger.log(e) 通过运行函数并查看 view>logs

    来查看更改的内容

    【讨论】:

      【解决方案3】:

      阅读您的请求后,我理解了以下内容:

      • 您希望在修改其他单元格时更新某些单元格。
      • 您以自动方式请求前者。

      在这种情况下,您可以使用以下示例来满足您的要求:

      代码

      function cellUpdater(e) {
        var sheet = e.source;
        if (e.range.getA1Notation() == "A1" || e.range.getA1Notation() == "A2") {
          var A3 = sheet.getRange("A1").getValue() + sheet.getRange("A2").getValue();
          var A4 = A3 / 4;
          sheet.getRange("A3").setValue(A3);
          sheet.getRange("A4").setValue(A4);
        }
      }
      

      行为

      该代码将在工作表中的每次修改时运行。如果在 A1 和 A2 单元格中进行了修改,它将根据您的定义更新 A3 和 A4。

      观察

      • 您应使用OnEdit() 类型创建installable trigger。您可以使用菜单Edit ? Current project's triggers 从应用脚本编辑器添加可安装触发器。您必须在此处单击+ Add Trigger 并选择以下参数:
        • 选择要运行的函数:cellUpdater
        • 选择应运行的部署:Head
        • 选择事件源:从电子表格
        • 选择事件类型:编辑时
        • 失败通知设置:如你所愿
        • 您可以在managing triggers manually documentation 上找到有关此过程的更多信息
      • 此功能适用于电子表格的每张工作表。
      • 由于触发器的限制,如果通过脚本进行修改,此功能将不会激活。

      典故

      请将此作为您问题的可能解决方案之一,如有任何其他疑问或要求进一步澄清,请随时给我回信。

      【讨论】:

        猜你喜欢
        • 2015-01-28
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-15
        • 2012-11-24
        • 1970-01-01
        相关资源
        最近更新 更多