【问题标题】:Google script project trigger not running?谷歌脚本项目触发器没有运行?
【发布时间】:2017-07-18 01:02:27
【问题描述】:

我是 Javascript 的新手,一直在编写这个脚本,以获取电子表格中的最新条目(从 Google 表单创建),将收集到的用户电子邮件地址与第二张表中的名册匹配,并向家长发送电子邮件。我是一名教师,我的想法是能够创建一个 google 表单,用于编译学生输入的信息,并在他们提交表单/更新表格后通过电子邮件将其发送给他们的父母。

我知道这很混乱......还有一些额外的变量和东西,但是当您“运行”脚本时,脚本可以完美/按预期工作。唯一的事情是,我试图在提交表单时让脚本在触发器上运行,但事实并非如此。我在使用触发器时遗漏了什么吗?

代码如下:

function createEmail() {
  // Sets variables for both sheets
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sheet1 = ss.getSheets()[0];
  var sheet2 = ss.getSheets()[1];

  // This gathers information from the most recent entry and write it to an array called newReflectionValues
  var reflectionLastRow = sheet1.getLastRow();
  var reflectionLastColumn = sheet1.getLastColumn();
  var reflectionLastCell = sheet1.getRange(reflectionLastRow, reflectionLastColumn).getValue();
  var reflectionRange = sheet1.getRange(reflectionLastRow, 1, 1, reflectionLastColumn);  
  var newReflectionValues = reflectionRange.getValues();

  var studentEmail = newReflectionValues[0][3];

    Logger.log("NEW REFLECTION VALUES")
    Logger.log(newReflectionValues);

    Logger.log("Email will send to student email:")
    Logger.log(studentEmail)

  // Makes an array of the parent email addresses
  var rosterLastRow = sheet2.getLastRow();
  var rosterLastColumn = sheet2.getLastColumn();
  var rosterEmails = sheet2.getSheetValues(2, 1, rosterLastRow, rosterLastColumn);

  Logger.log("PARENT EMAILS")
  Logger.log(rosterEmails);  

  // Cross check emails - if a match, write emails to variable
  var parentEntriesLength = rosterLastRow;

  for (i = 0; i < parentEntriesLength; i++) {
    var currentRange = rosterEmails[i];

    if (currentRange[2] == studentEmail) {
      var toParents = String(currentRange[3]) + ", " + String(currentRange[4]);
      var studentName = String(currentRange[0]);
      var countOfReflections = currentRange[6];
      break;
    } else {
    var toParents = "NO PARENT EMAILS FOUND";
    }
  } 

// FINISH EMAIL BELOW

  MailApp.sendEmail({
     to: toParents,
     bcc: "rdoyle@rafos.org" + ", " + String(studentEmail),
     subject: "Behavior Reflection Notification",

    htmlBody: "<p>Hello,</p>" +
    "<p>Today studentName received a behavior reflection for the following action:</p>" +
    "<p>newReflectionValues</p>" +
    "<p>They took a short break in class and completed the following reflection:</p>" +
    "<p>reflectionInformation</p>" +
   "<p>" + String(studentName) + " has recieved " + countOfReflections + " reflections this year." + "</p>" +
    "<p>This email has been sent with information that the student completed directly on the reflection form and has been bcc'd to them as well as myself. If you have any questions regarding this behavior or incident, please feel free to ask.</p>"

  });

}

【问题讨论】:

  • 您是如何构建触发器的?触发器可以应用的操作有一些限制。我不确定这是否适用于您的问题。 developers.google.com/apps-script/guides/triggers
  • 我想这就是我所迷失的。我已经看过那个文档,但我不确定我是否应该制作自己的触发器,或者只是能够通过转到编辑>当前项目触发器>然后以这种方式设置它来设置它.
  • 在许多情况下,编写代码来设置触发器是没有意义的。如果您需要为用户安装触发器,而他们自己无法完成,那么您可以使用代码创建触发器。如果是自己用,只需要安装一次,然后无限期运行,最好手动安装。
  • 好的,现在说得通了。我刚刚看了一个小时长的谷歌脚本介绍,来自谷歌开发者的直播视频。我相信手动设置触发器是我应该做的,但这让我回到了主要问题。如果我直接从脚本编辑页面运行脚本,一切正常,但如果我手动创建触发器......什么都没有。

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


【解决方案1】:

您知道有两种类型的触发器simple 和installable,但我认为您对它们的实际含义/作用有些困惑。我将尝试从此处的文档中解释要点。

通过简单地用触发器名称命名函数来使用简单触发器。例如,对于 Sheets / Forms,当用户提交表单时触发 onFormSubmit(e)。参数e 包含与提交相关的所有信息,您应该查看它,因为它比您当前获取提交信息的方法更可靠。 See here: 'e' parameter

简单触发器的功能受到限制,因为不必授权脚本即可触发触发器。简单的触发器无法访问其他文件、发送电子邮件或执行任何需要授权的操作。 See here

已安装的触发器是由用户手动设置或由脚本设置的触发器。已安装的触发器具有更多功能,但仍有一些限制。 See here

已安装的触发器可以调用任何命名函数,e 参数的工作方式与简单触发器的工作方式相同。

从您安装的触发器上方的代码来看,应该是这样的。

当你点击保存时,你应该被要求授权,如果你没有被要求,点击调试/运行按钮来授权脚本。

如果还是不行,查看view -> execution transcript中的执行记录,最后一行会指出错误。

【讨论】:

    【解决方案2】:

    好的,James 帮了很多忙,但我似乎在验证发送电子邮件的权限时遇到了很多问题。最后我决定更清楚地重写所有内容,添加一些功能,以便与我一起工作的其他人可以使用相同的脚本,并记录电子邮件是否真的发送给了父母。这个最终版本使用 if 语句在列中查看是否为每个响应发送了电子邮件,然后在需要时发送电子邮件并记录发送时间。我还添加了一个函数来设置该“确认”列并创建一个名册表作为单个函数以及单独的。哦,它还寻找一个 html 模板来格式化电子邮件。我在 Google 开发者直播中找到了该信息:https://www.youtube.com/watch?v=U9Ej6PCeO6s

    谢谢大家!

    function createConfirmationColumn() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    
    var sheet1 = ss.getSheets()[0];
    
    var lastColumn = sheet1.getLastColumn();
    var lastColumnValue = sheet1.getRange(1,lastColumn).getValue();
    
    // Creates the final column to log the time that emails are sent
    if (lastColumnValue != "Email Sent On:") {
        sheet1.insertColumnsAfter(lastColumn, 1);
        var emailSentOnColumn = sheet1.getRange(1,lastColumn+1).setValue("Email Sent On:");
    }
    }
    
    function createRosterSheet() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
    
      ss.insertSheet("Roster & Parent Emails", 1);
      var rosterSheet = ss.getSheets()[1];
    
      rosterSheet.getRange(1,1).setValue("First Name")
      rosterSheet.getRange(1,2).setValue("Last Name")
      rosterSheet.getRange(1,3).setValue("Student Email")
      rosterSheet.getRange(1,4).setValue("Parent Email 1")
      rosterSheet.getRange(1,5).setValue("Parent Email 2")
      rosterSheet.getRange(1,6).setValue("Notes")
      rosterSheet.getRange(1,7).setValue("Total Reflections")
    
    }
    
    function formSetup() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    
    var sheet1 = ss.getSheets()[0];
    
    var lastColumn = sheet1.getLastColumn();
    var lastColumnValue = sheet1.getRange(1,lastColumn).getValue();
    
    // Creates the final column to log the time that emails are sent
    if (lastColumnValue != "Email Sent On:") {
        sheet1.insertColumnsAfter(lastColumn, 1);
        var emailSentOnColumn = sheet1.getRange(1,lastColumn+1).setValue("Email Sent On:");
    }
    
    ss.insertSheet("Roster & Parent Emails", 1);
      var rosterSheet = ss.getSheets()[1];
    
       rosterSheet.getRange(1,1).setValue("First Name")
       rosterSheet.getRange(1,2).setValue("Last Name")
      rosterSheet.getRange(1,3).setValue("Student Email")
      rosterSheet.getRange(1,4).setValue("Parent Email 1")
      rosterSheet.getRange(1,5).setValue("Parent Email 2")
      rosterSheet.getRange(1,6).setValue("Notes")
      rosterSheet.getRange(1,7).setValue("Total Reflections")
    }
    
    function sendEmails() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    
    var sheet1 = ss.getSheets()[0];
    var sheet2 = ss.getSheets()[1];
    
    var lastColumn = sheet1.getLastColumn();
    var lastColumnValue = sheet1.getRange(1,lastColumn).getValue();
    
    var allFormEntries = sheet1.getDataRange().getValues();
    var allRosterValues = sheet2.getDataRange().getValues()
    
      for (e = 1; e < sheet1.getLastRow(); e++) {
    var formRange = allFormEntries[e];
    
    var studentEmailInForm = formRange[1];
    var emailSentOn = formRange[4];
    
    if (emailSentOn == "") {
    
    for (i = 1; i < sheet2.getLastRow(); i++) {
      var individualRosterEntry = allRosterValues[i];
    
      if (studentEmailInForm == individualRosterEntry[2]) {
        var parentEmails = String(individualRosterEntry[3]) + ", " + String(individualRosterEntry[4]);
    
        var emailTemplate = HtmlService.createTemplateFromFile("emailTemplate");
        emailTemplate.studentName = individualRosterEntry[0];
        emailTemplate.reflectionCount = individualRosterEntry[6];
        emailTemplate.reason = formRange[2];
    
        MailApp.sendEmail({
          to: parentEmails,
          bcc: "rdoyle@rafos.org" + ", " + String(studentEmailInForm),
          subject: "Behavior Reflection Notification",
          htmlBody: emailTemplate.evaluate().getContent(),
        })
    
        sheet1.getRange((e+1), lastColumn).setValue(new Date());
        break;
      } else {
       sheet1.getRange((e+1), lastColumn).setValue("No valid email found") ;
      }
    
    } // for i loop
    
    } //if email sent == ""
    
      } //for e loop
    
    } //function
    

    【讨论】:

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