![](/img/trans.png)
[英]onEdit(e) trigger won't call function automatically in google sheets
[英]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()
方法。
有用的鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.