簡體   English   中英

onEdit(e)“總觸發運行時間” - Google表格

[英]onEdit(e) “total trigger runtime” - Google Sheets

我是觸發器的新手,我一直在閱讀有關總觸發器運行時限制的內容。 我試圖創建下面的onEdit(e)腳本來限制觸發器執行的次數。 本質上,如果對特定命名范圍內的特定工作表進行編輯,則腳本會調用,但在G-Suite開發中心中,它會跟蹤這些參數之外的編輯執行。

任何專業知識或建議將不勝感激!

我一直在監控我的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秒之間。

不確定你是否可以設法做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() 引用 ;
  2. onEdit()事件對象引用 ;
  3. Google服務的配額 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM