创建批量PDF脚本报错:ReferenceError: row未定义
Google Apps Script批量生成PDF报错:ReferenceError: row is not defined
问题详情
运行以下脚本时触发ReferenceError: row is not defined错误,脚本功能是为Google表格「ADMISSIBILITÉ SÉLECTION」中勾选框为TRUE的行,结合指定Google文档模板生成对应PDF。
原代码:
function CreateBulkPDFs() { const DocFile = DriveApp.getFileById("AAAAAAAAAAAAAAA"); const DossTEMP = DriveApp.getFolderById("BBBBBBBBBBBBBBBBB"); const EmplacementPDF = DriveApp.getFolderById("CCCCCCCCCCCCCCCCCCCCCCC"); const CurrentSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ADMISSIBILITÉ SÉLECTION"); //const Data = CurrentSheet.getRangeList(['A1:D4', 'F1:H4']); const DATE = CurrentSheet.getRange("E5").getValue(); const FONCTION = CurrentSheet.getRange("C3").getValue(); const UNITE = CurrentSheet.getRange("N4").getValue(); const ANCIENNETE = CurrentSheet.getRange("N5").getValue(); var NomMatr = CurrentSheet.getRange("A8:N" + CurrentSheet.getLastRow()).getValues(); NomMatr.forEach(([check], i) => { if (check === true) { CreatePDF(DATE,row[6],row[7],FONCTION,UNITE,ANCIENNETE,"Appel d'intérêt_Comblement titulaire 4.05_" + row[6],DocFile,DossTEMP,EmplacementPDF); try { CurrentSheet.getRange("A" + (i + 8)).uncheck(); }catch(err) { } } }); } function CreatePDF(DATE,NOM,MATRICULE,FONCTION,UNITE,ANCIENNETE,PDFName,DocFile,DossTEMP,EmplacementPDF) { const tempFile = DocFile.makeCopy(DossTEMP); const tempDocFile = DocumentApp.openById(tempFile.getId()); const Body = tempDocFile.getBody(); Body.replaceText("{DATE}", DATE); Body.replaceText("{NOM}", NOM); Body.replaceText("{MATRICULE}", MATRICULE); Body.replaceText("{FONCTION}", FONCTION); Body.replaceText("{UNITE}", UNITE); Body.replaceText("{ANCIENNETE}", ANCIENNETE); tempDocFile.saveAndClose(); const PdfContentBlob = tempFile.getAs(MimeType.PDF); EmplacementPDF.createFile(PdfContentBlob).setName(PDFName);//(NOM + "_" + MATRICULE) //FICHIERSTEMP.removeFile(tempFile); }
相关截图:

报错原因
在NomMatr.forEach(([check], i) => {...})的回调函数中,直接使用了未定义的row变量。当前回调仅解构了数组第一个元素(勾选框列的值)赋值给check,没有获取当前行的完整数据并赋值给row,导致调用CreatePDF时找不到该变量。
修正后的代码
将forEach的回调参数改为接收完整行数据row,同时保留索引i,即可正常调用行内数据:
function CreateBulkPDFs() { const DocFile = DriveApp.getFileById("AAAAAAAAAAAAAAA"); const DossTEMP = DriveApp.getFolderById("BBBBBBBBBBBBBBBBB"); const EmplacementPDF = DriveApp.getFolderById("CCCCCCCCCCCCCCCCCCCCCCC"); const CurrentSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ADMISSIBILITÉ SÉLECTION"); const DATE = CurrentSheet.getRange("E5").getValue(); const FONCTION = CurrentSheet.getRange("C3").getValue(); const UNITE = CurrentSheet.getRange("N4").getValue(); const ANCIENNETE = CurrentSheet.getRange("N5").getValue(); var NomMatr = CurrentSheet.getRange("A8:N" + CurrentSheet.getLastRow()).getValues(); // 修改forEach参数,接收完整行数据row NomMatr.forEach((row, i) => { // row[0]对应A列的勾选框 if (row[0] === true) { CreatePDF(DATE, row[6], row[7], FONCTION, UNITE, ANCIENNETE, "Appel d'intérêt_Comblement titulaire 4.05_" + row[6], DocFile, DossTEMP, EmplacementPDF); try { CurrentSheet.getRange("A" + (i + 8)).uncheck(); } catch(err) { // 可选:添加错误日志便于排查 console.log(err); } } }); } function CreatePDF(DATE,NOM,MATRICULE,FONCTION,UNITE,ANCIENNETE,PDFName,DocFile,DossTEMP,EmplacementPDF) { const tempFile = DocFile.makeCopy(DossTEMP); const tempDocFile = DocumentApp.openById(tempFile.getId()); const Body = tempDocFile.getBody(); Body.replaceText("{DATE}", DATE); Body.replaceText("{NOM}", NOM); Body.replaceText("{MATRICULE}", MATRICULE); Body.replaceText("{FONCTION}", FONCTION); Body.replaceText("{UNITE}", UNITE); Body.replaceText("{ANCIENNETE}", ANCIENNETE); tempDocFile.saveAndClose(); const PdfContentBlob = tempFile.getAs(MimeType.PDF); EmplacementPDF.createFile(PdfContentBlob).setName(PDFName); // 可选:删除临时文档 // DossTEMP.removeFile(tempFile); }
内容的提问来源于stack exchange,提问作者Mous
相关产品推荐
相关产品推荐

