更改单元格值时添加时间轴(谷歌脚本)

时间:2013-03-03 19:15:50

标签: google-apps-script google-sheets

我希望有一个函数在我的电子表格中的特定单元格值发生更改时输出时间轴:

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

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

这对我来说这是一个每个通常的谷歌形式的功能,但我不知道如何将其转换为自定义脚本。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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
 }