将自定义Spreadsheets列传递给onFormSubmit触发器

时间:2014-11-13 12:03:36

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

我有一个带有两个数字字段的Google表单,因此在答案目标电子表格中我有三列:SUBMIT-DATE,NUM1,NUM2

我使用以下公式添加第四列TOT,而不是表单中的字段:

ARRAYFORMULA(B2:B+C2:C)

所以在第四列中,每行都有一个SUM

我将此脚本绑定到电子表格:

function onFormSubmit(e){
  var subject = "TRY GAS";
  var body = e.namedValues['NUM1']+ "+" +e.namedValues['NUM2']+ "=" +e.namedValues[TOT];
  MailApp.sendEmail("admin@example.com", subject, body);
}

我为onFormSubmit

设置了触发器

但我收到的电子邮件是:

34+43=

在TOTAL列下的电子表格中,显示77。

我认为问题是var e.namedValues不包含TOT,因为它不是表单字段

如何在表单提交上传递此值??

3 个答案:

答案 0 :(得分:0)

当您使用e.namedValues['NUM1']时,您将获得" namedValues" e对象的属性,实际上是来自表单的响应。

我'我对你得到的结果感到非常惊讶,因为这个对象中的属性也被称为" TOT" ...

通常它应该返回" undefined"明显。

然而,这不是你真正的问题,你想要的只是两个值的数字和,你可以这样得到它们:

var sum = Number(e.namedValues['NUM1'])+Number(e.namedValues['NUM2']);// Number is mandatory because object properties are strings in this context.

,您的电子邮件正文将成为

var body = e.namedValues['NUM1']+ "+" +e.namedValues['NUM2']+ "=" +sum;

答案 1 :(得分:0)

你的猜测是对的;由于您感兴趣的列超出了填充表单响应的列范围,因此它不会出现在事件对象中。但是,事件对象的range属性会告诉您收到提交的行,您可以选择相对于该行的其他单元格。

哪一栏包含" TOT"?如果该列位于我们上一个表单响应列的右侧,那么我们可以使用该列的响应项(e.values.length)到offset的数量。

function onFormSubmit(e){
  var subject = "TRY GAS";
  var total = e.range.offset(0, e.values.length, 1, 1).getValue();
  var body = e.namedValues['NUM1']+ "+" +e.namedValues['NUM2']+ "=" +total;
  MailApp.sendEmail("admin@example.com", subject, body);
}

警告:在此触发器功能运行时,可能尚未计算总数并将其存储回电子表格。您可能会发现需要将getValue()呼叫延迟几秒钟。即使这样,它也可能不可靠 - 在这种情况下,您会发现@Sergeinsas建议的函数计算方法会更有效。

答案 2 :(得分:0)

我刚刚找到@Mogsdad的相同解决方案,所以我写了这个:

function onFormSubmit(e){
  //THE SHEETS WHERE RESPONSE IS STORED
  var sheet = e.range.getSheet();

  //SHEET HEADERS
  var headers = sheet.getRange("1:1").getValues()[0];

  //THE DIFFERENCE BETWEEN SHEET WIDTH AND FORM COLUMNS
  var off = headers.length;

  //WAIT DATA
  Utilities.sleep(30000);

  //OFFSET FORM RANGE ON RIGHT BY off TO ADD ALL CUSTOM COLUMN
  var data = e.range.offset(0, 0, 1, off).getValues()[0];

  //CREATE OBJECT WITH NAMED VALUES
  var namedValues = {};
  for(var col in headers)
      namedValues[headers[col]] = data[col]; 

  //LOG
  var subject = "TRY GAS";
  var body = namedValues["NUM1"] + ' + ' + namedValues["NUM2"] + ' = ' +    namedValues["TOT"];
  MailApp.sendEmail("admin@example.com", subject, body);
}

非常感谢,我需要使用replaceText()

从模板创建PDF