谷歌脚本在更新时保持运行总计

时间:2017-06-01 22:02:08

标签: google-apps-script

我正在设计一张Google表来跟踪我的游戏公会成员的统计数据。对于每个成员,统计数据将经常更新,并且必须为每个成员的每个统计数据保留一个运行总计。

示例:如果Stat1已更新,则Stat1Total将等于Stat1Total + Stat1。

这需要针对多个统计信息进行,并且统计信息不会同时更新。有时成员1的Stat1可能会更新,但不会更新Stat2,也不会更新成员2的统计数据。

我已尝试使用迭代计算的Stat1Total = Stat1Total + Stat1,但即使尚未更新Stat,也会更新所有Stat Totals。我需要StatTotal仅在Stat更新时才更新。

我找到了这个脚本,但无法弄清楚如何使其适应多个/不同的单元格。这仅适用于某张纸的B7和B6。也许它会获得活动单元格,然后根据活动单元格更新另一个单元格?

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var b7 = s.getRange("B7");
  var b6 = s.getRange("B6");
  var activeCell = s.getActiveCell().getA1Notation();
  if( s.getName()=="Sheet1" && activeCell=="B6" )
    b7.setValue(b7.getValue()+b6.getValue());
};

提前感谢您提供任何见解/帮助。

编辑:感谢所有的答案,但是,可能由于我自己的经验不足,我仍然无法使其工作。所以我将通过示例回溯到我原来的问题:

         INF      INF TOTAL    Gems      GEMS TOTAL

字符1(A1)(B1)(C1)(D1)

字符2(A2)(B2)(C2)(D2)

所以,我在A1中输入100,B1应该用B1 + A1更新,现在B1应该= 100。没有别的东西可以更新。然后过了一段时间,我在A1中放了200,B1应该更新为300(B1(100)+ A1(200)。再说一遍,没有别的东西可以改变。也应该适用于角色2和宝石。有意义吗?注意:总数将会在另一张纸上,但即使它们必须保持在同一张纸上,我也能把它们拿走。

同样,我尝试了B1 = B1 + A1,但B1更新了任何事件,导致B1更新A1中的值,即使A1未更新。

我希望有一个可以看到更新内容的功能。类似的东西:

(这将在单元格B2 = MyFunction(B1)的公式栏中看到B1已更新,然后按该值更新单元格。

再次,谢谢大家的帮助,我为我的经验缺乏道歉:)

2 个答案:

答案 0 :(得分:1)

我通过使用e.range稍微修改了它并添加了一些临时变量来调试它并且它正常工作。确保创建onEdit事件。如果您立即设置通知,您将在几分钟内收到事件中的问题反馈。顺便说一句,你不必将函数命名为onEdit,你可以给它任何有效的函数名。

function onEdit1(e) 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var b7 = s.getRange("B7");
  var b6 = s.getRange("B6");
  //var activeCell = s.getActiveCell().getA1Notation();
  var editCell = e.range.getA1Notation();
  //var editCell='B6';
  if( s.getName()=="Sheet6" && editCell=="B6" )
  {
    var v = b7.getValue()+b6.getValue();
    //SpreadsheetApp.getUi().alert('v = ' + v + ' editCell = ' + editCell);
    b7.setValue(v);
   }
}

好的,这是第二个例子的代码。

function onEdit1(e) 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var col = e.range.getColumn();
  var row = e.range.getRow();
  if(col==1 && row<3)
  {
    s.getRange(row, col+1).setValue(Number(s.getRange(row, col+1).getValue())+Number(e.value));
  }
}

答案 1 :(得分:1)

您可以通过检查事件对象(e)来获取已编辑单元格的坐标并计算需要写入的单元格的坐标。试试这个

function onEdit(e) {

var editRange = e.range;  // the edited range
var sheet = SpreadsheetApp.getActiveSpreadsheet() //change to your sheet
                          .getSheets()[0];
var editRow = editRange.getRow(); // row of the edited cell
var editCol = editRange.getColumn(); //column of the edited cell

var targetCol = 3;  //column index for the target cell

if(editCol == 2) {  // check if the cell was in column 2(B)

var editValue = editRange.getValue();

if(editValue) { //check if the value is not empty string("") or 0

    var targetRange = sheet.getRange(editRow, targetCol); //target cell in the same row as the edited cell
    targetRange.setValue(targetRange.getValue() + editValue);


}



}

}