Google Apps 脚本:已定义变量;意外地变得未定义

问题描述 投票:0回答:1

此脚本旨在根据 google 表单响应创建自定义 PDF 文件。几天前这有效,但突然停止执行。

有问题的变量/属性(“info”)似乎存在,但它仍然返回未定义的错误

作为参考,这是脚本:

function createPDF(info) {
        
  const pdfFolder = DriveApp.getFolderById("1GiY42M3rTq36M9pnUq7Y6RE1qQ8TFN8X");
  const tempFolder = DriveApp.getFolderById("1bkzpVTURICEvcJWemFGaOYTZSdeF_XNj");
  const templateDoc = DriveApp.getFileById("1UfFzcIdG1DCAYpk-NWSiA7bEoz1ZSJXeuV_9-Okw_vg");

  const newTempFile = templateDoc.makeCopy(tempFolder);

  const openDoc = DocumentApp.openById(newTempFile.getId());
  const body  = openDoc.getBody();
  body.replaceText("{Date of Request}",info['Date of Request'][0]);
  body.replaceText("{Requestor}",info['Requestor'][0]);
  body.replaceTest("{Line}",info['Line'][0]);
  body.replaceText("{Cost Centre}", info['Cost Centre (if known)'][0]);
  body.replaceText("{Project Name}", info['Project Name'][0]);
  body.replaceText("{Project Code}", info['Project Code'][0]);
  body.replaceText("{PN}", info['Part Number or Serial Number'][0]);
  body.replaceText("{Reason for Requirement}", info['Reason for Requirement'][0]);
  body.replaceText("{Quantity}", info['Quantity'][0]);
  body.replaceText("{Description}", info['Description'][0]);
  body.replaceText("{Have}", info['Have these products been deemed scrap by the Linelead/Area owner?'][0]);
  openDoc.saveAndClose();


  const blobPDF = newTempFile.getAs(MimeType.PDF);
  const pdfFile = pdfFolder.createFile(blobPDF).setName(info['Requestor'][0] + " " + info['Date of Request'][0]);
  tempFolder.removeFile(newTempFile);  
  return pdfFile;
}

这是变量/属性基于谷歌表单响应(谷歌表) Google 表格标题

这是错误: 类型错误:无法读取未定义的属性(读取“请求日期”) 创建PDF @ Code.gs:35

“信息”对象被检查为具有“请求日期”(如谷歌表中表单响应的标题所示)

google-apps-script
1个回答
0
投票

使用 getValues() 直接访问数据

代码失败的一个可能原因是它期望

info
参数被构造为一个对象,其值包装在数组中。如果
info
的输入与此预期结构不匹配,则尝试访问类似属性可能会返回
undefined
,从而在尝试从中读取
TypeError
时导致出现
[0]

为了避免未定义值的问题,我建议直接从数据行创建替换对象,而不将值包装在数组中。这种方法允许您直接引用值,例如使用

row[2]
表示“请求日期”,从而简化了代码。使用
getValues()
提供清晰的 2D 数组,使您的代码更加可靠并减少出错的机会。

注意:

removeFile()
已被弃用。

更新代码:

function createPDF() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses 1');
  const data = sheet.getDataRange().getValues();

  const pdfFolder = DriveApp.getFolderById("1GiY42M3rTq36M9pnUq7Y6RE1qQ8TFN8X");
  const tempFolder = DriveApp.getFolderById("1bkzpVTURICEvcJWemFGaOYTZSdeF_XNj");
  const templateDoc = DriveApp.getFileById("1UfFzcIdG1DCAYpk-NWSiA7bEoz1ZSJXeuV_9-Okw_vg");

  for (let i = 1; i < data.length; i++) {
    const row = data[i];

    const replacements = {
      "{Date of Request}": row[2] || "N/A",
      "{Requestor}": row[3] || "N/A",
      "{Line}": row[4] || "N/A",
      "{Cost Centre}": row[5] || "N/A",
      "{Project Name}": row[6] || "N/A",
      "{Project Code}": row[7] || "N/A",
      "{PN}": row[8] || "N/A",
      "{Reason for Requirement}": row[9] || "N/A",
      "{Quantity}": row[10] || "N/A"
    };

    const newTempFile = templateDoc.makeCopy(tempFolder);
    const openDoc = DocumentApp.openById(newTempFile.getId());
    const body = openDoc.getBody();

    for (const [key, value] of Object.entries(replacements)) {
      body.replaceText(key, value);
    }

    openDoc.saveAndClose();

    const blobPDF = newTempFile.getAs(MimeType.PDF);
    pdfFolder.createFile(blobPDF).setName(replacements['{Requestor}'] + " " + replacements['{Date of Request}']);
    //tempFolder.removeFile(newTempFile);
  }
}

参考文献:

  1. getValues()
  2. 删除文件()
© www.soinside.com 2019 - 2024. All rights reserved.