Pdf google应用程序脚本中未定义的合并字段

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-

我有一个谷歌应用程序脚本,用于基于客户在线填写的谷歌表单的谷歌电子表格。该脚本由OnFormSubmit触发,并基于Google文档模板生成pdf,然后使用MailApp.sendEmail通过电子邮件将pdf发送给我

直到最近,这个脚本一直运行良好。脚本成功运行,但pdf输出不正确。看起来脚本中的空白字段现在被忽略了,因此我的pdf输出显示了下一个非空白字段的值。啊

有人知道这里发生了什么吗

下面是我的脚本示例:

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, 
 }); 

}