Google Apps Script:数据转预填文档存PDF至Drive问题求助
问题:Google Apps Script批量填充数据后生成PDF并保存至Drive失败
我正在编写Google Apps Script,实现将Google Sheets中errorsList工作表的数据批量填充至conductError、docError、medError三个目标工作表,目前除最后将目标工作表保存为PDF并存储到Google Drive的代码段外,其余功能均正常。我尝试过搜索方案及使用ChatGPT,但所得方案超出理解能力,无法直接复用。原本倾向实现打印功能,但目前看来无法实现,附上移除ID后的现有代码寻求帮助:
function copyDataAndSaveAsPDF() { // Get the source and destination sheets var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('errorsList'); var conductSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('conductError'); var docSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('docError'); var medSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('medError'); // Get the data range from the source sheet var dataRange = sourceSheet.getDataRange(); // Get the values in the data range var data = dataRange.getValues(); // Loop through each row in the data for (var i = 1; i < data.length; i++) { // Start from 1 to skip header row // Extract data from the source sheet var column1Data = data[i][0]; // Replace with the appropriate column index var column2Data = data[i][1]; // Replace with the appropriate column index // ... Continue extracting data for other columns as needed var column3Data = data[i][2]; var column4Data = data[i][3]; var column5Data = data[i][4]; // Determine the destination sheet based on the 'type' value var destSheet; var type = column3Data; if (type === 'Conduct') { destSheet = conductSheet; } else if (type === 'Documentation') { destSheet = docSheet; } else if (type === 'Medication') { destSheet = medSheet; } if (destSheet === conductSheet) { destSheet.getRange(3,2).setValue(column1Data); destSheet.getRange(3,5).setValue(column2Data); destSheet.getRange(5,2).setValue(column4Data); destSheet.getRange(12,2).setValue(column5Data); } else if (destSheet === docSheet) { destSheet.getRange(3,2).setValue(column1Data); destSheet.getRange(3,5).setValue(column2Data); destSheet.getRange(5,3).setValue(column4Data); destSheet.getRange(30,2).setValue(column5Data); } else if (destSheet === medSheet) { destSheet.getRange(3,2).setValue(column1Data); destSheet.getRange(3,5).setValue(column2Data); destSheet.getRange(5,2).setValue(column4Data); destSheet.getRange(13,2).setValue(column4Data); destSheet.getRange(28,2).setValue(column5Data); } // Save the destination sheet as a PDF with a custom name var pdfName = column1Data + '.' + column2Data + '.' + column3Data; // Customize the naming convention var pdf = docurl.getBlobl().setName().getAs('application/pdf'); var fid = ''; var folder = DriveApp.getFolderById(fid); folder.createFile(pdf); } }
问题分析
原代码中PDF生成部分存在多处关键错误:
docurl未定义,缺少生成PDF的核心来源链接getBlobl拼写错误,应为getBlobsetName()未传入文件名参数,无法设置PDF的自定义名称- 未指定仅导出当前填充的目标工作表,默认会导出整个电子表格
- 未处理权限验证逻辑,无法正确获取PDF文件
修正后的完整代码
以下代码修复了PDF生成逻辑,仅导出当前填充的目标工作表,并保存到指定Drive文件夹:
function copyDataAndSaveAsPDF() { // 获取当前电子表格实例 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sourceSheet = ss.getSheetByName('errorsList'); var conductSheet = ss.getSheetByName('conductError'); var docSheet = ss.getSheetByName('docError'); var medSheet = ss.getSheetByName('medError'); var dataRange = sourceSheet.getDataRange(); var data = dataRange.getValues(); // 替换为你的Google Drive目标文件夹ID const FOLDER_ID = "你的文件夹ID"; const folder = DriveApp.getFolderById(FOLDER_ID); for (var i = 1; i < data.length; i++) { var column1Data = data[i][0]; var column2Data = data[i][1]; var column3Data = data[i][2]; var column4Data = data[i][3]; var column5Data = data[i][4]; var destSheet; var type = column3Data; if (type === 'Conduct') { destSheet = conductSheet; } else if (type === 'Documentation') { destSheet = docSheet; } else if (type === 'Medication') { destSheet = medSheet; } // 填充数据到目标工作表(保留原逻辑) if (destSheet === conductSheet) { destSheet.getRange(3,2).setValue(column1Data); destSheet.getRange(3,5).setValue(column2Data); destSheet.getRange(5,2).setValue(column4Data); destSheet.getRange(12,2).setValue(column5Data); } else if (destSheet === docSheet) { destSheet.getRange(3,2).setValue(column1Data); destSheet.getRange(3,5).setValue(column2Data); destSheet.getRange(5,3).setValue(column4Data); destSheet.getRange(30,2).setValue(column5Data); } else if (destSheet === medSheet) { destSheet.getRange(3,2).setValue(column1Data); destSheet.getRange(3,5).setValue(column2Data); destSheet.getRange(5,2).setValue(column4Data); destSheet.getRange(13,2).setValue(column4Data); destSheet.getRange(28,2).setValue(column5Data); } // 生成PDF并保存到Drive if (destSheet) { var pdfName = `${column1Data}.${column2Data}.${column3Data}.pdf`; // 构造PDF导出链接,仅导出当前目标工作表 var sheetId = destSheet.getSheetId(); var url = `https://docs.google.com/spreadsheets/d/${ss.getId()}/export?` + `format=pdf&` + `gid=${sheetId}&` + `portrait=true&` + // 纵向排版,可改为false设为横向 `fitw=true&` + // 适配页面宽度 `sheetnames=false&printtitle=false&pagenumbers=false&` + // 隐藏不必要元素 `gridlines=false&fzr=false`; // 获取PDF文件Blob,携带权限令牌 var options = { headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() } }; var pdfBlob = UrlFetchApp.fetch(url, options).getBlob().setName(pdfName); // 保存到指定Drive文件夹 folder.createFile(pdfBlob); } } }
注意事项
- 替换代码中的
FOLDER_ID为你的Google Drive目标文件夹ID - 首次运行脚本时,需要授权脚本访问Google Drive和电子表格的权限
- 导出PDF的链接参数可根据需求调整(比如修改
portrait为false设置横向排版,gridlines设为true显示网格线等)
内容的提问来源于stack exchange,提问作者Xiael
相关产品推荐
相关产品推荐

