Google apps script 提交后从Google表单生成PDF时出现问题

Google apps script 提交后从Google表单生成PDF时出现问题,google-apps-script,google-sheets,triggers,gmail,google-forms,Google Apps Script,Google Sheets,Triggers,Gmail,Google Forms,我正在创建一个Google脚本,它根据Google表单的字段填充Google文档模板,并通过电子邮件将生成的PDF发送给用户 我遵循的所有步骤在这里都有详细说明: 脚本(从文章中获得)为: 提交函数(e){ 常数rg=e.range; const sh=rg.getSheet(); //获取所有表单提交的数据 //注意:此数据取决于标题。如果标题已更改,也会更新这些标题。 const cName=e.namedvalue['Client Name'][0]; const cEmail=e.nam

我正在创建一个Google脚本,它根据Google表单的字段填充Google文档模板,并通过电子邮件将生成的PDF发送给用户

我遵循的所有步骤在这里都有详细说明:

脚本(从文章中获得)为:

提交函数(e){
常数rg=e.range;
const sh=rg.getSheet();
//获取所有表单提交的数据
//注意:此数据取决于标题。如果标题已更改,也会更新这些标题。
const cName=e.namedvalue['Client Name'][0];
const cEmail=e.namedvalue['Client Email'][0];
const cAddress=e.namedvalue['Client Address'][0];
const cMobile=e.namedvalue['Client Mobile'][0];
const sendCopy=e.namedvalue['Send client a copy?'][0];
const paymentType=e.namedValues[“您商定的付款计划是什么?”][0];
const fixedCost=e.namedValues[“您同意的项目成本是多少?”][0];
const hourlyRate=e.namedvalue[“小时费率”][0];
常数工时=e.namedvalue[“总工时”][0];
const services=e.namedValues[“选择服务”][0];
//间接数据
常数税=18.5
var小计=0;
var-taxAmt=0;
var payableAmt=0;
//如果用户选择了小时付款模式
//注意:注意响应与实际表单上的元素匹配
交换机(paymentType){
案例“小时费率”:
小计=小时数*工时;
税额=小计*(税/100);
应付金额=+小计++税款金额;
打破
“固定成本”案例:
小计=固定成本;
税金额=固定成本*(税/100)
可支付金额=+固定成本++税款金额;
打破
}
const invoiceID='IN'+Math.random().toString().substr(2,9);
var formattedDate=Utilities.formattdate(新日期(),“IST”,“dd-MMM-yyyy”);
//在电子表格的列中设置相应的数据以备记录
//注意:这些变量取决于工作表的列,因此如果更改,请更新。
const row=rg.getRow();
常数payableAmtCol=2;//B
const invoiceIDCol=3;//C
sh.getRange(行,payableAmtCol).setValue(payableAmt);
sh.getRange(行,发票ID列).setValue(发票ID);
//从该文件生成新发票
//文件夹和文件ID
const invoiceFolderID='';
const invoiceFolder=DriveApp.getFolderById(invoiceFolderID);
const templateFileID='';
const newFilename='Invoice_u'+invoiceID;
//制作模板文件的副本
const newInvoiceFileID=DriveApp.getFileById(templateFileID).makeCopy(newFilename,invoiceFolder).getId();;
//将发票主体放入变量中
var document=DocumentApp.openById(newInvoiceFileID);
var body=document.getBody();
//替换发票正文中的所有{}文本
replaceText(“{{Invoice num}}”,invoiceID);
replaceText(“{Date}}”,formattedDate);
replaceText(“{{Client Name}}”,cName);
replaceText(“{{Client Address}}”,cadAddress);
replaceText({{Client Mobile}}',cMobile);
replaceText(“{{Client Email}}”,cEmail);
body.replaceText('{Services}}',Services.split(',').join('\n'));
正文.replaceText(“{{Subtotal}}”,小计);
主体.replaceText('{Tax Value}}',taxAmt);
正文.replaceText(“{{Total}}”,PayableMat);
//对于小时费率支付类型,让我们添加一条额外的消息,给出费率和工时。
if(paymentType.包括(‘小时费率’){
//发票上应该是这样的
//小时费率
//每小时1200卢比
//完成50工时
const message=paymentType+'\nR.+hourlyRate+'/hour\n完成'+manHours+'man hours';
replaceText(“{{Payment Type}}”,消息);
}否则{
replaceText(“{{Payment Type}}”,paymentType);
}
document.saveAndClose();
//用文件发送电子邮件
var attachment=DriveApp.getFileById(newInvoiceFileID);
GmailApp.sendmail(cEmail,”,
'', 
{附件:[附件.getAs(MimeType.PDF)]};
}
代码运行良好。现在我需要用户在按下谷歌表单上的“发送表单”后编辑其回复。因此我决定选中“提交后回复者可以编辑”。然后我需要通过
GmailApp
再次发送该文档,其中包含已编辑的字段。因此,我创建了一个新触发器:
Edit
(来自电子表格)。另一个触发器是
表单提交

但是我有一个问题当用户编辑字段并再次按“发送表单”时,触发器“编辑”被激活,出现以下错误:
发送电子邮件失败:没有收件人

如果我转到电子表格响应,我可以看到已编辑的行(因为单元格中有一条注释“响应者已更新此值”),并且列邮件未编辑,但仍会引发异常

如果从未编辑过
cEmail
,我们如何解决此问题

搜寻 我可以找到一些有趣的答案:


它们似乎描述了当触发“编辑”被激活时,可以生成一个空行。但是,我不明白为什么会发生这种情况,也不知道如何解决,因为新用户提交答案后,电子表格响应会自动编辑。

编辑表单响应时,表单上提交事件对象属性
名称值
仅包括已编辑问题的值

若要修复发送电子邮件失败的错误:无收件人,请替换

 GmailApp.sendEmail(cEmail, '<subject>, 
                     '<body>', 
                     {attachments: [attachment.getAs(MimeType.PDF)]});
GmailApp.sendmail(cEmail,”,
'', 
{附件:[附件.getAs(MimeType.PDF)]};

常量recipientIdx=1;//这是包含收件人电子邮件地址的列的基于0的索引 const recipient=cEmail?杰梅尔:e.range.get
 GmailApp.sendEmail(cEmail, '<subject>, 
                     '<body>', 
                     {attachments: [attachment.getAs(MimeType.PDF)]});
const recipientIdx = 1; // This is the 0 based index of the column having the recipient email address
const recipient = cEmail ? cEmail : e.range.getValues().flat()[recipientIdx]
 GmailApp.sendEmail(recipient , '<subject>', 
                     '<body>', 
                     {attachments: [attachment.getAs(MimeType.PDF)]});