onFormSubmit触发器无法在谷歌脚本中工作

时间:2015-07-10 15:53:27

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

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

用户填写表格,表格回复记录在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);
}

1 个答案:

答案 0 :(得分:3)

看起来不是使用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);

...当然,使用电子表格的真实身份证。