【问题标题】:Calculate average value of the top X rows in a column计算列中前 X 行的平均值
【发布时间】:2020-08-03 14:53:30
【问题描述】:

我有一列全是数字。每个月都会使用“插入单元格”->“下移”手动将一个新数字添加到列的顶部。

我想计算该列前 3 行中数字的平均值。这其实很简单:

=SUM(G1:G3)/3

但是,这不是一个可接受的解决方案,因为一旦我将新数字添加到列的顶部,公式中的行号就会自动更新以针对旧数字,从而使公式基本上没有用。

是否可以通知公式不自动更新,或者我是否需要一种动态方式以某种方式选择前 3 行? (也许使用查询?)

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我刚刚在 webapps 上找到了答案:https://webapps.stackexchange.com/a/88995/33674

    基本上,为了避免对单元格的引用自动更新,请将它们包装在 INDIRECT() 中。

    我的问题的具体解决方案是:

    =SUM(INDIRECT("G1:G3"))/3
    

    【讨论】:

      【解决方案2】:

      您还可以创建自定义函数以及 onEdit 触发器,以便在添加新行时更新值。请尝试以下操作:

      function onEdit(e){
      
        var row = e.range.getRow();
        var col = e.range.getColumn();
        if ( col==7 && row ==1 ){
          
          if (e.source.getActiveSheet().getRange(row,7).getValue() == "") {
          e.source.getActiveSheet().getRange(row,8).setValue("");}
          else{ e.source.getActiveSheet().getRange("H1").setValue(avg3Values());} 
          e.source.getActiveSheet().getRange("H2").clearContent();
      }
      }
      
      function avg3Values() {
        
        var sheet = SpreadsheetApp.getActive().getActiveSheet();
        var elmt = sheet.getRange("G1:G3").getValues().flat([1]);
      
        var sum = 0;
      for( var i = 0; i < elmt.length; i++ ){
          sum += parseInt( elmt[i], 10 );
      }
        var avg = sum/elmt.length;
        return avg;
      }
      

      通过使用此功能,每次添加新的G1 单元格时,单元格H1 将始终计算G1:G3 的平均值。

      您需要将此代码复制到一个空脚本中。转至Tools =&gt; Script editor

      【讨论】:

      • @Hubro 当然你的方式更可取。但是对于更复杂的情况,谷歌脚本可能会很方便:)
      猜你喜欢
      • 2014-04-23
      • 2019-04-03
      • 2021-03-30
      • 1970-01-01
      • 2022-01-12
      • 2023-03-27
      • 2016-10-13
      • 1970-01-01
      • 2011-05-17
      相关资源
      最近更新 更多