Javascript 在Google Apps脚本中加速onEdit()函数
我们正在管理来自多个工作表(29个不同位置各一个)的所有更改,以反映在一个主数据库中。然后将主数据库连接到DataStudio进行分析 我们已经为正在进行的更改实现了一个“更新到数据库”记录表,然后每10分钟运行一个触发服务,以实际获取和设置主数据库中的数据 当getLastRow()为onEdit()返回快速连续触发的相同值时,我遇到了onEdit()函数相互写入数据的问题。我已经实现了一个PropertyKey来保存这个值。onEdit()首先更新此值,然后继续。这样,所有后续onEdits()都将正确写入更新后的最后一行 onOpen()函数 这将为更新记录表中的实际最后一行精确设置PropertyKey值Javascript 在Google Apps脚本中加速onEdit()函数,javascript,performance,google-apps-script,google-sheets,triggers,Javascript,Performance,Google Apps Script,Google Sheets,Triggers,我们正在管理来自多个工作表(29个不同位置各一个)的所有更改,以反映在一个主数据库中。然后将主数据库连接到DataStudio进行分析 我们已经为正在进行的更改实现了一个“更新到数据库”记录表,然后每10分钟运行一个触发服务,以实际获取和设置主数据库中的数据 当getLastRow()为onEdit()返回快速连续触发的相同值时,我遇到了onEdit()函数相互写入数据的问题。我已经实现了一个PropertyKey来保存这个值。onEdit()首先更新此值,然后继续。这样,所有后续onEdits
function onOpen() {
// Welcome message
var message = 'The current time is ' + new Date().toString();
var title = 'Welcome to xxxxxx DASHBOARD';
SpreadsheetApp.getActiveSpreadsheet().toast(message, title);
var last_row = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(push_to_db_sheet).getLastRow();
PropertiesService.getScriptProperties().setProperty('last_row_updates_sheet', last_row + 1);
}
onEdit()函数
function onEdit(e){
var activeSheet = e.source.getActiveSheet();
var date_stamp = new Date();
var tabs = ["Customer Requests","Indent Status","Tracking Acknowledgements","Actual Costs","Balance Payments","Payment Updates"];
if(tabs.indexOf(activeSheet.getName()) !== -1){
var row_to_edit = PropertiesService.getScriptProperties().getProperty('last_row_updates_sheet');
row_to_edit= +row_to_edit; // converting string to int
PropertiesService.getScriptProperties().setProperty('last_row_updates_sheet', row_to_edit + 1);
var cell = e.range;
var col = cell.getColumn();
var changes_sheet = e.source.getSheetByName(push_to_db_sheet);
// var last_row = changes_sheet.getLastRow() + 1;
changes_sheet.getRange(row_to_edit, 1).setValue(date_stamp);
changes_sheet.getRange(row_to_edit, 2).setValue(activeSheet.getName());
changes_sheet.getRange(row_to_edit, 3).setValue(activeSheet.getRange(cell.getRow(),3,1,1).getValue());
changes_sheet.getRange(row_to_edit, 4).setValue(cell.getColumn())
changes_sheet.getRange(row_to_edit, 5).setValue(e.value);
cell.setNote('Last modified: ' + date_stamp); // helps the user know when the last edit was made
cell.setBackground("#FBF7EC"); // helps the user visually see when the update has been captured. I can move this up to make it "seem" faster...
} // IF tab name matches
}
关于如何加快onEdit()的速度,有什么想法吗?目前运行需要4-13秒。最后,我将根据编辑的特定单元格调用电子邮件和短信触发功能。我希望弹出一个显示电子邮件/短信的窗口,然后一个确认按钮将触发电子邮件/短信
我担心,如果OneEdit()时间过长,当显示电子邮件/短信弹出对话框时,用户将领先几列。我已更新了此读/写列表:
changes_sheet.getRange(row_to_edit, 1).setValue(date_stamp);
changes_sheet.getRange(row_to_edit, 2).setValue(activeSheet.getName());
changes_sheet.getRange(row_to_edit, 3).setValue(activeSheet.getRange(cell.getRow(),3,1,1).getValue());
changes_sheet.getRange(row_to_edit, 4).setValue(cell.getColumn())
changes_sheet.getRange(row_to_edit, 5).setValue(e.value);
为此:
changes_sheet.getRange(row_to_edit, 1, 1, 5).setValues([[date_stamp , activeSheet.getName() , activeSheet.getRange(cell.getRow(),3,1,1).getValue() , cell.getColumn() , e.value]]);
注:
- setValues()需要一个2D数组。在像我这样设置数据时,确保将数据包装在适当的[]括号中以实现这一点
- 前一种方法的平均onEdit完成时间为7.6988 s
- 更新后的方法的平均OneEdit完成时间减少了52%
onEdit()函数的执行时间是否合理?是否有任何理由不将其作为或的副本关闭?@TheMaster感谢您提供的参考链接。一旦我完成了整个功能的改进,包括电子邮件/短信对话触发器,我会回到这里,发布我的改进方法,这些方法确实有效,并给出一些性能结果。我即将结束。如果您想添加概括答案,可以将其添加到上面链接的任何重复问题中,这样将有一个数据线程,而不是拆分数据。或者,如果您想要一个特定的答案,您可以编辑您现有的答案。也要阅读干燥原理。避免重复整个全局调用:
PropertiesService.getScriptProperties()
和activeSheet.getName()
。。最好将它们存储在变量中。好的-明白了!这是我在网站上的第一个Q,谢谢你给我展示了窍门!下次@TheMaster会记住这一点