开发者问题收集

Google App Script 项目执行中的未知状态

2019-05-09
1475

我有一个 Google 表单,供现场工作人员填写并提交。附加的 javascript 将表单内容作为电子邮件发送给办公室中的每个人。

执行时间非常长。其中一个报告了 19496 秒,而 Gsuite 应该在 5 分钟后自动终止任何脚本。有些在 Google 应用脚本执行日志中显示“未知”状态,并且为 0 秒。

Gsuite 配额是否已用完?我的脚本中是否有错误?

运行脚本触发器的用户也会收到退回电子邮件,即使所有电子邮件都在发送,并且 Google 表格正在正常接收来自 Google 表单的响应。

我尝试在顶部添加“if(e.values && !e.values[1]){return;}”并在底部添加“return;”。这似乎并没有改变问题。

我编辑了下面的 Google 应用脚本,删除了电子邮件地址的实际列表,并缩短了报告。Google 表单的目的是提供他们一天工作的真实摘要,而不仅仅是电子邮件中的“工作已完成”。因此,他们填写了 15 个问题的列表。

function myFunction(e){

// Set values for event "e" from Response form, each number being a column in the spreadsheet 
    var value1 = e.values[1];
    var value2 = e.values[2];
    var value3 = e.values[3];
    var value4 = e.values[4];
    var value5 = e.values[5];


  // Build subject and message for email that will be sent out
    var subject1 = value5 + " Job #" + value2 + " " + value3 + " Job Report Submitted " + value1 + "    -oOo-";
        var message_html = "<b>Date:</b> " + value1 + "<br>" + 
                   "<b>Job Number:</b> " + value2 + "<br>" +
                     "<b>Site Name:</b> " + value3 + "<br>" +
                     "<b>Client:</b> " + value4 + "<br>" +
                       "<b>Crew Chief:</b> " + value5 + "<br>";            


     // Send email to chief, of what the chief submitted through the Response form
     var chiefemail = "[email protected]"; //setting leo email as the default - but this should not be used based on below 
     var chiefname  = "Leo E.";

     if (value5 == "Bryan N.") {
                                    chiefemail = "[email protected]";
                                    chiefname  = "Brian N";}
     else if (value5 == "Carl B.") {
                                    chiefemail = "[email protected]";
                                    chiefname = "Carl B";
                                   }
     else if (value5 == "Clay W.") {
                                    chiefemail = "[email protected]";
                                    chiefname = "Clay W";
                                     }
     else if (value5 == "Dakota P."){
                                    chiefemail = "[email protected]";
                                    chiefname = "Dakota P";
                                     }



 // Send emails to all office staff:     

   var EmailList = "[email protected]," + chiefemail; 


       MailApp.sendEmail({
                          to: EmailList,
                          subject: subject1,
                          htmlBody: message_html,
                          name: chiefname,
                          replyTo: chiefemail
                           });


}

我希望脚本终止,并且我不想收到退回的电子邮件。救命!

3个回答

我认为您可能遇到了我所说的虚假 onFormSubmit 触发器,我可能会尝试类似这样的方法。

function myFunction(e){
  if(e.values && e.values[1] && e.values[2] && e.values[3] && e.values[4] && e.values[5]) {
    var value1 = e.values[1];
    var value2 = e.values[2];
    var value3 = e.values[3];
    var value4 = e.values[4];
    var value5 = e.values[5];
    var subject1 = value5 + " Job #" + value2 + " " + value3 + " Job Report Submitted " + value1 + "    -oOo-";
    var message_html = "<b>Date:</b> " + value1 + "<br>" + 
      "<b>Job Number:</b> " + value2 + "<br>" +
        "<b>Site Name:</b> " + value3 + "<br>" +
          "<b>Client:</b> " + value4 + "<br>" +
            "<b>Crew Chief:</b> " + value5 + "<br>";            
    var chiefemail = "[email protected]"; //setting leo email as the default - but this should not be used based on below 
    var chiefname  = "Leo E.";
    if (value5 == "Bryan N.") {
      chiefemail = "[email protected]";
      chiefname  = "Brian N";}
    else if (value5 == "Carl B.") {
      chiefemail = "[email protected]";
      chiefname = "Carl B";
    }
    else if (value5 == "Clay W.") {
      chiefemail = "[email protected]";
      chiefname = "Clay W";
    }
    else if (value5 == "Dakota P."){
      chiefemail = "[email protected]";
      chiefname = "Dakota P";
    }
    var EmailList = "[email protected]," + chiefemail; 
    MailApp.sendEmail({
      to: EmailList,
      subject: subject1,
      htmlBody: message_html,
      name: chiefname,
      replyTo: chiefemail
    });
  }
}

您可以在 此处 了解更多信息。您还可以检查堆栈驱动程序日志以查看发生了什么。

Cooper
2019-05-09

最近我也开始遇到这种情况。

根据执行记录,我的 goGet 和 goPost 执行似乎无限运行,即使服务器返回响应相当快。

我注意到,只有当我以匿名用户身份在隐私浏览模式下运行 doGet 和 doPost 时,才会发生这种情况。如果我已登录,则执行记录对该特定请求的行为正常。

我维护了一个相当大的 Google Apps 脚本,在过去 1.5 年中使用率相当高。最近我的脚本开始出现这种情况。令人震惊的是,您的 SO 帖子也相当新。

将脚本复制到新脚本可以暂时解决问题,但最终新脚本也会开始出现此问题。一旦新脚本开始显示这些症状,某些部分的代码(特别是以编程方式打开和读取 Google 表格)就会停止正常工作并开始出现故障。因此,我认为这个问题不仅仅是执行记录中的一个视觉问题,而且它还对该脚本中其他代码的实际行为产生了负面影响。

tej
2019-05-15

我有一个 Google 插件脚本,它运行了几个月,但最近出现了一些与描述类似的行为 - 特别是函数失败,执行时间为 0 秒,类型为“未知”。

我还没有找到原因,不过今天我联系了 Google 脚本支持,看他们能否解释一下。

不过,我 已经 找到了一种解决方法。我的脚本在我没有更改代码时就开始出现这种奇怪的行为。然而,我 已经 启用了 V8 运行时。如果我将其切换回旧的 ES5“Rhino”运行时,一切都会恢复到以前的状态。

查看此页面了解如何执行此操作 ,然后尝试一下。我仍在梳理我的脚本以查找任何列出的不兼容性,但尚未发现任何问题,但至少我的用户可以在我搜索期间继续使用该脚本!

使用 Rhino 运行时时,类型为“未知”的执行将恢复为其以前的值,这些值似乎都是“Web App”。

axemonkey
2020-02-24