【问题标题】:How to use multiple OnEdit functions across multiple Google Sheets [duplicate]如何在多个 Google 表格中使用多个 OnEdit 功能 [重复]
【发布时间】:2020-12-29 19:57:11
【问题描述】:

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

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

我关注了tutorial,它帮助我得到了我想要的东西,但是,当我在工作表中使用相同的代码时,它使用了我在 OnEdit 中阅读的最后一个代码。

如下所示。如果用户更新了 Sheet 1 中的 Column (Col) 1-17,则将最后更新的内容添加到 Row 中的 Col 18。

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

预期行为:

当我在工作表 1 中时,根据工作表 1 中指定的更改和范围更新 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());
  }
 
 }

【问题讨论】:

  • 谷歌应用脚​​本项目中的每个函数都必须有一个唯一的名称
  • @Cooper 当然不建议使用多个同名函数,但是你可以这样做:P 编译器不会抱怨。
  • 脚本编辑器可能不会抱怨,但我认为只有其中一个会运行。
  • @Cooper 是的
  • @Marios 谢谢你们俩 - 这真的很有帮助,并且对于类似问题的链接 - 我解决了我的问题。

标签: javascript arrays google-apps-script google-sheets


【解决方案1】:

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

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 秒内完成。而且我知道人们倾向于过度使用它们,因此让它们快速运行很重要。

【讨论】:

  • 这是一个有效的观点。不需要觉得你在拿分 :) 很好的补充
  • @Cooper 谢谢你,是的,这是一个有效的观点 - 我认为所有这些 OR 都变得有点多了 :)
【解决方案2】:

您不能拥有多个 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());
  }
 
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多