【问题标题】:onFormSubmit trigger not working in google scriptonFormSubmit 触发器在谷歌脚本中不起作用
【发布时间】:2015-07-10 15:53:27
【问题描述】:

我想知道是否有人可以帮助我。我已经编写了这段代码,它应该执行以下工作流程:

用户填写表单,表单响应记录在 Excel 表中并进行各种计算,最终值附加到模板 pdf 中,并且此 pdf 通过电子邮件发送给用户。

脚本会执行所有这些操作,但只有在我手动单击“运行”时才会执行,而我希望它在提交表单时执行,但我不明白为什么它不执行。

我会添加我的触发器的屏幕截图,但我不能,因为我还没有 10 声望;但我的触发器设置如下:

运行:onFormSubmit 事件:来自电子表格,在表单提交时

我将在下面粘贴我的代码,有人知道为什么它可能不起作用吗?任何帮助将不胜感激。

//Set out global variables
var docTemplate = ("1Ff3SfcXQyGeCe8-Y24l4EUMU7P9TsgREsAYO9W6RE2o");
var docName=("Calculations");

function onFormSubmit(e){

//Variables
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName("Sheet3"));
var totalOutstandingPrincipalDebt = SpreadsheetApp.getActiveSheet().getRange("G25").getValue();
var totalOutstandingInterest = SpreadsheetApp.getActiveSheet().getRange("H25").getValue();
var totalOutstandingCompensation = SpreadsheetApp.getActiveSheet().getRange("I25").getValue();
var dailyInterestRate = SpreadsheetApp.getActiveSheet().getRange("J25").getValue();
var grandTotal = SpreadsheetApp.getActiveSheet().getRange("K25").getValue();
var userEmail = SpreadsheetApp.getActiveSheet().getRange("H24").getValue();


//Template Info

var copyId=DriveApp.getFileById(docTemplate).makeCopy(docName+' for '+userEmail).getId();
var copyDoc = DocumentApp.openById(copyId);
var copyBody = copyDoc.getActiveSection();

//Putting the data into the file
copyBody.insertParagraph(1,'Total Outstanding Principal Debt: £' + totalOutstandingPrincipalDebt);
copyBody.insertParagraph(2,'Total Outstanding Interest: £'+ totalOutstandingInterest );
copyBody.insertParagraph(3,'Total Outstanding Compensation: £'+ totalOutstandingCompensation);
copyBody.insertParagraph(4,'Grand Total: £' + grandTotal);
copyBody.insertParagraph(5,'Daily Interest Rate: £'+ dailyInterestRate);
copyDoc.saveAndClose();

//email pdf document as attachment 
var pdf = DriveApp.getFileById(copyId).getAs("application/pdf");
var subject = "Calculations";
var body = "Thank you very much for using our online calculator. Please find your results attached.";
MailApp.sendEmail(userEmail, subject, body, {htmlBody: body, attachments: pdf});
//Deletes temporary Document
DriveApp.getFileById(copyId).setTrashed(true);
}

【问题讨论】:

  • 您需要经历一个消除过程。创建另一个函数,它只向日志输出一些内容。 Logger.log('it ran!); 为该新功能创建一个新触发器,然后提交表单,并查看 VIEW 菜单下的 LOGS。如果可行,请开始将代码行转移到新函数中,并查看它是否在某个时候停止工作。如果新的触发器根本不起作用,那么它与代码无关。

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


【解决方案1】:

看起来您不是使用values attribute of the form submit event,而是尝试直接查看将值写入其中的电子表格选项卡。可以这样想:您可以将此脚本附加到表单而不是电子表格,并且它仍然可以工作。在表单提交发生时,事件对象e 拥有您需要的一切。

这是一个问题,因为您有固定的单元格地址,但表单会继续写入更多行。这意味着您不会在新行累积时看到它们。

问题是您正在使用 getActiveSpreadsheet() 查看该选项卡。当用户提交表单响应时,没有“活动电子表格”。 “活跃”的东西是形式。因此,为了获取已提交的数据,您需要查看 e.values - 这将包含您当前尝试在第 9-14 行中获取的数据行。

顺便说一句,它在手动运行时起作用的原因是因为“活动电子表格”意味着什么。您一走开,该电子表格就不再处于活动状态。

编辑:

Zehrazjp20 指出他们正在使用电子表格进行计算,而不仅仅是从表单提交事件中读取原始值。在这种情况下,最好的方法是替换:

var ss = SpreadsheetApp.getActiveSpreadsheet();`

var ssID = 'abcdefghijklmnop';
var ss = SpreadsheetApp.openById(ssID);

...当然是使用电子表格的真实 ID。

【讨论】:

  • 硬连线的单元格地址有一个原因:表单响应经过大量非常复杂的计算,结果单元格就是那些硬连线的单元格。非常感谢您的回答,不过我会在周一回到办公室时再试一次!我没有想到当您不手动按“运行”时,电子表格不再处于活动状态。非常感谢 jjjjoe :)
  • 哦,这很难。在这种情况下,最有可能解决此问题的方法是使用其特定 ID 获取对电子表格的引用。
  • 实际上,最好从e 回溯,使用e.range.getSheet()(用于接收表单提交的工作表)和e.range.getSheet().getParent()(用于电子表格)。使用特定 ID 会限制代码的可移植性。哦,请确保您没有重复相同的服务调用,因为它们是 ssslllooowww。
  • @Mogsdad 非常好。我想我忘记了这种可能性,因为e 不包含我们在这种情况下实际需要的数据。
  • jjjoe 我已经实现了你的所有建议,现在我收到了触发失败通知电子邮件,上面写着“无效电子邮件”:/ 我想 getValue() 方法返回一个对象,所以也许我需要转换我的userEmail 变量转换成字符串?
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2019-11-09
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多