Form 的 App Script 没有准确替换模板中的字段

Form's App Script does not replace fields in template accurately

我有一个简单的脚本可以在提交表单时生成文档和 PDF。它在简单模板上运行良好(例如只有 1 个句子,名字、姓氏和公司名称)。

但是,当我使用更长的模板、有很多字段和格式时,代码运行但随机替换文本。

我尝试将表单字段按升序硬编码为文档模板。但是它仍然随机替换文本

谁能指出我做错了什么?

我的代码:

function myFunction(e) {
  var response = e.response;
  var timestamp = response.getTimestamp();
  var [companyName, country, totalEmployees,totalPctWomenEmployees,numberNationality,name1,position1,emailAdd1,linkedin1,funFact1,name2,position2,emailAdd2,linkedin2,gameStage,gameStory] = response.getItemResponses().map(function(f) {return f.getResponse()});

  var file = DriveApp.getFileById('XXXXX'); 

  var folder = DriveApp.getFolderById('XXXXX')
  var copy = file.makeCopy(companyName + '_one pager', folder);

  var doc = DocumentApp.openById(copy.getId());


  var body = doc.getBody(); 


  body.replaceText('{{Company Name}}', companyName);
  body.replaceText('{{Name}}', name1);
  body.replaceText('{{Position}}', position1);
  body.replaceText('{{Email}}', emailAdd1);
  body.replaceText('{{Linkedin}}', linkedin1);
  body.replaceText('{{Fun Fact}}', funFact1);
  body.replaceText('{{Game Stage}}', gameStage);
  body.replaceText('{{Game Story}}', gameStory);


  doc.saveAndClose(); 


  folder.createFile(doc.getAs("application/pdf"));}

我的模板 -

结果 -

问题 - 这是否意味着第 3 行中的数组声明应该与我的表单响应列的顺序相匹配?

您可以使用正则表达式:

body.replace(/{{Company Name}}/g, companyName); // /g replace globaly all value like  {{Company Name}}

经过这么多次尝试和错误,我终于找到了问题所在!

原因是因为我没有按照表单响应列的顺序随机声明数组变量。

问题出在部分 -

var [companyName, country, totalEmployees,totalPctWomenEmployees,numberNationality,name1,position1,emailAdd1,linkedin1,funFact1,name2,position2,emailAdd2,linkedin2,gameStage,gameStory] = response.getItemResponses().map(function(f) {return f.getResponse()});

它实际上是从电子表格中提取回复,应该按顺序更正。错误映射的值是导致文本替换失控的原因。我根据表格回复更正了订单,现在一切正常。

学习要点: 如果您交换了变量,response.getItemResponses().map(function(f) {return f.getResponse()} 的作用是按顺序逐列处理表单响应,并将内容映射到错误的变量。因此,当您稍后使用 body.replaceText('{{Game Stage}}', gameStage) 替换文本时,gameStage 中存储的内容可能是 name1。因此,替换的文本将是错误的。而且你会抓破头,不知道为什么会流血。

找到答案后我看到了@Tanaike 的评论,但完全正确!