Pdf google应用程序脚本中未定义的合并字段
我有一个谷歌应用程序脚本,用于基于客户在线填写的谷歌表单的谷歌电子表格。该脚本由OnFormSubmit触发,并基于Google文档模板生成pdf,然后使用MailApp.sendEmail通过电子邮件将pdf发送给我 直到最近,这个脚本一直运行良好。脚本成功运行,但pdf输出不正确。看起来脚本中的空白字段现在被忽略了,因此我的pdf输出显示了下一个非空白字段的值。啊 有人知道这里发生了什么吗 下面是我的脚本示例:Pdf google应用程序脚本中未定义的合并字段,pdf,google-apps-script,google-spreadsheet-api,mailmerge,Pdf,Google Apps Script,Google Spreadsheet Api,Mailmerge,我有一个谷歌应用程序脚本,用于基于客户在线填写的谷歌表单的谷歌电子表格。该脚本由OnFormSubmit触发,并基于Google文档模板生成pdf,然后使用MailApp.sendEmail通过电子邮件将pdf发送给我 直到最近,这个脚本一直运行良好。脚本成功运行,但pdf输出不正确。看起来脚本中的空白字段现在被忽略了,因此我的pdf输出显示了下一个非空白字段的值。啊 有人知道这里发生了什么吗 下面是我的脚本示例: var docTemplate = "1FZL4rVe0LLpvMtIsq_3-
var docTemplate = "1FZL4rVe0LLpvMtIsq_3-pwv5POllIsyYThjfemkbkfg";
var docName = "Travel Details";
function onFormSubmit(e) {
var last = e.values[1];
var first = e.values[2];
var order = e.values[3];
var date = e.values[4];
var gender = e.values[5];
var email = "example@gmail.com";
var copyId = DocsList.getFileById(docTemplate)
.makeCopy(docName+' for '+last + ', ' + first)
.getId();
var copyDoc = DocumentApp.openById(copyId);
var copyBody = copyDoc.getActiveSection();
copyBody.replaceText('keyLast', last);
copyBody.replaceText('keyFirst', first);
copyBody.replaceText('keyOrder', order);
copyBody.replaceText('keyDate', date);
copyBody.replaceText('keyGender', gender);
copyDoc.saveAndClose();
var pdf = DocsList.getFileById(copyId).getAs("application/pdf");
MailApp.sendEmail(email, subject, "", {htmlBody: office_message, attachments: pdf,
noReply:true});
DocsList.getFileById(copyId).setTrashed(true);
}
问题示例:如果客户端将表单上的日期字段留空,则生成的pdf中的性别值将放在日期值应在的位置,并且pdf中的性别值显示为未定义
有什么想法吗?您应该验证所有变量的值
if (last === undefined) {
last = 'No Data!'; //re-assign a different value
};
因此,如果变量以某种方式被设置为“未定义”,则最后更改变量的值。这样一来,希望pdf仍能显示该字段
如果最近出现了一些bug,您应该将其报告为bug。如果一切都很好,现在又坏了,谷歌可能已经改变了一些东西
您的代码可能有问题。我不知道。你有没有在查看菜单和执行记录下查看是否有错误?您还应该使用Logger.log语句:Logger.log'last的值为:'+last;将输出打印到日志。然后你可以检查实际情况。我不是一个优秀的编码员,但我一直使用这个脚本发送pdf,如果某个字段丢失,我从未收到过未定义的pdf。通常,如果缺少某些内容,则用空白点替换keygender,并且没有错误。在电子表格中,通常这意味着列已更改。它过去是timestamp0、last1、first2、order3、date4、gender5,现在它们的顺序不同了。试试下面的代码,它可以工作
//commons errors -
//Triggers are not set
//spaces after Form questions
//e.values dont work when fields are not mandatory and left blank
//e.namedValues dont work for sending emails use e.values[#]
//place holder keys in template dont match
//spelling errors
//Note expect undefined error when de-bugging as values are not defined until form completed and submitted - run first with a small test form as per below
// Get Template
//from Google Docs and name it
var docTemplate = " "; // *** replace with new templae ID if new Template created***
var docName = "Test Script"; //replace with document name
// When Form Gets submitted
function onFormSubmit(e) {
//Get information from the form and set as variables
//var variablename = "static entry or form value"
//Note: var Variablename = e.namedValues["X"]; is taking the value from the spreadsheet by column name so update if spreadsheet or form questions change
//Additions to the form will be added to the end of the spreadsheet regardless of their position in the form
var Timestamp = e.namedValues["Timestamp"];
var full_name = e.namedValues["Name"];
var position = e.namedValues["Position"]
var contact_email = e.namedValues["Contact Email"];
var phone_number = e.namedValues["Telephone Number"];
// Get document template, copy it as a new doc with Name and email, and save the id
var copyId = DocsList.getFileById(docTemplate)
.makeCopy(full_name+' '+docName+' for ' +contact_email+' '+Timestamp)//Update or remove Variablename to create full doc Name
.getId();
// Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the documents body section
var copyBody = copyDoc.getActiveSection();
// Replace place holder keys <<namedValues>> in template
//copyBody.replaceText('<<X>>', Variablename); Variables from above
//***Update if template is changed***
copyBody.replaceText('<<Timestamp>>', Timestamp);
copyBody.replaceText('<<Name>>', full_name);
copyBody.replaceText('<<Position>>', position);
copyBody.replaceText('<<Contact Email>>', contact_email);
copyBody.replaceText('<<Telephone Number>>', phone_number);
// Save and close the temporary document
copyDoc.saveAndClose();
// Convert temporary document to PDF by using the getAs blob conversion
var pdf = DocsList.getFileById(copyId).getAs("application/pdf");
{
// Add the data fields to the message
var s = SpreadsheetApp.getActiveSheet();
var columns = s.getRange(1,1,1,s.getLastColumn()).getValues()[0];
var message = " ";
// Only include form fields that are not blank
for ( var keys in columns ) {
var key = columns[keys];
if ( e.namedValues[key] && (e.namedValues[key] != "") ) {
message += key+ ' : '+ e.namedValues[key] + "<br>";
}
}}
// Attach PDF and send the email
//***Change the "To" email address when to form goes live***
var to = "youremail@gmail.com";
var senders_name = e.values[1]
var contact_email = e.values[3]
var subject = "Test";
var htmlbody = "text goes here"+
"<br> <br>"+message+
"<br> <br>Submitted By:"+
"<br> <br>"+full_name+
"<br>"+position+
"<br>"+contact_email+
"<br>"+phone_number+
"<br> <br>Generated by Hansmoleman for Compu-Global-Hyper-Mega-Net";
MailApp.sendEmail({
name: senders_name,
to: to,
cc: contact_email,
replyTo: contact_email,
subject: subject,
htmlBody: htmlbody,
attachments: pdf,
});
}