我创建了一个谷歌表单,并使用字段中的值创建一个自动生成的约会信。在表单提交时触发事件,并将其命名值传递给替换文档中某些占位符的函数。这是该功能。
function createEvent_ (namedValues) {
var options = {
cand_name : namedValues["Candidate Name"],
cand_email : namedValues["Candidate's Email"],
mgr_name : namedValues["Manager's Name"],
mgr_email : namedValues["Manager's Email"],
mgr_desig : namedValues["Manager's Designation"],
rep_off : namedValues["Reporting Officer"],
ctc : namedValues["Gross Monthly CTC"],
prob : namedValues["Probation Period"],
pos_off : namedValues["Position Offered"],
doj : namedValues["Date of Joining"].toString(),
date : namedValues["Date"],
};
var email_address = "ravi.prakash@iglulabs.com";
var docTemplate = "1zgJadsQCJKcSmOQkNN4_Er64w210NOwLIM2-f3jwa94";
var docName = "Auto Generated Offer Letter";
//Make a copy of template to work on
var copyId = DocsList.getFileById(docTemplate).makeCopy(docName +' for '+ options.cand_name).getId();
//Open the Cloned Template
var copyDoc = DocumentApp.openById(copyId);
var copyBody = copyDoc.getActiveSection();
//Replace Dummy values in template with form values
copyBody.replaceText('CANDIDATE_NAME', options.cand_name);
copyBody.replaceText('MANAGER_NAME', options.mgr_name);
copyBody.replaceText('MANAGER_DESIGNATION', options.mgr_desig);
copyBody.replaceText('REPORTING_OFFICER', options.rep_off);
copyBody.replaceText('CTC_MONTHLY', options.ctc);
copyBody.replaceText('PROBATION_PERIOD', options.prob);
copyBody.replaceText('TODAYS_DATE', options.date);
copyBody.replaceText('MANAGER_EMAIL', options.mgr_email);
copyBody.replaceText('POSITION_OFFERED', options.pos_off);
copyDoc.saveAndClose(options.cand_email);
//Create Calendar Event
var cal = CalendarApp.getCalendarById('iglulabs.com_dlp3rl3fnhcsvothirocdgspck@group.calendar.google.com');
var event = cal.createEvent(options.cand_name + ' Decathlon Review', new Date('October 29, 2014 01:55:00 PM'), new Date('October 29, 2014 02:55:00 PM'), {guests: options.cand_email, sendInvites: true , description : "You can fill out your responses at : " + "https://docs.google.com/a/iglulabs.com/forms/d/1Ysbl2C8VbWFguTRIjDaCjZDh5HlTDwFGh0eGEEqT57I/viewform"});
Logger.log('Event ID: ' + event.getId());
var pdf = DocsList.getFileById(copyId).getAs("application/pdf"); //Get the saved template as pdf to mail
var link = 'https://drive.google.com/folderview?id=0B8iBopZLR9-sbXJJNkN3MkNLbnM&usp=sharing';
var subject = "Mail For My Offer Letter";
var body = "Hello, PFA attached the offer letter";
MailApp.sendEmail(options.mgr_email, subject, body, {htmlBody: body, attachments: [pdf], cc:email_address});
DocsList.getFileById(copyId).setTrashed(true); //Delete Temp File
}
包括触发器在内的一切都运行良好。如果我注释掉saveAndClose,它会发送自动生成的邮件,但不会替换占位符。直到前一段时间它才完全正常工作但突然间它已经开始崩溃了。我不记得我做的任何改变。其次,(我知道我应该把它放在一个单独的帖子中),昨天它开始抛出找不到函数makeCopy()。我对如何调试它感到很困惑。 Google Apps脚本仍处于实验状态吗?
答案 0 :(得分:0)
疯狂猜测...是包含候选人名称"Candidate's Name"
的列的标题?您在代码中已经知道这一点,而且您看到的错误都与cand_name
有关:
cand_name : namedValues["Candidate Name"],
如果未从表单处理代码传递预期的命名值,则options.cand_name
将为undefined
。你不能信任它。
根据the documentation,Document.saveAndClose()
没有参数。然而,由于某种原因,您正在传递options.cand_email
。您收到的错误消息可能会抱怨它无法找到saveAndClose(string)
或类似内容。如果options.cand_name
为空,那也可能是问题。
我不记得我所做的任何改变。
查看"文件>请参阅修订历史记录",以确定。
找不到... makeCopy()
在中找不到?你已经在这一行中获得了这种方法(为了清晰起见重新格式化):
var copyId = DocsList.getFileById(docTemplate)
.makeCopy(docName +' for '+ options.cand_name)
.getId();
如果DocsList.getFileById(docTemplate)
找不到预期的文件,则会返回null
。 Null对象没有makeCopy()
方法,这是一种可能会收到错误的方法。
假设找到文件,第二种方法是将意外参数传递给makeCopy()
。再一次,有options.cand_name
,如果它为空,则docName +' for '+ options.cand_name
将为undefined
,并且会失败。
将默认处理或错误检查添加到此代码中:
var options = {
cand_name : namedValues["Candidate Name"],
cand_email : namedValues["Candidate's Email"],
mgr_name : namedValues["Manager's Name"],
mgr_email : namedValues["Manager's Email"],
mgr_desig : namedValues["Manager's Designation"],
rep_off : namedValues["Reporting Officer"],
ctc : namedValues["Gross Monthly CTC"],
prob : namedValues["Probation Period"],
pos_off : namedValues["Position Offered"],
doj : namedValues["Date of Joining"].toString(),
date : namedValues["Date"],
};