【问题标题】:Single onEdit function works - multiple of the same function dont单个 onEdit 功能有效 - 多个相同功能无效
【发布时间】:2018-03-09 18:18:56
【问题描述】:

我正在使用 Google 表格,并且我有两个功能 onEditonCommsEdit 非常好用,并为各自的表格添加了时间戳。如果我完全复制并粘贴其中一个并给出一个新的函数名称 - 附加功能似乎不起作用。

我是不是点错货了?或者我应该在同一个函数中命名所有工作表? (我创建了重复项,因为对列的写入因工作表而异。)

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{name:"Last Row", functionName:"goto_last"}];
  sheet.addMenu("Shortcuts", entries);
   myFunction();
};

function goto_last() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var mysheet = ss.getActiveSheet();

  var lastrow = mysheet.getLastRow();

  mysheet.setActiveCell(mysheet.getDataRange().offset(lastrow-1, 0, 1, 1));
}; 

function onEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  if( s.getName() == "Primary Log" ) { 
  var r = s.getActiveCell();
  var user = Session.getActiveUser().getEmail();
  if( r.getColumn() != 13 ) { //checks the column
    var row = r.getRow();
    var time = new Date();
    time = Utilities.formatDate(time, "GMT-08:00", "yyyy-MM-dd, hh:mm:ss");
    SpreadsheetApp.getActiveSheet().getRange('M' + row.toString()).setValue(time);
    SpreadsheetApp.getActiveSheet().getRange("N" + row.toString()).setValue(user);
  }
  };
 };

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var mysheet = ss.getActiveSheet();

  var lastrow = mysheet.getLastRow();

  mysheet.setActiveCell(mysheet.getDataRange().offset(lastrow-1, 0, 1, 1));
}; 

function onCommsEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  if( s.getName() == "Received Report" ) { 
  var r = s.getActiveCell();
  var user = Session.getActiveUser().getEmail();
  if( r.getColumn() != 11 ) { //checks the column
    var row = r.getRow();
    var time = new Date();
    time = Utilities.formatDate(time, "GMT-08:00", "yyyy-MM-dd, hh:mm:ss");
    SpreadsheetApp.getActiveSheet().getRange('K' + row.toString()).setValue(time);
    SpreadsheetApp.getActiveSheet().getRange("L" + row.toString()).setValue(user);
  }
  };
 };

【问题讨论】:

  • 你到底想做什么?
  • onCommsEdit()函数是如何触发的?还有myFunction()goto_last()是完全一样的函数,为什么需要两个相同函数的副本?

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


【解决方案1】:

您必须创建a trigger 才能自动调用函数。

不建议使用onEdit 条件调用多个函数,因为执行顺序没有明确定义。我也不建议将需要installed trigger 的函数命名为与相应的simple trigger 匹配——换句话说,不应调用需要授权范围且在修改电子表格值后运行的函数onEdit(e),因为这是激活简单触发器的函数的名称。如果您的函数不需要授权范围,那么您可以使用简单触发器。

就您的程序设计而言,您应该使用流控制。而不是多个功能,简单的分支就足够了:

function calledOnEdit(e) {
  if(!e) { throw new Error("This function requires an event object"); }

  // Use the event object rather than lookups that assume the active cell was the edited cell:
  var s = e.range.getSheet();
  var row = e.range.getRow();
  var col = e.range.getColumn();
  if( s.getName() == "Primary Log" && col != 13 ) { //checks the column
    logTimestamp(s, "M" + row + ":N" + row);
  } else if( s.getName() == "Received Report" && col != 11 ) { //checks the column
    logTimestamp(s, "K" + row + ":L" + row);
  }
}
function logTimestamp(sheet, a1ref) {
  var user = Session.getActiveUser().getEmail();
  var time = Utilities.formatDate(new Date(), "GMT-08:00", "yyyy-MM-dd, hh:mm:ss");
  sheet.getRange(a1ref).setValues([[time, user]]);
}

【讨论】:

  • 非常有帮助。谢谢。
猜你喜欢
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多