【问题标题】:Recursive additive function from one cell value to an existing cell value从一个单元格值到现有单元格值的递归加法函数
【发布时间】:2019-08-27 03:41:47
【问题描述】:

我正在使用谷歌表格。我有一个这样的工作表:

(抱歉,这里我不知道怎么链接图片。我只用文字做的表格都变成锯齿状了)

当用户将 A1 的值从 100 更改为 150 时,我希望 B1 的值从 200 更改为 350。下次用户将 A1 的值从 150 更改为 200 时,我希望 B1 的值从 350 更改为 550... 等等.

遗憾的是,我是编程新手。所以,我正在学习如何在 Google 表格中使用脚本。

【问题讨论】:

  • 您能否分享一份您的电子表格副本(在删除/匿名化机密信息后,如果有的话)?在电子表格或您上面的问题中,请描述可以更改的范围、需要更新的范围以及在解决此问题时可能需要遵守的任何其他约束,因为它目前有点过于宽泛。例如。如果更改 B1 中的值,是否也需要更新 A1,还是只更新 A3:3?或者什么都没有,只有 A1 必须影响其余的细胞?
  • 通过将链接粘贴到您的工作表来分享它
  • 那么当用户更改 A1 中的值以在 B1 中添加单元格的值时,您想要的是什么?
  • 是的,AMolina3……就是这样。但是,B1 应该跟踪旧值,以便新值 = 旧值 + A1 的新值
  • 看我的问题...我已经添加了需求的图片

标签: google-apps-script google-sheets cumulative-sum


【解决方案1】:

一种可能的解决方案,假设第一行中的所有值都会触发其余值的更新。

已编辑:调整为仅考虑 A1 中的更改,并始终将 A1 的新值添加到第一行的其他单元格;还强制脚本解释数字以避免一些不希望的连接。

function onEdit(e){
  if (e.range.getA1Notation() == "A1") { 
    var difference = isNaN(e.value) ? 0 : Number(e.value); // New value of A1 to be added to the other cells in first row ; only taking numbers into account
    var firstRowValues = e.range.getSheet().getRange("1:1").getValues(); // Get the current values of the first row
    for (var c = 1 ; c < e.range.getSheet().getLastColumn() ; c++){
      // Go through each value in first row
      // If it has a value already, and if that value is a number, add the difference
      if (firstRowValues[0][c] && !isNaN(firstRowValues[0][c])) firstRowValues[0][c] = Number(firstRowValues[0][c]) + difference;
    }
    e.range.getSheet().getRange("1:1").setValues(firstRowValues); // Set the updated value in the sheet's first row

  }
}

编辑:在原始问题中添加屏幕截图后,我知道只有 B1 需要更新,所以代码可以这样简化:

function onEdit(e){
  if (e.range.getA1Notation() == "A1") { 
    var difference = isNaN(e.value) ? 0 : Number(e.value); // New value of A1 to be added to the other cells in first row ; only taking numbers into account
    var valueB1 = e.range.getSheet().getRange("B1").getValue(); // Get the current values of B1
    if (valueB1 && !isNaN(valueB1)) valueB1 = Number(valueB1) + difference; // Only updating if B1 has a value which is a number
    e.range.getSheet().getRange("B1").setValue(valueB1); // Set the updated value in B1  
  }
}

【讨论】:

  • 感谢您的回复,Benoit。没有范围。它只是 A1 单元格,总是由用户更新/更改。因此,B1 将相应更改,但 B1 应跟踪先前的值以添加要添加的新 A1 值。
  • 谢谢。那么,如何将其添加到 Google 表格?
  • 工具 > 脚本编辑器 --> 粘贴,保存,就可以了
  • 好的,我会试一试,几个小时后报告。谢谢!
  • 遗憾的是,我无法分享在脚本编辑器中添加此代码时遇到的错误。如何在评论中添加屏幕抓取?
【解决方案2】:
=ARRAYFORMULA(IF(LEN(A1:A), SUMIF(ROW(A1:A), "<="&ROW(A1:A), A1:A)+A1, ))

【讨论】:

  • Player0,感谢您的回复 - 但是,用户总是只更改 A1 值。并且基于新的 A1 值,B1 应该得到更新。
  • 看我的问题...我已经添加了需求的图片
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多