首页 > 解决方案 > 在一行的第一个空白单元格中设置时间戳

问题描述

每次选择 col8 中的单元格时,我都会尝试在电子表格中做两件事。第一次增加 col7 中单元格的值,并在该行的第一个空白单元格中设置时间戳。我卡在时间戳上。增加值有效,我可以将时间戳设置为特定单元格,如代码中所示或工作表的最后一列中所示,但我找不到将其设置在行的第一个空白单元格中的解决方案。

function onSelectionChange(e) {
  const as = e.source.getActiveSheet();
  const col = e.range.getColumn();
  const row = e.range.getRow();
  if (as.getName() == 'Sheet1' && col == 8){ 
        const range = as.getRange(row,7);
        range.setValue(range.getValue()+1);
        e.range.setValue('Present');
  }
  onEdit(e);
}

function onEdit(e) {
  var attendanceSheet = e.source.getActiveSheet();
  var row = e.range.getRow();
  var col = e.range.getColumn();

  if(attendanceSheet.getName() == 'Sheet1' && col == 8) {
    
    if (attendanceSheet.getRange(row, 12).getValue() === '')
    attendanceSheet.getRange(row, 12).setValue(new Date());    
  }
  }

标签: google-apps-scriptgoogle-sheets

解决方案


恕我直言,从函数(另一个简单的可安装触发器)调用onEdit函数(一个简单的可安装触发器)是一个非常糟糕的主意,onSelectionChange因为在某些情况下,可能会在选择更改发生后立即进行编辑。

如果您希望避免在两个简单触发器上重复时间戳代码,则将时间戳代码“提升”为一个函数并从两个触发器中调用它。

function onSelectionChange(){
  // Some code here
  timestamping();
}

function onEdit(){
  // Some code here
  timestamping();
}

function timestamping() {
  // timestamping code here
}

关于在一行中的第一个空白单元格中设置时间戳,使用indexOf你可能会得到列,你可能会使用这样的东西:

var sheet = e.range.getSheet();
/** Get the edited row values */
var rowValues = sheet.getRange(e.range.rowStart,1,1,sheet.getLastColumn()).getValues()[0];
/** Get the column of first empty cell */
var column = rowValues.indexOf('') + 1;
/** First evaluate if there was found and empty cell, if so, add the timestamp, otherwsie do nothing */
if(column > 0) attendanceSheet.getRange(row, column).setValue(new Date());   

推荐阅读