You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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拼写错误,应为getBlob
  • setName()未传入文件名参数,无法设置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);
    }
  }
}

注意事项

  1. 替换代码中的FOLDER_ID为你的Google Drive目标文件夹ID
  2. 首次运行脚本时,需要授权脚本访问Google Drive和电子表格的权限
  3. 导出PDF的链接参数可根据需求调整(比如修改portrait为false设置横向排版,gridlines设为true显示网格线等)

内容的提问来源于stack exchange,提问作者Xiael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:14:55