onEdit(e) "total trigger runtime" - Google 张

onEdit(e) "total trigger runtime" - Google Sheets

我是触发器的新手,我一直在阅读有关总触发器运行时限制的信息。我试图创建下面的 onEdit(e) 脚本来限制触发器执行的次数。本质上,如果对特定命名范围内的特定 sheet 进行了编辑,脚本就会调用,但看起来在 G-Suite 开发中心中它正在跟踪那些参数之外的 onEdit 执行。

任何专业知识或建议将不胜感激!

我一直在监控我的 G-suite 开发中心 "My Executions" 页面。我对触发器知之甚少,也找不到足够的文献来确保脚本得到优化。

function onEdit(e) {  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var ui = SpreadsheetApp.getUi();

  //Row & column indexes of the active cell
  var col = e.range.getColumn();
  var row = e.range.getRow();

  //account for undefined
  if(e.oldValue != undefined) 
     var oldvalue = e.oldValue;
   else
     var oldvalue = '';

   if(col != 3)
      return;

  if(sh.getName() === 'Sheet1') {
    var myRange = ss.getRange('Sheet1NamedRange');

    if (row < myRange.getRow() && row > myRange.getLastRow())
    return;

    if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow() && e.value != e.oldvalue) {
      ui.alert('Changed Value','You have changed ' +oldvalue+ '. Use the undo command (CMD+Z or CTRL+Z) to revert the change!',ui.ButtonSet.OK);
          return;
  }
}

  if(sh.getName() === 'Sheet2') {
    var myRange = ss.getRange('Sheet2NamedRange');

    if (row < myRange.getRow() && row > myRange.getLastRow())
    return;

    if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow() && e.value != e.oldvalue) {
      ui.alert('Changed Value','You have changed ' +oldvalue+ '. Use the undo command (CMD+Z or CTRL+Z) to revert the change!',ui.ButtonSet.OK);
          return;
  }
}

    if(sh.getName() === 'Sheet3') {
    var myRange = ss.getRange('Sheet3NamedRange');

    if (row < myRange.getRow() && row > myRange.getLastRow())
    return;

    if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow() && e.value != e.oldvalue) {
      ui.alert('Changed Value','You have changed ' +oldvalue+ '. Use the undo command (CMD+Z or CTRL+Z) to revert the change!',ui.ButtonSet.OK);
          return;
    }
  }
};

我还没有收到任何配额警告限制,但我只是想提前计划!现在所有的 onEdits 都在 0.071 - 5.8 秒之间。

不确定您是否可以完成 appx。 6 秒内拨打 900 次电话。每天执行一次(例如,消费者的 90 分钟触发运行时间),但如果您担心,可以通过删除所有 getRow()getLastRow()getLastColumn() 并编写它们来减少调用次数进入你的 if 语句范围之外的变量(目前你不必要地在 myRange 上调用这个方法)。

例如,您的第一个电话可能如下所示:

var rowIdx, lRow; //initialize variables once for all checks;
if(sh.getName() === 'Sheet1') {
  var myRange = ss.getRange('Sheet1NamedRange');

  rowIdx = myRange.getRow();
  lRow   = myRange.getLastRow();

  if (row<rowIdx && row>lRow)
  return;

  if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= rowIdx && row <= lRow && e.value != e.oldvalue) {
    ui.alert('Changed Value','You have changed ' +oldvalue+ '. Use the undo command (CMD+Z or CTRL+Z) to revert the change!',ui.ButtonSet.OK);
    return;
  }
}

此外,您的源电子表格已经写入 source 事件对象参数,您不需要 getActiveSpreadsheet(),只需通过 e.source.

引用它

此外,alert() 对话框 暂停 server-side 函数 (从而增加执行运行时间)。由于您的唯一目的是通知用户,因此请改用 showModalDialog() 方法。

有用链接

  1. showModalDialog() reference;
  2. onEdit() 事件对象 reference;
  3. Quotas 用于 Google 服务;