【问题标题】:Google App Script not firing every time onedit trigger is used每次使用 onedit 触发器时,Google App 脚本都不会触发
【发布时间】:2018-12-12 14:38:22
【问题描述】:

Google App 脚本未使用 on edit 触发器触发所有 JavaScript 弹出框。对多个用户的工作表进行更改时不会触发。也只有在感觉喜欢的时候才有效。我已将触发器设置为 onEdit()。我的代码:

function Error() {
  
  var sheet = SpreadsheetApp.getActiveSheet();
  
  if (sheet.getName() == "Protocal  Check List 2"){
  var ui = SpreadsheetApp.getUi(); // Same variations.
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var active = ss.getActiveCell();
  var getactive = ss.getActiveCell().getDisplayValue();
  var column = ss.getActiveRange().getColumn();
  var row = ss.getActiveRange().getRow();
  var msg = '';
  var section = sheet.getRange('C'+ row);
    
  switch (column) {
    case 9:
        var msg = "error 1";
        break;
    case 10:
        var msg = "Error 2";
        break;
    default: 
        msg = "Error";
        break;
        }
   if(getactive == "TRUE"){
 
  if(column >= 9 && column <= 60
    ){ 
  var result = ui.alert(
      "pika  Says",
      msg,
      ui.ButtonSet.YES_NO);

  // Process the user's response.
  if (result == ui.Button.YES) {
    // User clicked "Yes".
    window.alert('Task Complete: \n\n' + msg);
    active.setValue('True');
  } else {
    
      var i = 0;
      
      while (i < 1) {
      var result = ui.prompt(
      'Please detail cause of the problem:',
      ui.ButtonSet.OK);

      
      var text = result.getResponseText();
      
      var textcount = text.length;
      
      if(textcount > 0) {
      i++;
      }}
    
    var cell = "H" + row;
      
      var emailAddress = "email@gmail.com";
      var d = new Date();
      var n = d.toDateString();
      var t = d.toTimeString();
      var staffname = ss.getRange(cell).getValues();
      
      var message = "Date: " + n +"\n\nTime: " + t +"\n\nStaff: " + staffname + "\n\nError: " + msg + "\n\nProblem: " + text;
      var subject = msg;
      
      var thedate = n + " / " + t;
      
      ss.getRange('A1').setValue(thedate);
      ss.getRange('B1').setValue(staffname);
      ss.getRange('C1').setValue(msg);
      ss.getRange('D1').setValue(text);
     
      var s1 = ss.getRange('A1:D1'); //assign the range you want to copy

      var s1v = s1.getValues();
      
      var tss = SpreadsheetApp.openById('1mOzdRgKxiP5iB9j7PqUWKKo5oymWuAeQZ1jJ1s6qL9E'); //replace with destination ID

      var ts = tss.getSheetByName('AB Protocal'); //replace with destination Sheet tab name
      
      ts.getRange(ts.getLastRow()+1, 1, 1,4).setValues(s1v); //you will need to define the size of the copied data see getRange()
      
      MailApp.sendEmail(emailAddress, subject, message);
  
      // User clicked "No" or X in the title bar.
      //ui.alert("The following note has been sent to the Duty Manager: \n\n" + text);
      active.setValue('FALSE');
    
  }}}}
  
}

任何帮助将不胜感激。我需要它为有权访问工作表的用户在每个信号时间运行。

【问题讨论】:

标签: google-apps-script google-sheets triggers


【解决方案1】:

你必须 假设 onEdit 触发器是尽力而为,但可能无法捕获所有 对电子表格进行了编辑。

错误线程是here

【讨论】:

    【解决方案2】:

    要解决Edward 提到的错误,请实现一个哑路由器。

    // create a new file -> router.gs
    function routerOnEdit(e) {
       myOnEditHook1(e);
       myOnEditHook2(e);
       myOnEditHook3(e);
    }
    

    【讨论】:

    • 这段代码究竟是如何工作的?是否有单独的 routerOnEdit 事件在编辑时触发?
    • @AlexanderBenjamin 您将 routerOnEdit 函数设置为由 ON_EDIT 事件触发,然后您只需在 routerOnEdit 函数中调用任何要在编辑时触发的函数。这就像一个直接的一对多传递。
    • @WiR3D 请解释这是如何绕过“尽力而为”的情况。这似乎会发生完​​全相同的错误。有时 onEdit 会被调用,有时不会。对我来说,当我快速连续进行 2 次编辑时,第二次不会调用 onEdit。我看不到添加路由器功能如何解决此问题。我当前的触发器已经是指向“OnEdit”的自定义触发器,而不是默认的“onEdit”。据我所知,我们的代码是一样的......
    【解决方案3】:

    我提交了一个问题,这是一个长期运行 7 年的问题的更新版本。他们在 2022 年将其关闭,称该功能是有意的。他们现在添加了一项功能,其中 onEdit 最多可以排队 2 个触发事件。我遇到的问题是第二次编辑仍然没有触发。不管文档怎么说。

    注意:onEdit() 触发器最多只能排队 2 个触发器事件。

    在此处查看新问题:https://issuetracker.google.com/issues/221703754

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      相关资源
      最近更新 更多