Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Google Apps脚本中加速onEdit()函数_Javascript_Performance_Google Apps Script_Google Sheets_Triggers - Fatal编程技术网

Javascript 在Google Apps脚本中加速onEdit()函数

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

我们正在管理来自多个工作表(29个不同位置各一个)的所有更改,以反映在一个主数据库中。然后将主数据库连接到DataStudio进行分析

我们已经为正在进行的更改实现了一个“更新到数据库”记录表,然后每10分钟运行一个触发服务,以实际获取和设置主数据库中的数据

当getLastRow()为onEdit()返回快速连续触发的相同值时,我遇到了onEdit()函数相互写入数据的问题。我已经实现了一个PropertyKey来保存这个值。onEdit()首先更新此值,然后继续。这样,所有后续onEdits()都将正确写入更新后的最后一行

onOpen()函数 这将为更新记录表中的实际最后一行精确设置PropertyKey值

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会记住这一点