首页 > 解决方案 > 如何使用 Google Apps 脚本以 PDF 格式导出/转换 Google Doc?

问题描述

我正在尝试使用 Google Apps Scripts 从 Google Drive 执行 2 项操作:

  1. 从 Google Doc 模板创建文件并在该文件中插入数据
  2. 将此 Google Doc 文件导出到 Google Drive 中的 PDF 文件(同时)

第 1 步正在工作:Google Docs 文件是正确创建的,其中更新了值。

第 2 步:我有 2 个问题/问题:

  1. 我发现生成 PDF 的代码已用于将所有 Google Docs 文件转换为 PDF 文件,但就我而言,我只需要导出/转换已创建的文件(并非所有文件都已位于文件夹中)。
  2. 尽管第 1 点,脚本正在运行并生成 PDF,但是当我打开 PDF 文件时,其中添加的值已经丢失,我只有模板中存在的标签。

你有什么想法吗?

这是代码:

function replaceTags () {
 // Global vars
  var ui = DocumentApp.getUi ();
  var date = Utilities.formatDate(new Date(), "GMT", "dd-MM-yyyy");
  var folderOutId = 'xxxxxxxxxxxxxxxxxxxx';
  var tplMaintenanceId = 'xxxxxxxxxxxxxxxxxxxx';
  var fileOutName = 'my file name';
  var clientCompany = ui.prompt ('Company Name :');
  
  // Do a copy from template file to a new file inside a specific folder
  targetFolder = DriveApp.getFolderById (folderOutId);
  var documentId = DriveApp.getFileById (tplMaintenanceId). makeCopy (targetFolder). getId ();
      
  // Rename filed copied
  DriveApp.getFileById (documentId) .setName (fileOutName + ' - ' + clientCompany.getResponseText ());
      
  // Add document body inside variable
  var body = DocumentApp.openById (documentId) .getBody ();
    
  // Insert data inside Google Doc document
  body.replaceText ('##DATE##', date);
  body.replaceText ('##CLIENT_COMPANY##', clientCompany.getResponseText ());
  
  gdocToPDF(documentId);
}

function gdocToPDF(fileID) {
  var documentRootfolder = DriveApp.getFolderById("xxxxxxxxxxxxxxxxxxxx") // replace this with the ID of the folder that contains the documents you want to convert
  var pdfFolder = DriveApp.getFolderById("xxxxxxxxxxxxxxxxxxxx"); // replace this with the ID of the folder that the PDFs should be put in. 
  
  var docFile = DriveApp.getFileById(fileID)
  
  createPDF(docFile.getId(), pdfFolder.getId(), function (fileID, folderID) {
    if (fileID) createPDFfile(fileID, folderID);
  }
 )
}

function createPDF(fileID, folderID, callback) {
    var templateFile = DriveApp.getFileById(fileID);
    var templateName = templateFile.getName();
    
    var existingPDFs = DriveApp.getFolderById(folderID).getFiles();

    //in case no files exist
    if (!existingPDFs.hasNext()) {
        return callback(fileID, folderID);
    }

    for (; existingPDFs.hasNext();) {

        var existingPDFfile = existingPDFs.next();
        var existingPDFfileName = existingPDFfile.getName();
        if (existingPDFfileName == templateName + ".pdf") {
            Logger.log("PDF exists already. No PDF created")
            return callback();
        }
        if (!existingPDFs.hasNext()) {
            Logger.log("PDF is created")
            return callback(fileID, folderID)
        }
    }
}

function createPDFfile(fileID, folderID) {
    var templateFile = DriveApp.getFileById(fileID);
    var folder = DriveApp.getFolderById(folderID);
    var theBlob = templateFile.getBlob().getAs('application/pdf');
    var newPDFFile = folder.createFile(theBlob);

    var fileName = templateFile.getName().replace(".", ""); //otherwise filename will be shortened after full stop    
    newPDFFile.setName(fileName + ".pdf");
}

标签: pdfgoogle-apps-scriptgoogle-docsgoogle-drive-shared-drive

解决方案


我尝试重新创建您的代码,并成功将文档转换为 pdf。

您可以做的是编辑您的 gdocToPDF() 函数以仅接受要转换为 PDF 的文档。请参阅下面的示例代码(可能不是您想要的方式):

将 replaceTags() 函数中使用的文档 ID 传递给 gdocToPDF()

function replaceTags () {
 ....
 .... 
  DocumentApp.openById(documentId).saveAndClose()
  gdocToPDF(documentId);
}

而不是获取驱动器文件夹中的所有文件,而是使用此代码来仅使用带有替换标签的文件

function gdocToPDF(fileID) { 
  var documentRootfolder = DriveApp.getFolderById(folder-id) // replace this with the ID of the folder that contains the documents you want to convert
  var pdfFolder = DriveApp.getFolderById(folder-id); // replace this with the ID of the folder that the PDFs should be put in. 
  
  var docFile = DriveApp.getFileById(fileID)
  
  createPDF(docFile.getId(), pdfFolder.getId(), function (fileID, folderID) {
    if (fileID) createPDFfile(fileID, folderID);
  }
 )
}

这将使 doc 到 pdf 转换为您想要转换的唯一文档。

祝您有美好的一天!


推荐阅读