0

我想要一个函数,当我的电子表格上的特定单元格值发生更改时输出时间线:

在单元格 A1 中是一个不时更改的值。当 A1 更改时,我希望将当前值添加到 B1 中。C1 显示值已更改的时间戳。

下次更改 A1 时,新值将显示在 B2 上,即 C2 上的时间戳。第三个变化是 B3/B4,第四个变化是 B4/C4,依此类推。

在我看来,这是每个常见的谷歌表单都具有的功能,但我不确定如何将其转换为自定义脚本。

有人可以帮忙吗?

4

1 回答 1

1

这是一个执行您想要的示例代码,您可以通过使用 push 或 unshift 选择将新值添加到 B 和 C 列的顶部还是底部...我更喜欢 unshift ,因为我在评论中给出了原因但这取决于你;-)

function timeline() {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  if(sh.getActiveRange().getA1Notation()!='A1'){return}
  var last = lastRowinCol(sh,'B');
  var cellA = sh.getRange('A1').getValues();
  var colB = sh.getRange('B1:B'+last).getValues();
  var colC =  sh.getRange('C1:C'+last).getValues();
//  colB.unshift(cellA); // add on top
//  colC.unshift([new Date()]);
  colB.push(cellA); //add at the bottom
  colC.push([new Date()]);
  sh.getRange(1,2,colB.length,1).setValues(colB);
  sh.getRange(1,3,colC.length,1).setValues(colC);
}

function lastRowinCol(sh,col){
  var coldata = sh.getRange(col+'1:'+col).getValues();
  for(var c in coldata){if(coldata[c][0]==''){break}}
  return c
  }

注意:还有其他方法可以实现这一点,但我认为这个非常“教学”......使用数组,子函数调用,批量读写......

编辑:我忘了提到您需要为该函数分配一个 onEdit 触发器以使其自动执行。


编辑 2:在下面 Mogsdad 非常相关的评论之后,我建议您function lastRowinCol用他的代码替换 for-next 循环,该代码向后迭代,以便它处理列中的空单元格。此外,他的代码有一个有趣的结构,因为循环限制和条件在同一个语句中。

function lastRowinCol(sh,col){
  var coldata = sh.getRange(col+'1:'+col).getValues();
  for (var c=coldata.length; (c) && coldata[c-1][0]==''; c--) {}
  return c
 }
于 2013-03-04T17:41:10.387 回答