【问题标题】:How do you loop through an object and replace text你如何遍历一个对象并替换文本
【发布时间】:2025-12-09 02:20:09
【问题描述】:

我有一个脚本,它应该从 google 表单提交创建一个 pdf 文件,并将要更改的数据作为对象获取。但是,我正在使用 replaceText 操作对文档进行更改,但出现以下错误。

异常:无效参数:替换 在 Create_PDF(代码:37:8) 在 After_Submit(代码:13:19)

它应该更改生成的 doc 文件中的值,并且当我使用 namedValues 函数时它起作用了。但是,现在我使用的是 range,它似乎不起作用。

function After_Submit(e){
  var range = e.range;
  var row = range.getRow(); //get the row of newly added form data
  var sheet = range.getSheet(); //get the Sheet
  var headers = sheet.getRange(1, 1, 1, 129).getValues().flat(); //get the header names from A-O
  var data = sheet.getRange(row, 1, 1, headers.length).getValues(); //get the values of newly added form data + formulated values
  var values = {}; // create an object 
  for( var i = 0; i < headers.length; i++ ){
    values[headers[i]] = data[0][i]; //add elements to values object and use headers as key
  }

  Logger.log(values);
  const pdfFile = Create_PDF(values);
  sendEmail(e.namedValues['Email Address to Receive File '][0],pdfFile);
}

function sendEmail(email,pdfFile){
  
  GmailApp.sendEmail(email, "Subject", "Files Attached", {
    attachments: [pdfFile], 
    name: "From Email"

  });
 
}
function Create_PDF(values) {
  const PDF_folder = DriveApp.getFolderById("ID_1");
  const TEMP_FOLDER = DriveApp.getFolderById("ID_2");
  const PDF_Template = DriveApp.getFileById('ID_3');
  
  const newTempFile = PDF_Template.makeCopy(TEMP_FOLDER);
  const  OpenDoc = DocumentApp.openById(newTempFile.getId());
  const body = OpenDoc.getBody();
  
  console.log(body);

  body.replaceText("{{Timestamp}}", values['Timestamp'][0]);
  body.replaceText("{{Location}}", values['Location'][0]);
  body.replaceText("{{Item1}}", values['Item1'][0]);
  body.replaceText("{{Item2}}", values['Item2'][0]);
  body.replaceText("{{Itme3}}", values['Item3'][0]);
  body.replaceText("{{e1}}", values['e1'][0]);
  body.replaceText("{{e2}}", values['e2'][0]);
  body.replaceText("{{e3}}", values['e3'][0]);
  body.replaceText("{{e4}}", values['e4'][0]);
  body.replaceText("{{e5}}", values['e5'][0]);
  body.replaceText("{{e6}}", values['e6'][0]);
  body.replaceText("{{e7}}", values['e7'][0]);
  body.replaceText("{{e8}}", values['e8'][0]);
  body.replaceText("{{e9}}", values['e9'][0]);
  body.replaceText("{{e10}}", values['e10'][0]);
  body.replaceText("{{e11}}", values['e11'][0]);
  body.replaceText("{{e12}}", values['e12'][0]);
  body.replaceText("{{e13}}", values['e13'][0]);
  body.replaceText("{{e14}}", values['e14'][0]);
  body.replaceText("{{e15}}", values['e15'][0]);
  body.replaceText("{{e16}}", values['e16'][0]);
  body.replaceText("{{e17}}", values['e17'][0]);
  body.replaceText("{{e18}}", values['e18'][0]);
  body.replaceText("{{e19}}", values['e19'][0]);
  body.replaceText("{{e20}}", values['e20'][0]);
  body.replaceText("{{e21}}", values['e21'][0]);
  body.replaceText("{{e22}}", values['e22'][0]);
  body.replaceText("{{e23}}", values['e23'][0]);
  body.replaceText("{{e24}}", values['e24'][0]);
  body.replaceText("{{e25}}", values['e25'][0]);
  body.replaceText("{{e26}}", values['e26'][0]);
  body.replaceText("{{e27}}", values['e27'][0]);
  body.replaceText("{{e28}}", values['e28'][0]);
  body.replaceText("{{e29}}", values['e29'][0]);
  body.replaceText("{{e30}}", values['e30'][0]);
  body.replaceText("{{e31}}", values['e31'][0]);
  body.replaceText("{{e32}}", values['e32'][0]);
  body.replaceText("{{e33}}", values['e33'][0]);
  body.replaceText("{{e34}}", values['e34'][0]);
  body.replaceText("{{e35}}", values['e35'][0]);
  body.replaceText("{{e36}}", values['e36'][0]);
  body.replaceText("{{e37}}", values['e37'][0]);
  body.replaceText("{{e38}}", values['e38'][0]);
  body.replaceText("{{e39}}", values['e39'][0]);
  body.replaceText("{{H1}}", values['H1'][0]);
  body.replaceText("{{H2}}", values['H2'][0]);
  body.replaceText("{{H3}}", values['H3'][0]);
  body.replaceText("{{H4}}", values['H4'][0]);
  body.replaceText("{{H5}}", values['H5'][0]);
  body.replaceText("{{H6}}", values['H6'][0]);
  body.replaceText("{{H7}}", values['H7'][0]);
  body.replaceText("{{H8}}", values['H8'][0]);
  body.replaceText("{{H9}}", values['H9'][0]);
  body.replaceText("{{H10}}", values['H10'][0]);
  body.replaceText("{{H11}}", values['H11'][0]);
  body.replaceText("{{H12}}", values['H12'][0]);
  body.replaceText("{{H13}}", values['H13'][0]);
  body.replaceText("{{H14}}", values['H14'][0]);


  OpenDoc.saveAndClose();
  

  const BLOBPDF = newTempFile.getAs(MimeType.PDF);
  const pdfFile =  PDF_folder.createFile(BLOBPDF).setName("FLHA");
  console.log("The file has been created ");
  
  return pdfFile;

}

【问题讨论】:

  • 试试 e.values 或 e.namedValues
  • 我最初使用的是 nemedValues。但是,电子表格中还有其他单元格根据响应计算数据,并且 namedValues 仅从提交的响应中获取数据。我现在使用 range 来获取所有需要的数据,但是 replaceText 操作不再适用于修改文档。
  • 是的,我认为以这种方式弄乱链接表是一种不好的方法。我更喜欢让它们单独存储响应。

标签: javascript google-apps-script google-sheets google-forms


【解决方案1】:

您的问题是如何遍历对象并替换文本

这会从 Sheet0 创建一个对象:

工作表0:

one pattern
two this is the pattern
three pattern pattern
four nothing
five nothing

代码:

function replacepattern() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet0');
  const vs = sh.getRange(1,1,sh.getLastRow(), 2).getValues();
  //creating object from spreadsheet
  let obj = {pA:[]};
  vs.forEach(r =>{
    obj[r[0]]=r[1];
    obj.pA.push(r[0]);
  });
  Logger.log(JSON.stringify(obj));
  let oA = obj.pA.map(p => [obj[p].replace(/pattern/g,'replacement')]);//doing the replacement in an object
  sh.getRange(1,sh.getLastColumn() + 1,oA.length, oA[0].length).setValues(oA);//outputting the replaced string in the next column
  Logger.log(JSON.stringify(oA));
}

Sheet0 运行一次后:

one pattern replacement
two this is the pattern this is the replacement
three pattern pattern replacement replacement
four nothing nothing
five nothing nothing

【讨论】:

  • 这会创建大量日志文件,而我对代码还不够熟悉,无法理解它。我已经从 range 创建了对象。我只是不知道如何用数据更新文档。 replaceText 一直给我错误
  • Logger.log() 不创建文件。
  • 文件在 Create_PDF(values) 函数中创建。
  • 我的问题可能措辞错误。我不想替换对象的文本。我想使用该对象来更新文档中的数据。
【解决方案2】:

这和我的回答here有关。

错误码Exception: Invalid argument: replacement at Create_PDF(Code:37:8) at After_Submit(Code:13:19)是由values['Timestamp'][0]的空值引起的。如果您尝试打印 values['Timestamp'] 的数据类型,它将返回一个类型对象,因为该对象没有索引 0 的值,因此它将返回一个空值。

对于字符串类型的条目,如果您将[0] 添加到它,它将仅返回字符串的第一个元素。示例您有 "Test" 字符串,添加 [0] 将返回 "T"

要解决此问题,只需删除所有 body.replaceText(..., values['...'][0]) 条目中的 [0]

通过将代码中的 body.replaceText 条目替换为以下内容,循环遍历 values 对象:

for (const key in values) {
   body.replaceText("{{"+key+"}}", values[key]);
}

使用示例:

表单输入:

输出:

参考:

【讨论】: