Javascript 当一个特定的谷歌表单项目被回复时,我如何发送审批人电子邮件

Javascript 当一个特定的谷歌表单项目被回复时,我如何发送审批人电子邮件,javascript,google-apps-script,google-sheets,google-forms,Javascript,Google Apps Script,Google Sheets,Google Forms,我在使用谷歌表单/表单时遇到了麻烦——从一开始你就知道我不是一个很好的程序员,而且我对使用应用程序脚本非常陌生 我正在努力实现以下目标: 1) 让用户回答表单上的单个问题 2) 如果回答了该问题,并且在相关工作表的单元格列中写入了一个值,则会自动向2个预定义的审批人电子邮件地址发送电子邮件 3) 如果该问题未得到回答,且单元格列中未写入任何值,则不会向2名审批人发送电子邮件 如果我使用下面包含的脚本手动将值添加到工作表中的相应列中,我就可以做到这一点,但如果写入工作表的值直接来自表单(这正是我需

我在使用谷歌表单/表单时遇到了麻烦——从一开始你就知道我不是一个很好的程序员,而且我对使用应用程序脚本非常陌生

我正在努力实现以下目标:

1) 让用户回答表单上的单个问题 2) 如果回答了该问题,并且在相关工作表的单元格列中写入了一个值,则会自动向2个预定义的审批人电子邮件地址发送电子邮件 3) 如果该问题未得到回答,且单元格列中未写入任何值,则不会向2名审批人发送电子邮件

如果我使用下面包含的脚本手动将值添加到工作表中的相应列中,我就可以做到这一点,但如果写入工作表的值直接来自表单(这正是我需要它做的!),我就无法做到这一点

下面是我在表单工作表上的脚本编辑器中编写的代码,允许我手动更新列并将通知发送给审批人(同样,我的问题是,如果从表单动态更新列,则不会发送电子邮件)。正如现在所写的,如果我手动更新第5列和/或第7列,将向指定的审批人发送一封电子邮件

但是,如果表单动态更新第5列或第7列,它也不会发送通知

请帮帮我,我已经被困在这个问题上好几天了-谢谢

这是我当前的脚本:

/* 
 * This function sends an email when a specific Google Sheets column is edited
 * The spreadsheets triggers must be set to onEdit for this function to work
 */

function sendNotification() {
    //var ss = SpreadsheetApp.openById('1N6dqSXs8hdhCi1vrOGT7I7tD2yDMtgK7BSddMPqmuo0');  
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    //Get Active cell
    var mycell = ss.getActiveSelection();
    var cellcol = mycell.getColumn();
    var cellrow = mycell.getRow();
    //Define Notification Details for vars

    var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
    var recipients1 = "joseph2@XXXXX.com"

    var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
    var subject1 = "ALERT: SENSITIVE DATA REQUEST";
    var body = ss.getName() + " has been updated.  Visit " + ss.getUrl() + " to view the changes.";

    //Check to see which column will trigger the email - this script sends an email to "var recipients" if 
    //column 5 is updated and sends and email to "var recipients1" when colum 7 is updated.

    if (cellcol == 5) {
        //Send the Email to recipients defined in "var recipients"
        MailApp.sendEmail(recipients, subject, body);
    }

    if (cellcol == 7) {
        //Send the Email to recipients defined in "var recipients1"
        MailApp.sendEmail(recipients1, subject1, body);
    }

    //End sendNotification
}
function sendNotificationAtEdit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//get edited range
var range = event.range;
var cellcol = range.getColumn();
var cellrow = range.getRow();

//Define Notification Details for vars
var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
var recipients1 = "joseph2@XXXXX.com"

var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
var subject1 = "ALERT: SENSITIVE DATA REQUEST";
var body = ss.getName() + " has been updated.  Visit " + ss.getUrl() + " to view the changes.";

    if (cellcol == 5) {
        //Send the Email to recipients defined in "var recipients"
        MailApp.sendEmail(recipients, subject, body);
    }

    if (cellcol == 7) {
        //Send the Email to recipients defined in "var recipients1"
        MailApp.sendEmail(recipients1, subject1, body);
    }

    //End sendNotification
}
function sendNotificationAtFormSubmit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

//Define Notification Details for vars
var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
var recipients1 = "joseph2@XXXXX.com"

var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
var subject1 = "ALERT: SENSITIVE DATA REQUEST";
var body = ss.getName() + " has been updated.  Visit " + ss.getUrl() + " to view the changes.";
//if form submitted 5th question's answer is not empty
    if (event.values[4] !== '') {
        //Send the Email to recipients defined in "var recipients"
        MailApp.sendEmail(recipients, subject, body);
    }

    if (event.values[6] !== '') {
        //Send the Email to recipients defined in "var recipients1"
        MailApp.sendEmail(recipients1, subject1, body);
    }

    //End sendNotification
}
以下是如何设置工作表上的触发器: 发送电子表格通知1)更改,2)编辑,3)表单提交


最后一件事-我的公司不允许加载项,所以我必须用应用程序脚本来实现这一点…

设置单独的触发器以分离事件

对于工作表编辑事件:

/* 
 * This function sends an email when a specific Google Sheets column is edited
 * The spreadsheets triggers must be set to onEdit for this function to work
 */

function sendNotification() {
    //var ss = SpreadsheetApp.openById('1N6dqSXs8hdhCi1vrOGT7I7tD2yDMtgK7BSddMPqmuo0');  
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    //Get Active cell
    var mycell = ss.getActiveSelection();
    var cellcol = mycell.getColumn();
    var cellrow = mycell.getRow();
    //Define Notification Details for vars

    var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
    var recipients1 = "joseph2@XXXXX.com"

    var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
    var subject1 = "ALERT: SENSITIVE DATA REQUEST";
    var body = ss.getName() + " has been updated.  Visit " + ss.getUrl() + " to view the changes.";

    //Check to see which column will trigger the email - this script sends an email to "var recipients" if 
    //column 5 is updated and sends and email to "var recipients1" when colum 7 is updated.

    if (cellcol == 5) {
        //Send the Email to recipients defined in "var recipients"
        MailApp.sendEmail(recipients, subject, body);
    }

    if (cellcol == 7) {
        //Send the Email to recipients defined in "var recipients1"
        MailApp.sendEmail(recipients1, subject1, body);
    }

    //End sendNotification
}
function sendNotificationAtEdit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//get edited range
var range = event.range;
var cellcol = range.getColumn();
var cellrow = range.getRow();

//Define Notification Details for vars
var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
var recipients1 = "joseph2@XXXXX.com"

var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
var subject1 = "ALERT: SENSITIVE DATA REQUEST";
var body = ss.getName() + " has been updated.  Visit " + ss.getUrl() + " to view the changes.";

    if (cellcol == 5) {
        //Send the Email to recipients defined in "var recipients"
        MailApp.sendEmail(recipients, subject, body);
    }

    if (cellcol == 7) {
        //Send the Email to recipients defined in "var recipients1"
        MailApp.sendEmail(recipients1, subject1, body);
    }

    //End sendNotification
}
function sendNotificationAtFormSubmit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

//Define Notification Details for vars
var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
var recipients1 = "joseph2@XXXXX.com"

var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
var subject1 = "ALERT: SENSITIVE DATA REQUEST";
var body = ss.getName() + " has been updated.  Visit " + ss.getUrl() + " to view the changes.";
//if form submitted 5th question's answer is not empty
    if (event.values[4] !== '') {
        //Send the Email to recipients defined in "var recipients"
        MailApp.sendEmail(recipients, subject, body);
    }

    if (event.values[6] !== '') {
        //Send the Email to recipients defined in "var recipients1"
        MailApp.sendEmail(recipients1, subject1, body);
    }

    //End sendNotification
}
对于表单提交事件:

/* 
 * This function sends an email when a specific Google Sheets column is edited
 * The spreadsheets triggers must be set to onEdit for this function to work
 */

function sendNotification() {
    //var ss = SpreadsheetApp.openById('1N6dqSXs8hdhCi1vrOGT7I7tD2yDMtgK7BSddMPqmuo0');  
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    //Get Active cell
    var mycell = ss.getActiveSelection();
    var cellcol = mycell.getColumn();
    var cellrow = mycell.getRow();
    //Define Notification Details for vars

    var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
    var recipients1 = "joseph2@XXXXX.com"

    var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
    var subject1 = "ALERT: SENSITIVE DATA REQUEST";
    var body = ss.getName() + " has been updated.  Visit " + ss.getUrl() + " to view the changes.";

    //Check to see which column will trigger the email - this script sends an email to "var recipients" if 
    //column 5 is updated and sends and email to "var recipients1" when colum 7 is updated.

    if (cellcol == 5) {
        //Send the Email to recipients defined in "var recipients"
        MailApp.sendEmail(recipients, subject, body);
    }

    if (cellcol == 7) {
        //Send the Email to recipients defined in "var recipients1"
        MailApp.sendEmail(recipients1, subject1, body);
    }

    //End sendNotification
}
function sendNotificationAtEdit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//get edited range
var range = event.range;
var cellcol = range.getColumn();
var cellrow = range.getRow();

//Define Notification Details for vars
var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
var recipients1 = "joseph2@XXXXX.com"

var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
var subject1 = "ALERT: SENSITIVE DATA REQUEST";
var body = ss.getName() + " has been updated.  Visit " + ss.getUrl() + " to view the changes.";

    if (cellcol == 5) {
        //Send the Email to recipients defined in "var recipients"
        MailApp.sendEmail(recipients, subject, body);
    }

    if (cellcol == 7) {
        //Send the Email to recipients defined in "var recipients1"
        MailApp.sendEmail(recipients1, subject1, body);
    }

    //End sendNotification
}
function sendNotificationAtFormSubmit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

//Define Notification Details for vars
var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
var recipients1 = "joseph2@XXXXX.com"

var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
var subject1 = "ALERT: SENSITIVE DATA REQUEST";
var body = ss.getName() + " has been updated.  Visit " + ss.getUrl() + " to view the changes.";
//if form submitted 5th question's answer is not empty
    if (event.values[4] !== '') {
        //Send the Email to recipients defined in "var recipients"
        MailApp.sendEmail(recipients, subject, body);
    }

    if (event.values[6] !== '') {
        //Send the Email to recipients defined in "var recipients1"
        MailApp.sendEmail(recipients1, subject1, body);
    }

    //End sendNotification
}

最安全的方法是检查表单响应,而不是电子表格中的单元格。至少不适用于表单提交触发器。您可能同时需要和
onEdit()
触发器,以及表单提交触发器

因此,在On Form Submit触发器中,您需要获取当前表单响应,获取所需的项,然后从对应于电子表格第5列的项中获取单个响应

您可以检查响应表中的最后一行,并获得第5列,如果您从未有很多人同时提交表单请求,那么这将非常有效。在这种情况下,您需要锁定文档,这可能是您无论如何都要做的

为了使用onsubmit触发器获得最后一个响应,您需要将“event”对象添加到函数中

function sendNotification(e) {
然后您需要获得当前响应:

function sendNotification(e) {
  /* Logger.log('e: ' + e);

  for (var key in e) {
    Logger.log('key: ' + key)  
    Logger.log('value: ' + e[key]);
  };  */

  var allAnswers = e.response.getItemResponses();
  var howManyQuestionsInForm = allAnswers.length;
  Logger.log('howManyQuestionsInForm: test again: ' + howManyQuestionsInForm);
  /* for (var key in allAnswers) {
    Logger.log('key: ' + key)  
    Logger.log('value: ' + allAnswers[key]);
  }; */

  var questionThree = allAnswers[2];

  var theAnswerIs = questionThree.getResponse();
  Logger.log('theAnswerIs: ' + theAnswerIs);

  if (theAnswerIs !== "") {
    //Send email
    Logger.log('it got to here')
  };

};

表单和工作表都可以有“表单提交”触发器。您在问题中显示了一个函数。我不明白你对触发器设置的解释。您是否为多个触发器分配了
sendNotification()
功能?嗨,桑迪-谢谢您的帮助。以下是我的项目触发器的外观:在更改、编辑和表单提交时从电子表格发送通知感谢您的帮助!我已经做了您的更改,但是现在当我尝试运行脚本时,我得到了TypeError:无法从undefined读取属性“range”。它停在第15行,即:var range=event.range,您无法运行脚本,在第5列编辑电子表格单元格,并选中Yes,如果我直接编辑电子表格,它仍会发送通知,但当通过回答表单中的问题将条目添加到第5列时,它不会发送通知。我编辑了我的答案,您需要设置单独的触发器,再次感谢您的帮助。所以我用两个问题创建了一个新表单。我只想在问题2已经回答的情况下收到一封电子邮件。我试过你的代码,我把所有的引用从“第五”改为“第二”。仍然无法工作,我已将电子表格设置为“编辑”,并将表单上的电子表格设置为“提交触发器”。仍然不确定我做错了什么…好的-当任何列被修改时,这会从表单发送一封电子邮件,但是如果只有一列被修改,我应该添加什么来发送电子邮件?函数sendNotification(){var ss=SpreadsheetApp.getActiveSpreadsheet();var sheet=ss.getSheetByName(“表单响应1”);var row=sheet.getActiveRange().getRow();var lastRowNumber=sheet.getDataRange().getNumRows();var recipients=“joseph.@xxx.com,ggg@xxx.com“var subject='xxx';var body=ss.getName()+“X”+ss.getUrl()+“X.”;{MailApp.sendmail(收件人、主题、正文);}