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