【问题标题】:Formula to capture timestamp on Google sheets is causing an issue在 Google 表格上捕获时间戳的公式导致了问题
【发布时间】:2021-05-31 19:37:01
【问题描述】:

我在 google 表格中有一个公式,它在第一次编辑相邻单元格时捕获时间戳。见下面的公式

=if(D1,D1,if(A1<>"",NOW(),""))

直到 4 月 27 日左右,该公式都运行良好。发生的事情是每次重新打开工作表时都会重新计算时间戳。奇怪的是,这种重新计算只影响最近的 5 行左右。 我确实有一个实现相同目的的替代脚本,但我想看看我是否可以在这里发现错误。我不确定这个错误是否与how often formulas are recalculated in sheets 有关系。

将不胜感激,谢谢

[编辑] 在此处添加我的代码替代 - 该函数在编辑触发器上运行

// set the timestamp when a change is done on the status columns
function record_timestamp() 
{
  // get information
  var ss = SpreadsheetApp.getActiveSpreadsheet(); // Sheet name
  var sheet = ss.getActiveSheet();
  var active = ss.getActiveCell();
  var row = active.getRow();
  var name = sheet.getSheetName();
  var column = active.getColumn();
  var val = active.getValue();
  
  //Logger.log(row + ' = ' + column + ' , ' + name);
  
  // if marked done or NA
  if (
    (EDIT_TABS.indexOf(name) != -1) &&
    (row > STARTING_ROW) && 
    (columnToLetter(column) == COLUMN) // helper.gs
  )
  { 
    // put in current timestamp
    var now = new Date();
    var edit_range = sheet.getRange(row, column + 1);
    
    //Logger.log('edit = ' + edit_range.getA1Notation());
    
    // put in timestamp if blank
    if (edit_range.getValue() == "")
    {
      //Logger.log('setting value');
      edit_range.setValue(now);
    }  
  }
}

[编辑 1] 添加另一个被调用的函数 - 这会将列号转换为字母,例如:0 转换为 A,依此类推。同时添加脚本中使用的其他变量。

// related to on edit timestamp record
var COLUMN = 'U';
var EDIT_TABS = ['Daily', 'Weekly', 'Monthly', 'Quarterly', 'Yearly'];
var STARTING_ROW = 1;

function columnToLetter(column)
{
  var temp, letter = '';
  while (column > 0)
  {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

【问题讨论】:

  • 要获取时间戳,您需要使用脚本 - 这是唯一的方法
  • NOW() 将在每次更改工作表时重新计算。如果你想保留那个时间戳,我建议你改用你的脚本。
  • 我有一个脚本来执行此操作,带有一个 onedit 触发器 - 唯一的问题是,如果一个值被复制粘贴(Ctrl + V 到单元格上)或者如果值从上面的单元格中向下拖动,在这种情况下,脚本不会被触发。这是脚本的唯一问题,如果解决将解决我的问题
  • the only issue is that if a value is copy pasted (Ctrl + V onto the cell) OR if values are dragged down from the above cells, in that case the script does not get fired 你在使用onEdit 触发器吗?复制单元格或向下拖动单元格等操作会导致 onEdit 触发器运行。您能否提供您的代码,以便重现此行为?
  • 将我的代码添加到问题描述中 - 该函数在编辑触发器上运行 - 但正如我所说,如果有向下拖动或复制粘贴,则该函数不会被触发。我需要在脚本上重新做一些事情吗?

标签: google-sheets google-sheets-formula


【解决方案1】:

答案:

如 cmets 中所述,NOW() 将在每次工作表更改时重新计算,因此它不是获取静态时间戳的好方法。

解决方法:

不过,这可以通过脚本来完成。在您当前的脚本中,如果选择了多个单元格,时间戳不会写入您所需的所有单元格,原因有二:

  • 未检索到多个活动单元格

检索active 范围时,您使用的是getActiveCell(),即使您选择了多个单元格,它也只返回一个单元格。你应该改用getActiveRange()

因此,你应该替换这个:

var active = ss.getActiveCell();

有了这个:

var active = ss.getActiveRange();
  • 不写入多个单元格

在设置应写入时间戳的范围时,您使用的是getRange(row, column),它返回一个单元格。我建议改用offset

因此,你应该替换这个:

var edit_range = sheet.getRange(row, column + 1);

有了这个:

var edit_range = active.offset(0,1);

【讨论】:

    【解决方案2】:

    你不能使用公式now()作为你的时间戳,每次打开Gsheet它肯定会自动刷新时间,有一个简单的时间戳,不需要公式或Apps脚本,神奇的是:

    Control + : 
    
    Control + Shift + :
    

    【讨论】:

    • 但公式的第一部分是 if(D1,D1 - 这应该确保如果将时间戳放入单元格一次,则不应重复。
    • 如果您使用公式now() 作为时间戳,假设您今天执行此操作,它将显示今天,但是当您明天打开它时,now() 将变为明天。所以它与时间戳的定义不同,而不是显示今天的date 是什么。 timestamp 函数意味着即使您在下个月打开文件,它仍会显示您执行操作的日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多