如何使用Google Apps脚本导出/转换PDF格式的Google文档?

如何使用Google Apps脚本导出/转换PDF格式的Google文档?,pdf,google-apps-script,google-docs,google-drive-shared-drive,Pdf,Google Apps Script,Google Docs,Google Drive Shared Drive,我正在尝试使用Google应用程序脚本从Google Drive执行两项操作: 从Google文档模板创建文件并在该文件中插入数据 在Google Drive中将此Google文档文件导出为PDF文件(同时) 第1步起作用了:谷歌文档文件被正确创建,其中的值被更新 第二步:我有两个问题: 我发现生成PDF的代码用于将所有Google Docs文件转换为PDF文件,但从我的角度来看,我只需要导出/转换已创建的文件(不是文件夹中的所有文件) 尽管有第1点,脚本仍在运行,并且生成了PDF,但当我打开P

我正在尝试使用Google应用程序脚本从Google Drive执行两项操作:

  • 从Google文档模板创建文件并在该文件中插入数据
  • 在Google Drive中将此Google文档文件导出为PDF文件(同时)
  • 第1步起作用了:谷歌文档文件被正确创建,其中的值被更新

    第二步:我有两个问题:

  • 我发现生成PDF的代码用于将所有Google Docs文件转换为PDF文件,但从我的角度来看,我只需要导出/转换已创建的文件(不是文件夹中的所有文件)
  • 尽管有第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");
    }
    

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

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

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

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

    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);
      }
     )
    }
    
    这将使文档到pdf转换为您想要转换的唯一文档


    祝你有美好的一天

    我有一个奇怪的问题,在生成的PDF文件中,添加的值已经丢失,我只有模板中的标签。你的PDF已经存在了吗?如果已创建PDF文件,则部分代码不允许覆盖该文件。否,PDF不存在。开始时,只有一个空的Google Docs文件模板,里面有一些标记,请参见此处:,然后我启动应用程序脚本代码,其中标记将被值替换,请参见此处:最后,生成了PDF文件,但缺少值,请参见此处:。但我不明白为什么新的谷歌文档文件正确地生成了值和PDF号。我明白了。我已经编辑了我的答案。如果这能解决问题,请告诉我。基本上,我只是确保我们将使用与替换标记相同的文档。好的,我这样做了,但我得到了以下错误:ReferenceError:fileID未定义(ligne 53,fichier“代码”)
    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);
      }
     )
    }