onEdit(e)“总触发器运行时”-Google表格

时间:2019-06-12 06:44:04

标签: google-apps-script google-sheets

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

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

我一直在监视我的G-suite开发中心“我的执行”页面。我对触发器知之甚少,也找不到足够的文献资料来确保脚本得到优化。

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的范围为.071-5.8秒。

1 个答案:

答案 0 :(得分:0)

不确定是否可以管理appx。 900次通话,持续6秒。每天执行一次(例如,消费者需要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()对话框暂停了服务器端功能(因此添加到执行运行时)。由于您的唯一目的是通知用户,请改用showModalDialog()方法。

有用的链接

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