我是触发器的新手,并且我一直在阅读有关触发器总运行时限制的信息。我试图创建下面的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秒。
答案 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()
方法。
有用的链接