2

我目前正在开展一个项目,我正在尝试根据用户在谷歌表中所做的更改填写“上次更新”日期。

我在同一个工作簿中有三个谷歌表。

我遵循了一个教程,该教程帮助我获得了我想要的东西,但是,当我在工作表中使用相同的代码时,它使用了我阅读 OnEdit 所做的最后一个代码。

正如你在下面看到的。如果用户更新工作表 1 中的 Column (Col) 1-17,则将最后更新的内容添加到 Row 中的 Col 18。

注意:下面的代码都在 1 个 .gs 文件中。

预期行为:

当我在 Sheet 1 中时,根据 Sheet1 中指定的更改和范围更新 Col 18(上次更新)。如果在工作表 2 中为相应的范围执行相应操作。表 3 相同。

请参阅下面的代码:

function onEdit(x) {

  addTimeStampGlossary(x);
  
}

function onEdit(y) {
  
 addTimeStampTables(y);
  
}

function onEdit(z) {
  
 addTimeStampFields(z);
  
}


function addTimeStampGlossary(x){
  // variables
  var startRow = 2;
  var ws = "Sheet1";

  //get modified row and column
  var row = x.range.getRow();
  var col = x.range.getColumn();

  if(col === 1 || col === 2 || col === 3 || col === 4 || col === 5 || col === 6 || col === 7 || col === 8 || col === 9 || col === 10 || col === 11 || col === 12 || col === 13 || col === 14 || col === 15 || col === 16 || col === 17 && row >= startRow && x.source.getActiveSheet().getName() === ws ){
    x.source.getActiveSheet().getRange(row,18).setValue(new Date());
  }
 
 }
 
 function addTimeStampTables(y){
  // variables
  var startRow = 2;
  var ws = "Sheet2";

  //get modified row and column
  var row = y.range.getRow();
  var col = y.range.getColumn();

  if(col === 1 || col === 2 || col === 3 || col === 4 || col === 5 || col === 6 || col === 7 || col === 8 || col === 9 || col === 10 || col === 11 || col === 12 || col === 13 || col === 14 || col === 15 || col === 16 || col === 17 || col === 18 || col === 19 && row >= startRow && y.source.getActiveSheet().getName() === ws ){
    y.source.getActiveSheet().getRange(row,20).setValue(new Date());
  }
 
 }
 
  function addTimeStampFields(z){
  // variables
  var startRow = 2;
  var ws = "Sheet3";

  //get modified row and column
  var row = z.range.getRow();
  var col = z.range.getColumn();

  if(col === 1 || col === 2 || col === 3 || col === 4 || col === 5 || col === 6 || col === 7 || col === 8 || col === 9 || col === 10 || col === 11 || col === 12 || col === 13 || col === 14 || col === 15 || col === 16 && row >= startRow && z.source.getActiveSheet().getName() === ws ){
    z.source.getActiveSheet().getRange(row,17).setValue(new Date());
  }
 
 }
4

2 回答 2

2

您可以通过使用来自事件块的更多数据来提高脚本性能,从而最大限度地减少不必要的函数的使用,如下所示:

function addTimeStampGlossary(x){
  const sh=x.range.getSheet();
  if(x.range.columnStart >=1 && x.range.columnStart<=17 && x.range.rowStart>=2 && sh.getName()=='Sheet1'){
    sh.getRange(x.range.rowStart,18).setValue(new Date());
  }
}

我不是想从马里奥斯那里拿走分数。我只是想让你知道性能在函数中很重要,因为简单的触发器必须在 30 秒内完成。而且我知道人们倾向于过度使用它们,所以让它们快速运行很重要。

于 2020-12-29T20:35:47.957 回答
1

你不能有多个onEdit功能。

只保留一个onEdit函数:

function onEdit(e) {
  addTimeStampGlossary(e);
  addTimeStampTables(e);
  addTimeStampFields(e);
}

以及其他功能:

function addTimeStampGlossary(x){
  // variables
  var startRow = 2;
  var ws = "Sheet1";

  //get modified row and column
  var row = x.range.getRow();
  var col = x.range.getColumn();

  if(col === 1 || col === 2 || col === 3 || col === 4 || col === 5 || col === 6 || col === 7 || col === 8 || col === 9 || col === 10 || col === 11 || col === 12 || col === 13 || col === 14 || col === 15 || col === 16 || col === 17 && row >= startRow && x.source.getActiveSheet().getName() === ws ){
    x.source.getActiveSheet().getRange(row,18).setValue(new Date());
  }
 
 }
 
 function addTimeStampTables(y){
  // variables
  var startRow = 2;
  var ws = "Sheet2";

  //get modified row and column
  var row = y.range.getRow();
  var col = y.range.getColumn();

  if(col === 1 || col === 2 || col === 3 || col === 4 || col === 5 || col === 6 || col === 7 || col === 8 || col === 9 || col === 10 || col === 11 || col === 12 || col === 13 || col === 14 || col === 15 || col === 16 || col === 17 || col === 18 || col === 19 && row >= startRow && y.source.getActiveSheet().getName() === ws ){
    y.source.getActiveSheet().getRange(row,20).setValue(new Date());
  }
 
 }
 
  function addTimeStampFields(z){
  // variables
  var startRow = 2;
  var ws = "Sheet3";

  //get modified row and column
  var row = z.range.getRow();
  var col = z.range.getColumn();

  if(col === 1 || col === 2 || col === 3 || col === 4 || col === 5 || col === 6 || col === 7 || col === 8 || col === 9 || col === 10 || col === 11 || col === 12 || col === 13 || col === 14 || col === 15 || col === 16 && row >= startRow && z.source.getActiveSheet().getName() === ws ){
    z.source.getActiveSheet().getRange(row,17).setValue(new Date());
  }
 
 }
于 2020-12-29T20:02:33.310 回答