Google Apps脚本:找不到方法saveAndClose

时间:2014-10-28 07:28:39

标签: google-apps-script

我创建了一个谷歌表单,并使用字段中的值创建一个自动生成的约会信。在表单提交时触发事件,并将其命名值传递给替换文档中某些占位符的函数。这是该功能。

 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脚本仍处于实验状态吗?

1 个答案:

答案 0 :(得分:0)

疯狂猜测...是包含候选人名称"Candidate's Name"的列的标题?您在代码中已经知道这一点,而且您看到的错误都与cand_name有关:

 cand_name : namedValues["Candidate Name"],

如果未从表单处理代码传递预期的命名值,则options.cand_name将为undefined。你不能信任它。


根据the documentationDocument.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"],
};